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 |