欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-29 16:05:27
...

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方法进行了重写的话,比较的是所指向的对象的内容。