java 字符串String中new String("abc")和"abc"的创建过程和区别

Java中,String str = new String(“abc”)时,会在虚拟机栈中创建String类型的字符串对象的引用str;然后在中创建“abc”的String对象;最后str指向中的“abc”对象。

class文件中,如果用到字符串,会先到字符串常量池中找看有没有,如果有,则把引用指向常量池中的字符串对象,如果没有,则在常量池中创建字符串对象;如String str = "abc"时,会先在常量池中查找有没有“abc”的字符串,有的话把“abc”对象的地址赋值给str,没有的话则在常量池中创建。

public class StringTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String a = "opp";
		
		String b = new String("liuyucai");
		
		String c = "opp";
		String d = new String("opp");
		
		System.out.println(b == "liuyucai");  //比较地址    false   
		System.out.println(b.equals("liuyucai"));	//比较值  true
		
		System.out.println(a== c);	//比较地址       true   
		System.out.println(a.equals(c));	//比较值  true
		
		System.out.println(a== d);	//比较地址   false  说明在堆中创建了一个字符串"opp"对象, 即使常量池中有了字符串对象,但是new时仍在堆中创建
		System.out.println(a.equals(d));	//比较值   true
		
		System.out.println(a== "opp");      //true  说明此时得“opp”从常量池中获取
		System.out.println(a.equals("opp"));//true
		
		System.out.println(a=="abc");       //false
		String k = "abc";					
		System.out.println(k == "abc");     //true   说明 a==“abc”时在常量吃中创建了"abc"对象,String k = "abc",时,k指向常量池得对象
				
	}

}

"=="和equal的区别

在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。但是String类中重写了该方法,只比较值

  1. 对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址
  2. 对于equals方法,注意:equals方法不能作用于基本数据类型的变量如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值