==和equals
对于== ,比较的两个对象的内存空间的地址,如果相等,则说明这两个引用实际是指向同一个对象地址的。值类型是存储在内存中的栈中,而引用类型的变量在栈中仅仅是存储引用类型变量的地址,而其本身则存储在堆中。
如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;如果作用于引用类型的变量,则比较的是所指向的对象的地址。
对于基本数据的包装类型(Byte, Short, Character,Integer,Float, Double,Long, Boolean)除了Float和Double之外,其他的六种都是实现了常量池的。 JVM缓存了Integer、Byte、Short、Character、Boolean包装类在-128~127之间的值。
Integer i1=127;
Integer i2=127;
System.out.println(i1==i2);//true
Integer i1=128;
Integer i2=128;
System.out.println(i1==i2);//false
自动拆箱和自动装箱
自动拆箱:当计算数值时,integer会自动转为int型进行计算
自动装箱:当int型传给integer类型时,int数值又会包装为integer
基本数据类型的常量池范围是-128~ 127之间,在这个范围内的基本数据类型的包装类可以自动拆箱,比较时可以直接比较大小;int型的包装类Integer在比较数值是否相等时,自动拆箱和自动装箱只在-128~127之间,超过这个范围的用==判断会产生false;char没有负值,0 ~ 127范围内会自动拆箱和自动装箱
对于equals方法,equals方法不能作用于基本数据类型的变量,比较的是是否是同一个对象。如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。
重写equals方法必须要重写hashcode方法
在java中,对对象的存储采取了存储在哈希表中处理方法,hashcode方法是根据对象的地址转换之后返回的一个哈希值。对于hashcode方法,会返回一个哈希值,哈希值对数组的长度取余后会确定一个存储的下标位置。哈希值取余之后是相同的时候就用equals方法判断是否为相同的对象,不同则在链表中插入。则有:
- hashcode不相同,用equals()方法判断的返回的一定为false
- hashcode相同,equals()方法返回值不能确认,可能为true,可能为false
判断的时候先根据hashcode进行的判断,相同的情况下再根据equals()方法进行判断。如果只重写了equals方法,而不重写hashcode的方法,会造成hashcode的值不同,而equals()方法判断出来的结果为true。
在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了equals()的方法,而不重写hashcode的方法,Object中hashcode是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写hashcode方法,造成相同的对象散列到不同的位置而造成对象的不能覆盖的问题。
——————————————————————————————
java中数据在内存中是如何存储的
基本数据类型
java的基本数据类型共有8种,即int,short,long,byte,float,double,boolean,char(注意,并没有String的基本类型 ),存在于栈中。另外,栈有一个很重要的特殊性,就是存在栈中的数据可以共享。比如:
int a=3;
int b=3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b这个引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。
定义完a与b的值后,再令a = 4;那么,b不会等于4,还是等于3。在编译器内部,遇到时,它就会重新搜索栈中是否有4的字面值,如果没有,重新开辟地址存放4的值;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
对象
在java中,创建一个对象包括对象的声明和实例化两步:
1、声明一个对象时,将在栈内存为对象的引用变量分配内存空间
2、为对象在堆中分配内存
包装类
基本类型都有对应的包装类:如int对应Integer类,double对应Double类等,基本类型的定义都是直接在栈中,如果用包装类来创建对象,就和普通对象一样了。例如:int i=0;i直接存储在栈中。Integer i(i此时是对象)= new Integer(5);这样,i对象数据存储在堆中,i的引用存储在栈中,通过栈中的引用来操作对象。
数组
在栈内存中创建一个数组引用,通过该引用(即数组名)来引用数组。堆内存保存数组元素。
补充:JAVA基本数据类型所占字节数是多少?
| 数据类型 | 字节数 |
|---|---|
| byte | 1字节 |
| short | 2字节 |
| int | 4字节 |
| long | 8字节 |
| char | 2字节 |
| float | 4字节 |
| double | 8字节 |
| boolean | 理论上占用1bit,1/8字节,实际处理按1byte处理 |
2919

被折叠的 条评论
为什么被折叠?



