1.1 通过直接量构造:
/*通过使用直接量构造String引用*/
String s = "hello!";
String s = "he" + "llo";
1.2 通过构造器构造:
/*通过构造器构造String引用*/
String s = new String("hello!");
1.3 通过+号运算符构造:
/*通过+号运算符,构造String引用*/
String s1 = "he";
String s2 = s1 + "llo!";
Ps:
常量池:Jvm会将字符串直接量放入常量池,如果String引用指向的直接量在编译期间能够确定(包括直接量和通过+号运算符链接的直接量),那么引用就会直接指向常量池中的字符串内存!(这样保证不出现重复的直接量字符串重复占用内存)
+号运算符:+号运算符其实是一种编译期间的语法糖,链接两个直接量的+号运算符会被优化成为一个直接量;链接变量的+号运算符会被优化成StringBuilder.append()方法,最后再通过toString()方法转换为String类型!
不建议在循环和条件分支中使用+号运算符拼接字符串:因为在每次拼接的过程都是StringBuilder.append.toString的过程,这样在多层循环中不停的把String转换为StringBuilder,再把StringBuilder转换为String,会产生大量临时变量,对内存是种负重,建议统一是StringBuilder进行append,最后在循环外面toString!
2.1 构造器:
可以将byte[]、char[]、String、StringBuilder、int[]转换为String类型!
2.2 valueOf()静态方法:
String类提供一组valueOf()的静态方法,用于将基本类型和引用类型转换为String类型(通过String的构造器和引用类型的toString()方法)
2.3 字符串基本操作:
/*静态方法的构造器*/
public static String copyValueOf(char data[])
public static String copyValueOf(char data[], int offset, int count)
/*字符串拼接*/
public String concat(String str)
/*字符串替换*/
public String replace(char oldChar, char newChar)
public String replace(CharSequence target, CharSequence replacement)
public String replaceAll(String regex, String replacement)
public String replaceFirst(String regex, String replacement)
/*字符串分隔为字符串数组*/
public String[] split(String regex)
public String[] split(String regex, int limit)
/*字符串切割*/
public String substring(int beginIndex)
public String substring(int beginIndex, int endIndex)
/*大写转小写*/
public String toLowerCase()
public String toLowerCase(Locale locale)
/*小写转大写*/
public String toUpperCase()
public String toUpperCase(Locale locale)
/*字符串格式化*/
public static String format(Locale l, String format, Object... args)
public static String format(String format, Object... args)
/*删除字符串头尾的空格*/
public String trim()
/*判断当前String引用的字符串是否在常量池中,
如果在,返回指向常量池的引用
如果不在,在常量池中创建一个直接量,并返回它的引用*/
public native String intern()
/*在elements数组或者集合每个元素之间插入delimiter字符串*/
public static String join(CharSequence delimiter, CharSequence... elements)
public static String join(CharSequence delimiter, Iterable extends CharSequence> elements)
Ps:由于String是不可变类型,基本操作中返回的字符串,都不是基于原数据进行修改的,而是创建的新字符串!
2.3 字符串基本信息获取:
/*获取String串中,Unicode代码点*/
public int codePointAt(int index)
public int codePointBefore(int index)
public int codePointCount(int beginIndex, int endIndex)
public int offsetByCodePoints(int index, int codePointOffset)
/*比较两个字符串的字典序是否相等,相等返回0,不相等返回差值*/
public int compareTo(String anotherString)
/*比较两个字符串的字典序是否相等,忽略大小写,相等返回0,不相等返回差值*/
public int compareToIgnoreCase(String str)
/*比较两个字符串,忽略大小写*/
public boolean equalsIgnoreCase(String anotherString)
/*CharSequence类与String串比较*/
public boolean contentEquals(CharSequence cs)
/*StringBuffer类与String串比较*/
public boolean contentEquals(StringBuffer sb)
/*判断s是否是当前String的子串*/
public boolean contains(CharSequence s)
/*将String串转换为byte[]字节数组*/
public byte[] getBytes()
public byte[] getBytes(Charset charset)
public byte[] getBytes(String charsetName)
/*将String串转换为char[]字符数组*/
public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin)
public char[] toCharArray()
/*获取字符串长度*/
public int length()
/*判断当前字符串是否为空串*/
public boolean isEmpty()
/*判断当前字符串是否满足给定正则表达式*/
public boolean matches(String regex)
/*判断两个字符串在指定区域是否相等*/
public boolean regionMatches(boolean ignoreCase, int toffset,
String other, int ooffset, int len)
public boolean regionMatches(int toffset, String other, int ooffset,
int len)
/*判断字符串是否是以指定前缀开头,或者指定后缀结尾*/
public boolean startsWith(String prefix)
public boolean startsWith(String prefix, int toffset)
public boolean endsWith(String suffix)
indexOf()系列方法:获取子串出现的第一个位置
lastIndexOf系列方法:获取子串出现的最后一个位置
3.1 String与byte[]之间相互转换:
String的本质是一个不可变的char[]字符数组!Java的String默认使用Unicode编码(UTF-16),由一个或者多个char组成!所以在byte[]字节数组转换为String的时候,实际是将byte[]根据特定的编码格式转换为UTF-16编码格式的char[];String转换byte[]字节数组的时候,实际是将UTF-16编码格式的char[]转换为特定编码的byte[]!
/*byte[]数组转String*/
public String(byte bytes[], Charset charset)
public String(byte bytes[], int offset, int length, Charset charset)
/*String转byte[]数组*/
public byte[] getBytes(Charset charset)
Ps:上面的方法中都需要指示byte[]数组的编码方式,用于确定byte[]与char[]之前的转换规则!在不指定编码方式的时候使用平台默认字符集,如果未设置平台默认字符集,则为"ISO-8859-1"!
3.2 直接量与String的转换:
直接量以特定的编码格式写入文件,Javac编译器再通过对应的文件编码格式将直接量转为UTF-8格式,并存入class文件中,Jvm读取UTF-8格式的直接量转为UTF-16格式存入String内存中!
由于String是一个不可变的字符串,为了弥补这个不足,JDK提供了两个可变的字符串类,StringBuilder和StringBuffer!
4.1 StringBuilder和StringBuffer类提供的能力:
/*在字符串尾部增加成员*/
public StringBuilder append()
/*删除字符串中的成员*/
public StringBuilder delete(int start, int end)
public StringBuilder deleteCharAt(int index)
/*替换字符串中的成员*/
public StringBuilder replace(int start, int end, String str)
/*在字符串中插入成员*/
public StringBuilder insert(int offset, int i)
/*获取第一个子串的位置*/
public int indexOf(String str)
/*获取最后一个子串的位置*/
public int lastIndexOf(String str)
/*字符串翻转*/
public StringBuilder reverse()
/*StringBuilder/StringBuffer转String类型*/
public String toString()
4.1 StringBuilder和StringBuffer类两者的区别:
StringBuffer类是线程安全类、StringBuilder类是线程不安全类;所以在单线程中StringBuilder的效率高于StringBuffer!
常用的容器包括String类型、基本类型、集合、数组之间的转换
5.1 String与基本类型之间的转换:
/*基本类型转String类型*/
/*String类的静态方法*/
public static String valueOf(int i)
/*Integer、Boolean、Character、Byte类的静态方法*/
public static String toString(int i)
/*String类型转基本类型*/
/*Integer、Boolean、Character、Byte类的静态方法*/
public static int parseInt(String s)
public static Integer valueOf(String s)
Ps:将String转换到基本类型的时候,注意区分使用parseInt和valueOf,正确使用可以减少包装类的拆包和组包!
5.2 集合与数组之间的转换:
/*集合转数组*/
/*Collection接口中toArray成员方法*/
Object[] toArray()
T[] toArray(T[] a)
/*数组转集合List*/
/*Arrays类中静态方法*/
public static List asList(T... a)
Ps:
5.3 String与数组之间的转换:
/*String转char[]数组*/
/*String类的成员方法*/
public char[] toCharArray()
/*数组转String*/
/*Arrays类的静态方法,但是这个String带'['和']'*/
public static String toString(int[] a)
/*String类的构造器,将int[]、byte[]、char[]转换为String*/
public String(char value[])
Ps:
5.4 String与集合之间的转换:
/*集合转String*/
/*String类中的静态方法join,可以将一个Iterable extends CharSequence>集合容器转为String字符串*/
public static String join(CharSequence delimiter, Iterable extends CharSequence> elements)
Ps: