一个特殊的类:String

String作为一个特殊的类,介于常量与类对象之间,它的一些属性、方法也有些不同,总结一下吧!


  • 内存:String有两种赋值方法,这两种赋值方法的内存处理也有不同

String str1=new String("123");这种方式,存放在堆内存中;每new 一次,开辟一次内存

String str2="123";存放在字符串常量池中;创建时,先判断内存中是否有字符串,再决定是否开辟内存

        String str1=new String("123");
	String str3=new String("123");
	
	String str2="123";
	String str4="123";
	//==比较的是地址,str1,str3不是同一个地址,但str2,str4是一个地址
	System.out.println(str1==str3);//false
	System.out.println(str2==str4);//true
 String str5=str1;
 String str6=str2;
	
System.out.println(str1==str5);//true,同一对象
System.out.println(str2==str6);//true,同一地址

这又是为什么呢?第二个true毫无疑问,但第一个又作何解释呢?因为,它是一种对象的传递,创建str1后,str1直接把地址给str2了,str2同样指向了str1。这属于类的范畴了,看下面的代码:

Fuxi f1=new Fuxi();
Fuxi f2=f1;                         
System.out.println(f1==f2); //true                                     

System.out.println(f1);//demo.Fuxi@70dea4e
System.out.println(f2); //demo.Fuxi@70dea4e

所以,当有new 的时候,我可以把它当成一个类-对象来看,没有的时候,可以当成一个常量来看。

  • println方法:Strig类覆写了println方法,因此它的输出也有了不同。
String str1=new String("123");
System.out.println(str1);//123
	
Fuxi f1=new Fuxi();
System.out.println(f1);//demo.Fuxi@70dea4e

我们来看看两个方法的源代码:

public void println(String x) {
        synchronized (this) {
            print(x);//输出对象地址中的内容
            newLine();
        }
    }

       public void println(Object x) {
        String s = String.valueOf(x);//把对象地址转换字符串
        synchronized (this) {
            print(s);输出字符串
            newLine();
        }
    }

所以当输出字符串对象的时候调用的是字符串常量的输出方法,而不是对象的输出方法。

  • equal():这个类对这个方法进行了覆写,会比较两个对象的值,而其他比较的是地址。
  • String str1=new String("123");
    String str2=new String("123");
    System.out.println(str1.equals(str2));//true
    	
    Fuxi f1=new Fuxi();
    Fuxi f2=new Fuxi();
    System.out.println(f1.equals(f2));//false
  •  

猜你喜欢

转载自blog.csdn.net/baidu_40450846/article/details/84619435
今日推荐