Java基础知识(五)-String相关、jdk8接口新特性等

yuanxl 1年前 ⋅ 438 阅读

问题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

全部评论: 0

    我有话说: