java String类常量池分析及"equals"和"==”区别详细介绍

作者:lqh 时间:2021-11-28 01:54:48 

java "equals"和"==”异同

首先简单说一下“equal”和“==”

==操作对于基本数据类型比较的是两个变量的值是否相等,

对于引用型变量表示的是两个变量在堆中存储的地址是否相同,

即栈中的内容是否相同

equals操作表示的两个变量是否是对同一个对象的引用,

即堆中的内容是否相同。

综上,==比较的是2个对象的地址,而equals比较的是2个对象的内容。

再简单介绍一下String类

String类 又称作不可变字符序列

String使用private final char value[]来实现字符串的存储,也就是说String对象创建之后,就不能再修改此对象中存储的字符串内容。String类有一个特殊的创建方法,就是使用""双引号来创建。例如new String("123")实际创建了2个String对象,一个是"123"通过""双引号创建的,另一个是通过new创建的.只不过他们创建的时期不同,一个是编译期,一个是运行期。java对String类型重载了+操作符,可以直接使用+对两个字符串进行连接。运行期调用String类的intern()方法可以向String Pool中动态添加对象。

区分两种创建String对象的方法“”和new()

String是一个特殊的包装类数据。可以用:


String str1 = new String("123");
String str2 = "123";

两种的形式来创建

第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。(实际是两个正如上文所说,但是在常量池中存在“123”后就不会再在常量池中创建新的“123”)
第二种是先在栈中创建一个对String类的对象引用变量str,然后通过符号引用去字符串常量池里找有没有"abc",如果没有,则将"abc"存放进字符串常量池,并令str指向”abc”,如果已经有”abc”则直接令str指向“abc”。

这时我们应该注意

一方面,第一种写法有利与节省内存空间.同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("123");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。另一方面,我们在使用诸如String str = "123";的格式定义类时,总是想当然地认为,创建了String类的对象str。
对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。

请看下列实例


package testString;

public class testString
{
 public static void main(String[] args)
 {
   String a = "123";
   String b = "123";
   System.out.println(a==b);
   System.out.println(a.equals(b));
   System.out.println("------------------------------------------");
   /**
    * true
    * true
    * 此处创建一个字符串"123"储存在常量池中
    * 因为"123"储存在常量区,并且唯一,即两个String引用a和b所的地址相同所以a==b为true
    * 并且两个引用在所指对象在堆中的内容相同所以a.equals(b)为true
    */
   String c = new String("1234");
   String d = new String("1234");
   System.out.println(c==d);
   System.out.println(c.equals(d));
   System.out.println("------------------------------------------");
   /*
    * false
    * true
    * 此处创建三个字符串“1234”,一个在常量池中,两个通过new储存在堆中
    * 因为c和d此时指向的是堆中的两个String对象,所以地址不同 c==d为false
    * 但是c与d堆中内容相同所以c.equals(d)为true
    */
   String e = "a1";
   String f = "a"+1;
   System.out.println(e==f);
   System.out.println(e.equals(f));
   System.out.println("------------------------------------------");
   /**
    * true
    * true
    * 此处创建“a1”“a”2个字符串其中“a1”“a”他们两个均在常量池中,你可能会问+是个运算符重载么?
    * 是的,java自己有一定的运算符重载但是你没法使用定义自己的运算符重载,和c++不同,String f = "a"+1;
    * 这句会被编译器做成 String f=“a1”;这与我们讲到的第一种情况相同,不再赘述。
    * 编译器之所以这么做是因为他在编译时就能够确定
    */
   String g = "gh";
   String hh = "h";
   String h = "g" + hh ;
   System.out.println(g==h);
   System.out.println(g.equals(h));
   System.out.println("------------------------------------------");
   /**
    * false
    * true
    * 与上面不同的是这里的h在编译时不能确定(编译器是这样认为的),所以h所指的对象在运行时确定储存在堆中,
    * 所以g==h为true而g.equals(h)为false
    */
 }

}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

来源:http://blog.csdn.net/qq_22841811/article/details/46317969

标签:java,equals
0
投稿

猜你喜欢

  • 使用Springboot根据配置文件动态注入接口实现类

    2022-11-18 06:56:45
  • obix协议在java中的配置和使用详解

    2023-11-25 20:59:42
  • java模拟微信抢红包的实例代码

    2021-12-08 19:51:21
  • 使用javaMail实现发送邮件

    2023-01-20 21:22:26
  • Java 字符串转float运算 float转字符串的方法

    2022-04-09 10:09:06
  • 读取xml文件中的配置参数实例

    2023-10-16 16:20:41
  • Java特性队列和栈的堵塞原理解析

    2023-10-13 14:15:55
  • Spring容器的创建过程之如何注册BeanPostProcessor详解

    2022-02-17 08:39:09
  • Java实现Web应用中的定时任务(实例讲解)

    2022-08-12 23:40:02
  • java实现单词搜索迷宫游戏

    2023-11-10 22:44:32
  • 一文详解Java中Stream流的使用

    2021-08-23 11:54:51
  • Java中常见的查找算法与排序算法总结

    2021-07-14 13:21:23
  • Java封装、继承、多态三大特征的理解

    2023-07-16 14:26:46
  • flyway实现java 自动升级SQL脚本的问题及解决方法

    2021-10-14 00:23:19
  • Android kotlin使用注解实现防按钮连点功能的示例

    2023-07-02 11:58:06
  • TKmybatis的框架介绍和原理解析

    2022-08-28 21:35:42
  • Java代码实现酒店管理系统

    2023-08-13 13:09:23
  • 详细总结Java堆栈内存、堆外内存、零拷贝浅析与代码实现

    2023-11-21 01:52:29
  • Android如何判断一个点在不在多边形区域内

    2023-07-06 14:06:13
  • springmvc无法访问/WEB-INF/views下的jsp的解决方法

    2023-11-23 15:15:38
  • asp之家 软件编程 m.aspxhome.com