java:包装类类型判等、比较大小

前言

今天有个巨大的bug,困扰了我一上午,问题是java中的字符串判等问题只能用equals方法而不能用==。(妈的,叫你不好好看书,看书的时候跳着看,打死你个龟孙
出现的原因如下:
今天去回顾二叉树的序列化与反序列化这道题时,用java去重写,出现了很多的问题,也学会了java语言基础的几个特性。

  1. String与StringBuilder的区别,一个是可变的,一个是不可变的。一个能作为方法的可变参数,一个不能作为方法的可变参数。
  2. 字符串的判等问题。不能用==的原因在于。 该运算符只能判断两个字符串是否存放在通过一个位置上。应该用包装类的方法equals去判断。

包装类

包装类是为了应对基本类型不符合java完全面向对象的特征而提出的类,包装类将基本类型包装起来使得其拥有对象的特征,有方法有属性。java中的容器装的都是object类(包装类是object的子类),是不允许将基本数据类型放进去的,只能通过包装类的自动封箱与自动拆箱操作,进行操作。

包装类比较大小

java中对于够用来比较大小的包装类( Byte, Long, Integer等)提供了比较大小的方法compareTo()equals方法

/*
看一下针对不同类中的compareTo方法与equals方法的原型
以Integer与String类举例,其余类似
其返回值:
0 说明两个对象的值相等
负数/正数 说明两个对象不等
*/
//Integer类型
public int compareTo​(Integer anotherInteger)
//String类型,CompareTo逐个比较String单个字符的ASCII,并返回ASCII的差值
public int compareTo​(String anotherString)
public boolean equals​(Object obj)
//具体使用方法
x.compareTo(y)
x.equals(y)

小插曲

java中的”==“号是不是判定对象值相等时一定会出错呢?
答案是不见得的

首先来看一下”=="起作用的两种方式

  1. 比较双方为基本数据类型:直接比较双方数值的大小
  2. 比较双方为Object或者为自定义对象:比较二者在内存中的位置

但是在java中声明对象构建新的对象是有区别的。举个例子(以Integer为例,其余类类似)

Integer i1=110;
Integer i2=110;
Integer i3=new Integer(110);
System.out.println(i1 == i2); // ouput -> true
System.out.println(i1 == i3); // output->false

原因在于:
在Java中,类存在类pool,其中存放可以共享的对象,在声明一个对象时,会先去其中寻找是否存在相同的对象内容,假设存在是不会创建新对象,故此时二者的内存地址相同。
但是new String会重新开辟地址,因此与之前String对象地址不同

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值