1. 画出如下几行代码的内容结构:
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
s1 += "world";
2.如何理解String类的不可变性
String 指向常量池的数据,不能做任何的修改,如果需要修改必须新造一个数据,用来存储新的内容
3.String类是否可以被继承?为什么?
String s = new String("hello");在内存中创建了几个对象?请说明
String不可以被继承
两个 一个是String s在堆里创建的对象,然后堆里的value会指到在常量池里创建的hello
4.String,StringBuffer,StringBuilder 三者的对比
String是不可变字符串
StringBuffer是线程安全的可变字符串
Stringbuilder是线程不安全的可变字符串
StringBuilder效率最高,其次是StringBuffer,String效率最低
开发中不涉及到多线程或涉及到多线程但不是共享数据时使用Stringbuilder,涉及到多线程且有共享数据时,因为有安全问题,需要使用StringBuffer
三者底层在jdk9之前都是用char型数据进行存储,在jdk9后用byte型数组进行存储,但String底层的数组是final的,StringBuffer和StringBuilder不是finla的
String每次赋值底层会new一个新的对象,StringBuffer和StringBuilder底层默认存储的数组长度为16,当创建的数组长度超出16时,底层会以2倍+2的方式新建数组,对内存消耗低,效率比String高
5.String的常用方法有哪些?(至少7个)
length() / charAt() / eqlaus() / compareTo() / startsWith() / endsWith()
containts() / indexOf() / lastIndexOf / getBytes() / toCharArray() /
valueOf() / ...
内存解析