问题1: String str = new String("xdclass.net"); 创建了几个对象?
答案:
创建一个对象:常量池存在,则直接new一个对象;
创建两个对象:常量池不存在,则在常量池创建一个对象,也在堆里面创建一个对象
问题2: 下面是比较什么?输出结果是什么?为什么是这样的结果
String str1= new String("xdclass.net");
String str2= "xdclass.net";
String str3= "xdclass.net";
System.out.println(str1 == str2) //false
System.out.println(str2 == str3) //true
答案:
比较引用的内存地址是否一样
第一个是false: new 创建新的对象会开辟新的空间,所以地址不一样
第二个是true:都是从常量池里面获取,"xdclass.net" 存在于常量池中
问题3:String、StringBuffer与StringBuilder的区别?分别在哪些场景下使用
三者都是final, 不允许被继承
在本质都是char[]字符数组实现
String、StringBuffer与StringBuilder中,String是不可变对象,另外两个是可变的
StringBuilder 效率更快,因为它不需要加锁,不具备多线程安全
StringBuffer里面操作方法用synchronized ,效率相对更低,是线程安全的;
使用场景:
操作少量的数据用String,但是常改变内容且操作数据多情况下最好不要用 String ,因为每次生成中间对象性能会降低
单线程下操作大量的字符串用StringBuilder,虽然线程不安全但是不影响
多线程下操作大量的字符串,且需要保证线程安全 则用StringBuffer