String底层原理

目录

1.String概述 

1、String描述:

2、String类的特点详解:

3、字符串对象存在哪里?

4、String是什么,可以做什么:

5、String是不可变字符串的原因:

2、String类创建对象的2种方式:

1、直接使用"  "定义。(推荐使用)   

2、通过String类的构造器创建对象

3、构造器创建字符串和"  "创建字符串区别(面试常考):

 4、字符串对象的特点有那些:

3、String类的常见面试题

1.String概述 

1、String描述:

1、java.lang.String类代表字符串,String类定义的变量可以用于指向字符串对象,然后操作该字符串。

2、java程序中所有的字符文字(列如:"abc")都为此类对象。

        String name="小黑";
        String schoolName="黑马";

2、String类的特点详解:

1、String其实常被称为不可变字符串类型,它的对象在创建后不能被更改。

3、字符串对象存在哪里?

1、以""方式给出字符串对象,在字符串常量池中存储。

        String name="传智";
        name +="教育";
        name +="中心";
        System.out.println(name);          //传智教育中心

4、String是什么,可以做什么:

  • 字符串类型,可以定义字符串变量指向字符串对象。

5、String是不可变字符串的原因:

  • String变量每次的修改其实都是在产生并指向了新的字符串对象。
  • 原来的字符串对象都是没有改变的,所以称不可变字符串。

2、String类创建对象的2种方式:

1、直接使用"  "定义。(推荐使用)   

String name = "传智教育";

2、通过String类的构造器创建对象

               构造器:                                  说明:

public String()                                         创建一个空白字符串对象,不含任何内容。

public String(String original)                   创建传入的字符串内容,来创建字符串对象。

public String(char[ ] chs)                        根据字符数组的内容,来创建字符串对象。

public String(byte[ ] chs)                         根据字节数组的内容,来创建字符串对象。

        //方式一:直接使用双引号得到字符串对象:
        String name = "我爱你中国";
        System.out.println(name);            //我爱你中国
        //方式二:
        //1.public String():创建一个空白字符串对象,不含任何内容(几乎不用)
        String s1 = new String();           //s1="";
        System.out.println(s1);             //输出啥都没有
        //2.public String(String):根据传入的字符串内容,来创建字符串对象(几乎不用)
        String s2 = new String("我是中国人");
        System.out.println(s2);             //我是中国人
        //3.public String(char[] c):根据字符数组的内容,来创建字符串对象
        char[] chars = {'a', 'b', '中', '国'};
        String s3 = new String(chars);
        System.out.println(s3);             //ab中国
        //4、public String(byte[] b):根据字节数组的内容,来创建字符串对象
        byte[] bytes = {97, 98, 99, 65, 66, 67};
        String s4 = new String(bytes);
        System.out.println(s4);             //abcABC

3、构造器创建字符串和"  "创建字符串区别(面试常考):

  • 以" "方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
  • 通过构造器new对象,每new一次都会产生一个新对象,放在堆内存中。
        String s1="abc";
        String s2="abc";
        System.out.println(s1==s2);       //true
        char[] chs={'a','b','c'};
        String s3 = new String(chs);
        String s4=new String(chs);
        System.out.println(s3==s4);       //false

 

 4、字符串对象的特点有那些:

  • 双引号创建的字符串对象,在字符串常量池中存储同一个。
  • 通过new构造器创建字符串对象,在堆内存中分开存储。

3、String类的常见面试题:

1、String常见面试题:

问题:下列代码运行的结果是?

public class Test1 {
    public static void main(String[] args) {
        //创建两个对象,先创建常量池里的abc,再创建堆内存中的abc,指向堆内存的abc
        String s2=new String("abc"); 
        String s1="abc";               //不创建对象,指向的是s2创建常量池中的abc
        System.out.println(s1==s2);    //flase  地址不一致
    }
}

public class Test2 {
    public static void main(String[] args) {
        String s1 = "abc";        //在常量池中创建abc
        String s2 = "ab";         //在常量池中创建ab
        String s3 = s2 + "c";     //在堆内存中链接abc
        System.out.println(s1 == s3); //flase  地址不一致,s3地址是堆内存,s1常量池
    }
}
public class Test3 {
    public static void main(String[] args) {
        String s1 = "abc";      //在常量池中创建abc
//Java存在编译优化机制,程序在编译时:"a"+"b"+"c"会直接转成abc
        String s2 = "a" + "b" + "c";  
        System.out.println(s1 == s2);  //true
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值