String对象

一、String类介绍:
String是一个引用数据类型默认为null;
String 为final类型不可更改,不能被继承;
基本类型与String结合都会转换为String类型;

二、String两种赋值方式:
1)直接赋值:String str = " ";

String str = “” 原理:
在 JVM(虚拟机)中有一个字符串池,专门用来存储字符串。如果遇到 String a=”hello”时(注意没有 NEW,不是创建新串),系统在字符串池中寻找是否有 ”hello”,
此时字符串池中没有”hello”,那么系统将此字符串存到字符串池中,然后将 ”hello”在字符串池中的地址返回 a。
如果系统再遇到String b=”hello”,此时系统可以在字符串池中找到 “hello”。则会把地址返回b,此时 a与b 为相同。

2)使用new进行赋值:String str = new String (" ");

在这里插入图片描述

  1. 两种赋值方式的区别:
    1、直接定义的String "a"是储存在常量存储区中的字符串常量池中;new String(“a”)是存储在堆中;
    2、常量池中相同的字符串只有一个,但是new String(),每new一个对象就会在堆中新建一个对象;
    3、String a = “a”在编译阶段就会在内存中创建;String a = new String(“a”);是在运行时才会在堆中创建对象;

     String a = "hello";
     String b = "hello";
     System.out.println(a == b );//true  a b 指向同一个值,地址相同
     System.out.println(a.equals(b));//true a b 是同一个值,当然相等
    
     String a1 = new String ("hello");
     String b1 = new String ("hello");
     System.out.println(a1 == b1 );//false  每次new都会创建一个新对象,a1 b1 地址不同 
     System.out.println(a1 .equals(b1) );//true 
    

由此可以得出两种实例化方式的区别

1)直接赋值(String str = “hello”):只开辟一块堆内存空间,并且会自动入池,不会产生垃圾。

2)构造方法(String str= new String(“hello”);):会开辟两块堆内存空间,其中一块堆内存会变成垃圾被系统回收

在开发的过程中不会采用构造方法进行字符串的实例化。
4)常量池
字符串常量池在jdk1.6及之前在方法区中,但是在jdk1.7及以后就放在了堆中

编译阶段确定的字符串才会被放到字符串常量池中

分析下面创建几个对象:

            String s1 = "java"; 
	String s2 = "从0到1"; 
	String s3 = "java从0到1"; 
	String s4 = s1+s2;
	System.out.println(s3==s4);

s1和s2还有s4都会在字符串常量池中,这已经有三个对象了 。关键在于这行代码上String s3 = s1 + s2;

对于s3无法在编译阶段确定下来,所以无论最后的字符串是什么都不会存在字符串常量池中,那么存在哪呢?因为对象创建在堆中,而字符串常量池也在堆中,既然不在字符串常量池中那就是在字符串常量池之外的堆中了,而s3最终的字符串对象是“Java从0到1”,那么也就是说这个字符串在常量池之外的堆中,这是一个对象了,加上之前的三个,这里一共四个了,但是我们还要分析这个s3是怎么来的,是通过s1和s2相加得到的,因为这个s3最终是在常量池之外的堆中形成的,而s1和s2都是在常量池中,因此会将s1和s2拷贝一份到字符串常量池之外的堆中来形成s3,我们看下面的一张图来加深理解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值