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()方法,则比较的是引用对象的内容

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lqy5679

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值