您的位置:首页 > 编程语言 > Java开发

JAVA常见基础题(持续整理)

2017-10-11 10:25 337 查看
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抽象类与接口的区别
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: