java【String】创建对象面试题,StringBuilder,StringBuffer 和 String对比

【String】创建对象面试题

StringBuilder,StringBuffer 和 String对比

String类有两种创建对象的方式

方式一:直接赋值

String s = "hello";

方式二:通过调用构造器

String s = new String("hello");

[面试题1] 两种创建对象方式的区别

方式一:先去常量池查看是否有hello字符序列,如果没用,则创建,如果有则直接引用该地址。
s指向的是常量池的对象

方式二:需要在堆中创建对象,该对象维护了一个value属性,value指向常量池的hello序列,如果常量池中没有hello则创建,再指向,如果有了,直接用value指向。
s 指向的是堆中的对象

在这里插入图片描述

[面试题案例1]

String a = "abc";
String b = "abc";
System.out.println(a.equals(b));
System.out.println(a==b);

这个时候,两个结果其实都为true,第一个equals比较的是值,所以为true。
第二个指向的都是指向常量池中,同一片地址,所以也为true。
在这里插入图片描述

[面试题案例2]

String a= new String("abc");
String b = new String("abc");
System.out.println(a.equals(b));
System.out.println(a==b);

第一个结果为true,第二个为false,因为第一个equals比较的是值所以未true。
第二个比较的是地址,但是是通过new关键字创建的对象,所以a和b中保存的是堆中对象的引用地址,而对象的引用地址中的属性指向的才是同一片常量池地址。
在这里插入图片描述

上面我们了解了String类,知道了它是怎么保存字符串的,现在我们来看下String和StringBuffer的对比!

String & StringBuffer

相同点:都用于保存字符串,都可以对字符串进行一些增删或其它处理的操作
不同点:

  • String类用于保存字符串常量,修改字符串的时候,要是不存在是会在常量池创建一个对象,如果存在则引用常量池中的常量。
  • StringBuffer类用于保存字符串变量,修改字符串的时候,改的是值

StringBuilder 和 StringBuffer的区别

StringBuilder和StringBuffer非常类似,而且方法一样,那么他们有上面区别呢?

							共同点 			版本 			线程安全  		效率
StringBuffer(jdk1.0)	保存可变字符串		老				安全			低

StringBuilder(jdk1.5)	保存可变字符串		新				不安全			高	

三者效率对比

String < StringBuffer < StringBuilder

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章