三.String类学习
1.String,StringBuffer,StringBuilder的区别?
①不可变性
String是不可变的,value为final且指向字面量,无修改方法 StringBuffer和StringBuilder是可变的,value直接保存在堆中,有修改方法
②线程安全
String,StringBuffer线程安全,StringBuffer解决线程安全 StringBuilder线程不安全,StringBuilder只是建立可变字符串
③使用流程
String 少量改变可以用(重新生成字面量并放入常量池) StringBuilder单线程多次改变(线程不安全,但是改变字符串在堆中数组中改变) StringBuffer多线程多次改变(线程安全,而且改变字符串在堆中数组中改变)
④String为什么不变呢?
final修饰的value数组引用为final类型(只是数组地址不变,数组内容仍然可变) private修饰value数组外部无法直接访问,String类未提供修改数组元素的方法。 而StringBuffer和StringBuilder都提供对value数组操作的方法
2.字符串拼接用加号的原理 ?
①str1 = str2 + str3(都为变量)
实际上 str1 = (new StringBuilder()).append(str1).append(str2).toString 实际上 新建了StringBuilder对象并转换为String对象
②str3 = str2.concat()
实际上,产生了新的String对象,并将字符串通过新建数组的形式凭借,将数组作为new String的参数获得新的String对象 即str2.concat()新建String对象,然后将 注意:除非String直接赋值给字符串,否则调用函数都是生成String类的对象。 代码
package stringtest ; public class StrinParaTest { public static void main ( String [ ] args) { char [ ] a = new char [ ] { 'a' , 'b' , 'c' } ; String b = new String ( a) ; System . out. println ( b) ; String d1 = b. concat ( "d" ) ; System . out. println ( d1) ; String s = a. toString ( ) ; System . out. println ( s) ; }
}
③使用
多次拼接用StringBuilder,因为用String也会产生很多的StringBuilder对象,而直接用StringBuilder只用产生一个
3.字符串常量池如何理解?
①方法区中有专门存放字符串的常量池
②String a = “abc”
在常量池中生成了abc字符串,然后引用变量a直接赋值为常量池中的地址
②String b = new String(“abc”)
若常量池已有abc,在堆中生成String对象,然后value指向常量池 若常量池没有abc,则先在常量池生成abc,再最后用value指向常量池
4.String的intern方法理解?
①String a = “a” + “b”
②String b = “a” + a
生成StringBuilder对象后生成String对象,value指向常量池
③String c = (“abc” + a).intern()
此时c由value指向常量池直接转化c直接指向常量池
④代码解析
package stringtest ; public class StringDiffTest { public static void main ( String [ ] args) { String a = "a" + "b" ; String temp = "b" ; String b = "a" + temp; String c = ( "a" + temp) . intern ( ) ; System . out. println ( a== b) ; System . out. println ( b== c) ; System . out. println ( a== c) ; }
}
5.String的equals方法和compareTo方法的使用?
①String的equals方法重写
②String的compareTo方法
实现Comparable接口 重写CompareTo方法
6.String常用方法?
①字符串是否回文
String转换为char类型数组循环 StringBuilder和StringBuffer通过reverse + toString + equals来实现 注意:因为StringBuilder和StringBuffer并未重写equals,故需要先转化
②字符串大写小写
String类型的 toUpperCase toLowerCase
③比较字符串
compareTo 和 compareToIgnore
④String ->char
char[] chars = str.tocharArray(); String str = new String(chars);
⑤String->byte
byte[] bytes = str.getBytes() String str = new String(bytes)
⑥String->StringBuffer
String s = StringBuffer.toString() String s = StringBuffer + “” StringBuffer s = (new StringBuffer()).append(s)
7.String类和StringBuffer类的常用方法?
①String常用方法
length charAt concat equals getBytes toCharArrays toUpperCase toLowerCase
②StringBuffer常用方法
增 append insert 删 delete 改 replace reverse 查 substring
③示例代码
package stringtest ; public class StringTest { public static void main ( String [ ] args) { String a = "abcba" ; char [ ] chars = a. toCharArray ( ) ; int t = 0 ; for ( int i = 0 ; i< a. length ( ) / 2 ; i++ ) { if ( chars[ i] == chars[ a. length ( ) - i- 1 ] ) { t++ ; } } if ( t== a. length ( ) / 2 ) { System . out. println ( "是回文" ) ; } StringBuilder stringBuilder = ( new StringBuilder ( ) ) . append ( a) ; String s = stringBuilder. reverse ( ) . toString ( ) ; System . out. println ( "回文数:" + ( s. equals ( a) ) ) ; String p = "likejin" ; System . out. println ( p. length ( ) ) ; System . out. println ( p. equals ( p) ) ; System . out. println ( p. toString ( ) ) ; System . out. println ( p. compareTo ( p) ) ; byte [ ] bytes = p. getBytes ( ) ; String q = new String ( bytes) ; char [ ] chars1 = p. toCharArray ( ) ; String m = new String ( chars) ; String s1 = new StringBuilder ( ) . append ( p) . toString ( ) ; String n = s1. toString ( ) ; StringBuilder a1 = new StringBuilder ( "likejin" ) ; a1. append ( "like" ) ; a1. insert ( 11 , "changyu" ) ; a1. delete ( 0 , 2 ) ; a1. replace ( 9 , 14 , "" ) ; a1. substring ( 0 ) ; System . out. println ( a1) ; }
}
未更新
未更新