java基础知识-String

1.String 为什么是final?

final 修饰的对象是不可变的,是线程安全的,在多线程中可以不用考虑锁的问题
效率更高,只用拷贝地址即可,不可变对象在所属实例创建时被提供,并且在整个对象的生命周期中都存在

2.String的创建方式:

String s=“sss” String s =new String"a" 第二种方式实际上是创建了 两个String 对象
第一个是字符串a .
第一种方式在编译期放入了String pool(字符串常量池)中,。每当我们创建String时,jvm会自动的检查字符常量池,
如果该字符串已经存在于常量池中,会直接返回常量池中的实例,如果不存在就会实例化,放入常量池中

第二种方法:String s =new String(“a”)
new一定会产生一个 “a”对象 同时这个对象是存在 于堆中,所以产生了两个对象保存在栈中的s 以及位于堆中的"a"
所以 关系是如下的: 栈中的s对象 -》 堆中的“a”对象-》 字符串常量池中的“a”

下列代码、

public class test {
	public static void main(String args[]) {
		String str1 = "aaa";
		String str2 ="aaa";
		
		String str3= new String ("aaa");
		String str4 =new String ("aaa");
		System.out.println(str1==str2);//true
		System.out.println(str3==str4);//false
	}

}

在这里插入图片描述

采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"aaa"这个字符串对象,
如果有,则不在池中再去创建"aaa"这个对象了,直接在堆中创建一个"aaa"字符串对象,
然后将堆中的这个"aaa"对象的地址返回赋给引用str3,这样,str3就指向了堆中创建的这个"aaa"字符串对象;
如果没有,则首先在字符串池中创建一个"aaa"字符串对象,然后再在堆中创建一个"aaa"字符串对象,
然后将堆中这个"aaa"字符串对象的地址返回赋给str3引用,
这样,str3指向了堆中创建的这个"aaa"字符串对象。当执行String str4=new String(“aaa”)时
, 因为采用new关键字创建对象时,每次new出来的都是一个新的对象,
也即是说引用str3和str4指向的是两个不同的对象,因此语句System.out.println(str3 == str4)输出:false。

3.关于equals和==

(1)对于==,如果作用于基本数据类型的变量(byte,short,char,int,long,float,double,boolean )
,则直接比较其存储的"值"是否相等;
如果作用于引用类型的变量(String),则比较的是所指向的对象的地址(即是否指向同一个对象)。

(2)equals方法是基类Object中的方法
,因此对于所有的继承于Object的类都会有该方法
。在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

(3)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
。如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
而String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。
其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等

参考链接:https://blog.csdn.net/zw6161080123/article/details/80959468

发布了68 篇原创文章 · 获赞 3 · 访问量 5226

猜你喜欢

转载自blog.csdn.net/Hqxcsdn/article/details/88651354