Java基础 01~16 String 总结

String 总结

jvm 五块内存
A. 栈(stack)内存 所有的局部变量 以及方法在运行的时候都会在栈内存中开辟空间
特点:先进后出 压栈与弹栈
B.堆(heap)内存 所有new 的资源 数组 对象都是在存在堆内存中
C.方法区 所有的字节码文件 class文件 以及静态资源都是存在方法区
例如:public static native Thread currentThread();
D.本地方法区 所有使用native 都是存在本地方法区中,就是调用c/c++代码
E. 程序计数器 主要用于控制代码的执行

String 有一个在堆内存的字符常量池 所有字面值存在字符常量池中
局部变量存栈内存中,成员变量存堆内存中,声名局部变量,又称变量的引用,即赋值等号左边,会在栈内存开辟空间生成地址,其地址为变量名
局部变量存在栈中的数据可以共享,用于理解基本数据类型的存储变化

package day20;

public class Test07 {
    public static void main(String[] args) {
        String s1= "abc";
        String s2 = "abc";
        String s3 = "a";
        String s4 = s3+"bc";
        String s5 = "a"+"bc";
        String s6 =new String("abc");
        String s7 = new String("ab");
        System.out.println(s1==s2);//true
        System.out.println(s1==s4);//false
        System.out.println(s1==s5);//true
        System.out.println(s1==s6);//false
        System.out.println(s4==s6);//false
    }
}

String 是引用类型,是一个类,其长度不可变
StringBuilder 长度可变

解释代码运行原理

String s1= “abc”; 在堆内存中的字符常量池中查找是否有"abc",没有,在字符常量池中开辟一个空间存储abc,且生成地址值0x1111,将其赋值给是s1,又称s1指向其地址
String s2 = “abc”;在在堆内存中的字符常量池中查找是否有"abc",有,无需再创建新对象,将其地址值0x1111赋值给s2;即s2指向其地址;
同理,String s3 = “a”; 先再字符常量池查找,没有"a", 注意"a" 不等于"abc",a不等于ab,ab不等于abc,其是单独开辟一个空间存储,开辟空间存储a,将其地址值赋值s3
String s4 = s3+“bc”; s3 是变量,属于变量拼接,底层是用StringBuilder.append()方法,拼接完后再用toString()方法返回一个字符串,其底层过程使用了new String() ,所以会在堆内存开辟新空间来存储abc,并将其地址值赋s3
String s5 = “a”+“bc”; 属于常量拼接,再编译时会先拼接好为abc,然后在字符常量池中查找是否有abc,有则将其地址赋值s5
String s6 =new String(“abc”); 使用了new,先在堆内存开辟一个空间并生成一个地址值0x2222;将其赋值给s6, 然后在字符常量池中查找是否有abc,有则引用,即堆内存空间存储字符串常量池的abc的地址值0x1111
String s7 = new String(“ab”); 使用了new,先在堆内存开辟一个空间并生成一个地址值0x3333;将其赋值给s7, 然后在字符常量池中查找是否有ab,没有则在字符常量池创建ab,生成地址值0x4444,然后堆内存空间存储0x4444,即引用
以上 String s1= “abc”;创建了一个对象 String s2 = “abc” 未创建对象
String s6 =new String(“abc”);创建一个对象, String s7 = new String(“ab”); 创建了两个对象
== 在这里比较的是地址值

        String a;
        String a1 ="";
        String a2 = null;
        System.out.println(a1==a2);//false
        System.out.println(a1.equals(a2));//false
        System.out.println(a2==a1);
        //a2.equals() 空指针异常 a2 可用 ==
        //a.equals() a== 编译报错

String a; 是在栈内存开辟一个空间,在堆内存未开辟空间,只是声名变量,未赋值,在Java中默认在使用一个变量的时候必须赋予它初值(降低风险),如果未赋值,调用就会报错,语法设置问题
String a2 = null ,在栈内存开辟一个空间,在堆内存开辟一个空间,但a2 未指向堆内存空间的地址,称此时堆内存空间为null内存,这个堆内存空间会被回收
只有a2指向了具体堆内存地址,才算实例化(初始化),所以String a2=null;未实例化
String a1 = “”; 实例化了,在栈内存开辟一个空间,在堆内存开辟一个空间并生成地址值0x1111,堆内存空间不存值,但此空间不会被回收,将地址值赋值给a1;
a2.equals() 空指针异常 a2 可用 ==
a.equals() a== 编译报错
一般 只声名变量未赋值,其实有默认值的,所以有时声名变量会认为等于null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值