java String类原理浅析

来源:互联网 发布:数据库中的索引是什么 编辑:程序博客网 时间:2024/05/17 22:58

/*
2017/10/19 理科南 记
*/

一.String类

    String 表示一个字符串,内部使用字符数组实现,该类不可变

二.存储

上图为下列语句执行的内存存储过程:
String S1 = “粪粪”;
String S2 = new String(“粪粪”);
String S3 = “粪粪”;

三.String实例(注释很详细):

public class StringDemo {    public static void main(String[] args) {        //String 的两种赋值方式的分析,推荐第一种        //1.直接赋值        String S1 = "粪粪";        //2.使用new关键字创建对象 new :表示在堆中申请内存空间,强制型的一个操作        //面试题:下面语句创建了几个对象?  --->1个        String S2 = new String("粪粪");        System.out.println(S1==S2);//比较指向的地址,返回false        //String 类在运行期和编译期的分析        String S3 = "粪粪"; //常量池已有"粪粪",所以不会再创建对象,直接指向,省了内存空间        System.out.println(S1==S3); //在常量池中找,所以会返回true        System.out.println("-----------我是可爱的分割线---------");        //4种情况分析:直接赋值,字符串连接时,分析编译器和运行期        //如果在编译期值可以被确定,那就使用已有的对象,否则会创建新的对象        String a = "a";//编译时可以确定,所以直接把变量a替换成"a"        String a1 = a+1;//编译时语句是一句一句来的,会把a当成是变量,不可以确定,变量在运行的时候才有值,上一句跑了,a才有值,然后a1才会为"a1",        //所以这句话会在堆中创建一个a1对象        String a2 = "a1";//这句则在常量池中创建一个"a1",因此a1==a2 :false        System.out.println(a1==a2);        final String b="b";        String b1=b+"1"; //编译期b到这里已替换,1加不加双引号无所谓,final才可以,没有final就还是变量        String b2 = "b1";        System.out.println(b1==b2);//true        String c = getC();  //注意,方法只有在运行期才能得到结果        String c1 = c+1;        String c2 = "c1";        System.out.println(c1==c2);  //false        final String d = getD();        String d1 = d+1;        String d2 = "d1";        System.out.println(d1==d2);//还是false,因为虽然d是final,但方法只有在运行时才有返回结果,因此一样是false    }    private static String getC(){        return "c";    }    private static String getD(){        return "d";    }}

输出:
false
true
———–我是可爱的分割线———
false
true
false
false

原创粉丝点击