黑马程序员技术交流社区

标题: “==”与“equals”的区别(常量池) [打印本页]

作者: 黑马LM    时间: 2015-5-15 23:19
标题: “==”与“equals”的区别(常量池)
JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了,是比较字符串内容是否相同。
Java堆:
1.程序运行中动态分配内存大小
2.java的垃圾回收器自动回收不再使用的数据
Java栈:
1.栈数据可以共享
2.存在栈中的数据大小与生存期必须是确定的。
3.栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象引用。

String是一个特殊的包装类数据。可以用:
   ------ 第一种:String str = new String("abc");
使用new创建字符串对象的步骤如下,每调用一次就会创建一个新的对象。
1. 首先在堆(不是常量池)中创建一个包含指定内容的字符串对象,并将字符串引用指向该对象。
2. 去字符串常量池中查看,是否有包含该内容的对象。
3. 若有,则将new出来的字符串对象与字符串常量池中内容相同的对象联系起来。
4. 若没有,则在字符串常量池中再创建一个包含该内容的字符串对象,并将堆中的对象与字符串常量池中新创建出来的对象联系起来。
        字符串特殊的内存机制带来的好处,即是:只比较两个字符串联系的常量池中对象是否为同一个即可,不论字符串大小,比较速度一样。
------第二种:String str = "abc";
        1.先在栈中创建一个对String类的对象引用变量str
        2.然后查找堆中常量池里有没有存放"abc"
        3.如果没有,则将"abc"存放进常量池,并令str指向”abc”
4.如果已经有"abc"则直接令str指向“abc”。

特殊情况》》》》》》》
127 以下的整数是相等的
Integer i=100;
        Integer j=100;
        System.out.println(i==j); // 打印 true
        128以上就作为不同对象处理了
Integer i=200;
        Integer j=200;
        System.out.println(i==j); //打印false
作者: Dracove    时间: 2015-5-16 08:42
总结的很好,很有用!
作者: hoop.zeng    时间: 2015-5-16 13:48
不错 学习了
作者: 嘉Ming    时间: 2015-5-16 16:44
很详细,谢谢分享
作者: guoyangpeng    时间: 2015-5-16 17:47
总结很好!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2