1、+拼接字符串其实是一种语法糖,底层是用StringBuilder将各个字符串append起来。
2、String设计成不可变对象的原因:为了字符串池的实现(同个字符串被多次引用,若字符串对象可变,其中一个引用操作字符串变化则其他对该字符串的引用全部受到影响)、线程安全性(不可变对象天生线程安全)、安全性(字符串广泛存储用户名密码等敏感信息,为了保护程序安全需要字符串不可变)、hashcode缓存(不可变性保证了字符串的值不变,因此hashcode方法在String类中被重写,以方便缓存,这样在第一次hashcode方法调用期间计算和缓存hash值,并从那时起返回相同的值)、性能(使用字符串池以节省堆内存)
3、subString方法在JDK6和JDK7中的不同:JDK6中String类包含三个成员变量:char value[]、int offset和int count,subString的实现是靠操作字符数组的下标实现的,调用subString方法会创建一个新的String对象,但这个String的值仍然指向堆中的同个字符数组,这两个对象只有count和offset是不同的。当适用subString方法切割一段很长的字符串而你只需要很短的一段,那么肯呢个导致内存泄露,因为只是需要一小段字符串序列但却引用了整个字符串(字符数组),就会导致这个很长的字符串一直被引用无法回收,进而导致内存泄露。而在JDK7中subString方法会在堆内存创建一个新的数组以避免对老字符串的引用从而解决了内存泄露的问题。
4、Switch语句对String的支持:Java7中switch语句添加了对String的支持,底层是通过String的hashcode与equals匹配的。实际上switch语句仅支持匹配整形类型(byte、short、int),对于char类型匹配的是该字符对应的ASCII码,对于String匹配的是该字符串的hashcode,找到对应的hashcode的case,判断该字符串的内容是否equals(case中字符串的内容),两者都匹配后继续case内的执行。
5、字符串常量池的内容一部分来自于编译器可知的字面量,也就是Class文件中可见的常量(字段名方法名类的全限定名等以及''''引入的字符串),字面量存在于Class的常量池,里面的字面量会在该字符串第一次被调用的时候加入到字符串池中。
6、String类的intern方法会判断该字符串是否已经在字符串池中,如果已经存在则返回其在字符串池中的引用,如果不存在则将该字符串的引用加入到字符串池并返回该引用。
7、String的长度限制:在编译期要求字符串长度不能超过65535(这是由于字面量要进入Class常量池,Class常量池要求字符串不能超过65535),运行期不能超过Integer.MAX_VALUE,也就是2^31-1个字符。