==和equals

==和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基本数据类型所占字节数是多少?

数据类型字节数
byte1字节
short2字节
int4字节
long8字节
char2字节
float4字节
double8字节
boolean理论上占用1bit,1/8字节,实际处理按1byte处理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值