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

来源:互联网 发布:药店服务论文数据分析 编辑:程序博客网 时间:2024/06/15 16:38

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抽象类与接口的区别

原创粉丝点击