1、String类的特性
String类 是final修饰的,不可以被继承。
String类的底层是基于char数组的。
安全性:
对象都是只读的,所以多线程并发访问也不会有任何问题。
由于不可变,用来存储数据也是极为安全的。
2、String和new String();的区别
例如 : String str1= “abc” 和 String str2 = new String("abc")的区别
解答 : 先理解一句话,再看下面的解析:相等的字符串 在常量池中只有一份,在堆中有多份
String str1= “abc”; 在编译期,JVM会去常量池来查找是否存在“abc”,如果不存在,就在常量池中开辟一个空间来存储“abc”;如果存在,就不用新开辟空间。然后在栈内存中开辟一个名字为str1的空间,来存储“abc”在常量池中的地址值。
String str2 = new String("abc") ;在编译期,JVM先去常量池中查找是否存在“abc”,如果不存在,则在常量池中开辟一个空间存储“abc”。在运行时期,通过String类的构造器在堆内存中new了一个空间,然后将String池中的“abc”复制一份存放到该堆空间中,在栈中开辟名字为str2的空间,存放堆中new出来的这个String对象的地址值。
也就是说,前者在初始化的时候可能创建了一个对象,也可能一个对象也没有创建;后者因为new关键字,至少在内存中创建了一个对象,也有可能是两个对象。
3、new String(); 创建了几个对象
解答: 两个
首先String str是定义了一个字符串变量,并未产生对象,=不产生对象,那么只有后面的new String("abc")了。把它拆分成"abc"和new String(),首先在字符串常量池去寻找有没有"abc"这个字符串,没有就创建一个“abc”字符串对象在栈中,然后new String把这个字符串对象拷贝一份到堆中,返回这个对象的引用。所以一共产生两个对象
试问str变量存储在堆中还是栈中?关键点是区分str是成员变量还是局部变量,如果是局部变量在方法体内,它就存储在栈中,如果是成员变量那么久跟随成员对象存储在堆中。
4、==与equals()的区别
解答:==比较的是引用类型 比较的是地址值是否相同 equals()比较的是内容(堆中的内容是否相同)
==是一个运算符 equals则是String对象的方法
例如:
String str1 = new String(“abc”) str1 != str2
String str2 = new String("abc")
String str3 = "ABC" str3 = str4
String str4 = "ABC" str3 = str4 = str5
String str5 = "A"+"BC";
5、基本数据类型有哪几种
6、String和StringBuffer的转换
String转StringBuffer: String s = new String("xxx");
StringBuffer sb = new StringBuffer(s);
StringBuffer转String: String str = sb.toString();
7、String 和StringBuffer StringBuilder的区别
区别:
执行速度:StringBulider>StringBuffer>String
StringBulider和StringBuffer是变量(String是常量)
线程安全 :StringBuffer>StringBulider>String
解析:
String中的对象是不可变的,也就可以理解为常量,显然线程安全。
AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。
总结 :
1.如果要操作少量的数据用 =》 String
2.单线程操作字符串缓冲区 下操作大量数据 = 》StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = 》StringBuffer
7、扩展
String的一种方式比StringBuffer快的多
例如:
String s = "hello"+"you"+"hao"这种方式比StringBuffer的append()快的多,这就被jvm解析成StringBuffer对象的拼接
String s = "hello" String s2 = "you" String s3 = "hao" String s4 = s+s2+s3 这种方式比StringBuffer慢的多,这样jvm就规规矩矩的拼接String字符串了
今天大概总结到这里,此文章有参考其他博主的,有自己总结的,如果以后还遇到关于String的问题,再向其中添加
May everyone be happy every day and everything go well!