Java中String类字面类与new 创建对像的区别
Java中String类中字面类与new 创建对像的区别
在Java中的字符串也是一种数据类型,只不过不是基本数据类型(基本数据类型如 int float double byte 等),而是引用类型(String这个类的对象).
一般我们在创建字符串时一般有两种方式:
一.用字面量来对已经声明的字符串对象进行赋值:
如:String s1 = "java";
上面式子就是通过声明一个字符串对象s1,并对它用字面量("java")进行初始化,此式子大概过程是:
JVM(java虚拟机)会在常量池中检查是否存在这样一个常量"java",如果不存在就在常量池中新建一个字符串常量对象,再将此对象的引用(即地址)返回,
即就是把"java"在常量池的对象(不存在就创建一个再返回)的地址值返回赋值给s1,
注意:虽然对象的值是地址,但是在对字符串对象进行输出时:
System.out.println(s1);
结果是s1引用的内容java,而不是他的地址(这与其他对象不同,如直接输出数组名会得到地址值)
二.用构造方法String("内容") new一个对象:
我们都知道一般正常的类创建一个的过程一般是:
类名 对象名 = new 类的构造方法名(参数);
对与字符串类String 我们同样可以使用这样的办法,只不过这样创建的对象和我们用字面量创建有所不同
String s2 = new String("java");
这样创建一个对象的过程大概是:
首先JVM同样会对常量池进行检查(检查的原因是节省内存避免重复创建对象造成内存浪费),如果在常量池内找不到就会在常量池创建一个对象(找得到则省略这一步),再在堆内存区(JVM的一个内存区域,与常量池不在同一个区域)中新建一个对象引用常量池中的对象(也就是说在堆创建的堆对象的值是常量池中对象的地址),最后把在堆内存区创建的堆对象的地址值返回:此图通过JVM中的内存结构简单粗略的展示了两种方式的创建对象的区别:
关于==运算符和equals()方法运算的区别:
1.==运算符:
其本质是值的比较(注意,对象是引用类类型,所以对象的值本质上也就是计算机虚拟内存的地址,类似C语言的指针),所以基于这一点,只有引用相同的对象两个对象(实际上java中引用相同的两个对象就是同一个对象)
即同一个对象(具有相同的引用)==运算的结果才为true
2.equals()方法:
对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象。 但是String类重写了equals()方法,在字符串中比较的是其字符串的内容
下面看测试代码:
ublic class String_ {
public static void main(String[] args) {
String s1 = "java web";
String s2 = new String("java web");
System.out.println("new和字面量用==比较的结果为:"+(s1==s2)+"==比较的是地址值,基本数据类型比较是值");
System.out.println("new和\"java\"用==比较的结果为:"+(s2=="java")); //
System.out.println("new和字面量相同一个字符串用equals()方法比较的结果为:"+(s1.equals(s2)));
}
}
运行结果如下:
通过上述测试我们可以看到:
1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址
(其实本质上还是值的比较,因为引用数据类型的值是地址)
2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的还是是引用类型的变量所指向的对象的地址;(这一点和==差不多)
但是诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
总的来说就是:对于对象(引用类型的数据类型),无论是==还是equals()方法,比较的都是地址,但是有一些特殊情况(如String、Date等类)下,重写了equals()方法,则比较的是引用对象的内容
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了