JavaSE学习笔记(16.Java常用类之String)

1. String的构造方式:

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. String类提供的能力:

2.1 构造器:

可以将byte[]、char[]、String、StringBuilder、int[]转换为String类型!

JavaSE学习笔记(16.Java常用类之String)_第1张图片

2.2 valueOf()静态方法:

String类提供一组valueOf()的静态方法,用于将基本类型和引用类型转换为String类型(通过String的构造器和引用类型的toString()方法)

JavaSE学习笔记(16.Java常用类之String)_第2张图片

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 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()系列方法:获取子串出现的第一个位置

JavaSE学习笔记(16.Java常用类之String)_第3张图片

lastIndexOf系列方法:获取子串出现的最后一个位置

JavaSE学习笔记(16.Java常用类之String)_第4张图片

 

3. String字符编码问题:

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内存中!

 

4.StringBuilder和StringBuffer类:

由于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!

 

5. 常用容器之间的转换:

常用的容器包括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:

  • 数组转集合只能先转换为List类型,再通过List类型转换为其他集合类型!
  • 集合转数组建议使用带参数的toArray方法,因为无参方法返回的Object[]数组类型也很难处理!

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:

  • String转数组,只能转换为char[]字符数组;
  • 数组转String,通过String的构造器生成,只能是int[]、char[]、byte[]类型;
  • Arrays的toString方法是带中括号的且有逗号分隔!

5.4 String与集合之间的转换:

/*集合转String*/
/*String类中的静态方法join,可以将一个Iterable集合容器转为String字符串*/
public static String join(CharSequence delimiter, Iterable elements)

Ps:

  • String类型的集合转String字符串的时候,可以利用String类中的join静态方法!
  • String转集合,除了遍历,只能通过数组作为中间值,进行过渡转换了!

你可能感兴趣的:(Java学习笔记,String,字符集,Unicode)