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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值