1、String、StringBuffer、StringBuilder:
String、StringBuffer和StringBuilder的区别
关于String、StringBuilder以及StringBuffer
StringBuffer:
/*The value is used for character storage. */
char[] value;
public synchronized StringBuffer replace(int start, int end, String str);
public synchronized String substring(int start);
public synchronized StringBuffer insert(int offset, Object obj);
StringBuilder :
/*The value is used for character storage. */
char[] value;
public StringBuilder replace(int start, int end, String str);
public StringBuilder append(Object obj);
public StringBuilder insert(int index, char[] str, int offset,int len)
String:
/** The value is used for character storage. */ private final char value[];
2、intern,str.intern()的作用在常量池查找是否存在内容相同的字符串,存在直接返回地址:
通过反编译深入理解Java String及intern
测试1:
public void runInternTest1(){
String str1 = "string";
String str2 = new String("string");
String str3 = str2.intern();
System.out.println(str1==str2);//#1
System.out.println(str1==str3);//#2
System.out.println(str2==str3);
}
/*jdk7打印结果false,true,false*/
测试2,在jdk7及之后,Hotspot将常量池由永生代移到元空间,
str2.intern()到常量池查找是否存在于str2相同的字符串,存在时直接返回引用
不存在时,不再新建一个字符串,将str2的引用存于常量池中,然后返回该引用
str1会到常量池查找“str01”,返回的是引用
假如不把String ss = “str01”;注释掉将打印false true false,而不是true true true
(注: 将String str2 = new String(“str01”)则使用该法解释不通,仍需要继续研究)
public void runInternTest3(){
// String ss = "str01";
String str2 = new String("str")+new String("01");
String str3 = str2.intern();
String str1 = "str01";
System.out.println(str1==str2);//#7
System.out.println(str1==str3);
System.out.println(str2==str3);
}
/*打印true true true*/
3、String中==、+、static的测试,实质是考察方法编译运行的处理细节:
来源:通过反编译深入理解Java String及intern(反编译代码那部分讲得非常好)
解释:
- str2在编译时直接拼接的字符串;
- str3,因为baseStr是变量,与“01”相加的操作在jvm运行时执行;
- str4,baseFinalStr是常量,不可变,在编译时直接拼接的字符串;
- str5,在常量池存在”baseStr01”,intern后直接返回其引用;
- 关于str3=baseStr + “01”;首先 是生成对象new StringBuilder() ,然后从常量池获得“01”,再调用StringBuilder的append,再调用String的toString方法
public void runInternTest2(){
String baseStr = "baseStr";
final String baseFinalStr = "baseStr";
String str1 = "baseStr01";
String str2 = "baseStr"+"01";
String str3 = baseStr + "01";
String str4 = baseFinalStr+"01";
String str5 = new String("baseStr01").intern();
System.out.println(str1 == str2);//#3
System.out.println(str1 == str3);//#4
System.out.println(str1 == str4);//#5
System.out.println(str1 == str5);//#6
System.out.println(str1 == "baseStr"+"01");//和#3是一样的
System.out.println(str1 == baseStr+"01");//和#4是一样的
/*jdk7运行结果,true false true true true false*/
}
3、public、protected、default、private的范围:
public:包内包外
protected:包内+(包外的继承关系)
default:包内
private:同一类中
4、接口和抽象类:
知乎 接口和抽象类有什么区别?
Java抽象类与接口的区别