2019独角兽企业重金招聘Python工程师标准>>>

在java中经常会遇到做比较,比较大小、比较是否等值,那么有哪些比较方法,他们之间又有什么区别呢?

一,先介绍一下==与equals()

==号比较的一直是地址值,

①对基本数据类型,==比较实际上就是变量数值是否相等,

②对引用数据类型,比较的则是地址值。这里特别需要注意的是String类型,很容易想当然的使用==,很容易出错。equals()方法是Object类里的方法,我们知道Java中一切类都会默认继承Object类,所以类对象都会有equals()方法。

二、基本数据类型及包装类

①基本类型大概有byte、short、int、long、boolean、char、double、float这八类,它们声明的变量存放在栈内存中。 判断是否相等用==,比较大小用<、>、<=、>=即可

②它们对应的包装类型(Byte、Short、Integer、Long、Boolean、Character、Double)定义的变量则存在于堆内存中。

用new方法来声明一个Integer或者Long对象,因为new对象都是在堆里开辟一块空间,所以即便两者的数值相同,但对于==来说,比较的是地址值,所以会返回false。(工作中就遇到这种情况)

        int n3 = 48;System.out.println("--------使用new对象时,当值在[-127,128]之间时---------");Integer n7 = new Integer(48);Integer n8 = new Integer(48);System.out.println(n7 == n8);   //falseSystem.out.println(n7 == n3);   //trueSystem.out.println("--------直接赋值方式,当值在[-128,127]之间时---------");Integer n1 = 48;Integer n2 = 48;System.out.println(n3 == n1); //trueSystem.out.println(n1 == n2); //trueSystem.out.println(n1.equals(n2)); //trueSystem.out.println(n1.equals(n3)); //trueSystem.out.println(n1.intValue() == n2.intValue()); //trueSystem.out.println("--------直接赋值方式,当值不在[-127,128]之间时---------");Integer n4 = 128;Integer n5 = 128;int n6 = 128;System.out.println(n4 == n5);   //falseSystem.out.println(n4 == n6);   //trueSystem.out.println(n4.equals(n5));  //trueSystem.out.println(n4.equals(n6));  //trueSystem.out.println(n4.intValue() == n5.intValue());  //true//使用Integer.intValue()方法时需要注意验证是否为null,防止出现NullPointException
  1. 对于基本数据类型的包装类,都重写了equals()方法,会比较数值大小,所以用equals()方法是可以根据数值大小进行判断的。
  2. 对于Integer变量与int变量比较的问题,会发现也是基于数值大小得出来的比较值,这是因为在比较时,Integer类型做了自动拆箱,转成了int类型。
  3. 对于直接赋值方式,值为48的两个Integer变量,用==号判断是true,而当值为128后,却为false。这是因为在底层,对于Integer n1 = 48;这种直接赋值的方式,其实调用了Integer.value()方法

鉴于上述问题 可以采用两种方式做比较

  • 调用xxxValue()方法转成基本数据类型进行比较
  • 使用compareTo()方法进行比较,在包装类中,都重写了compareTo()方法。查看compareTo()源码,可以看出,其实它底层使用的也是通过自动拆箱转成了对应的基本数据类型再进行比较的。

三、 java对象比较

1、String类型的比较 (String类型不能直接使用>、<=、>=、<)

2、 类对象的比较 (判断两个对象是否相等,需要在类中重写equals()方法)

如果要比较两个对象的大小(这也是常会问到的面试题),有两种方式:

  • 被比较类实现Comparable接口,并重写compareTo()方法
/*** Java中的比较总结* @author yrr*/
public class JavaCompareTest {@Testpublic void test5() {Person p1 = new Person("yrr",18);Person p2 = new Person("wx",19);System.out.println(p1.compareTo(p2) < 0);}
}class Person implements Comparable<Person>{private String name;    private Integer age;public Person() {}public Person(String name, Integer age) {this.name = name;this.age = age;}public Integer getAge() {return age;}@Overridepublic int compareTo(Person o) {return this.getAge() - o.getAge();}}
  • 自己定义实现了一个Comparator接口的类或者利用内部类,重写compare()方法
package comparator;import java.util.Arrays;
import java.util.Comparator;public class MyComparator {public static void main(String[] args) {User[] users = new User[] { new User("u1001", 25),  new User("u1002", 20), new User("u1003", 21) };Arrays.sort(users, new Comparator<User>() {@Overridepublic int compare(User o1, User o2) {return o1.getAge() - o2.getAge();}});for (int i = 0; i < users.length; i++) {  User user = users[i];  System.out.println(user.getId() + " " + user.getAge());  }  }}class User {  private String id;  private int age;  public User(String id, int age) {  this.id = id;  this.age = age;  }  public int getAge() {  return age;  }  public void setAge(int age) {  this.age = age;  }  public String getId() {  return id;  }  public void setId(String id) {  this.id = id;  }
}
  • 两者的区别:前者定义在被比较类上,而后者定义在被比较类外。通过这种区别,两者的优缺点也很明显,前者简单,但需要对被比较类进行修改,而后者则不需要修改原代码,更加灵活。

转载于:https://my.oschina.net/u/3315736/blog/1583870

Java中做比较介绍相关推荐

  1. java中ThreadPool的介绍和使用

    文章目录 Thread Pool简介 Executors, Executor 和 ExecutorService ThreadPoolExecutor ScheduledThreadPoolExecu ...

  2. Java中BigDecimal类介绍及用法

    Java中BigDecimal类介绍及用法 Java中提供了大数字(超过16位有效位)的操作类,即 java.math.BinInteger 类和 java.math.BigDecimal 类,用于高 ...

  3. Java中List集合介绍(炒鸡详细呦)

    Java中List集合介绍 文章目录 Java中List集合介绍 1,Java集合介绍 2,List介绍 2.1 ArrayList集合 2.2 LinkedList集合 3,List常用方法 3.1 ...

  4. javac 与java_javac中使用-d,以及javac / java中使用-cp介绍

    javac中使用-d,以及javac / java中使用-cp介绍 发布时间:2019-01-15 20:39, 浏览次数:555 , 标签: javac java cp * 一般生成把java编译成 ...

  5. java中Cookie详细介绍

    Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是 ...

  6. Java中所有锁介绍

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 1.公平锁 / 非公平锁 2.可重入锁 / 不可重入锁 3.独享锁 / 共享锁 4.互斥锁 / 读 ...

  7. java中事务的介绍

    2019独角兽企业重金招聘Python工程师标准>>> java的事务处理,如果对数据库进行多次操作,每一次的执行或步骤都是一个事务.如果数据库操作在某 一步没有执行或出现异常而导致 ...

  8. java try catch_异常处理,JAVA中异常处理的介绍

    异常处理的介绍 在Java程序的运行过程中,如果Java虚拟机检测出一个无法执行的操作,就会产生运行时错误(runtime error) 在Java中,运行时错误会作为异常来抛出. 抛出的异常是一个对 ...

  9. java holder_这个Holder 在Java中做什么? - java

    有人可以解释一下此代码吗? public void getSupplierByZipCode( @WebParam(name = "zip", targetNamespace = ...

  10. java中锁的介绍及运用

    个人免费资源分享网站:http://xiaocaoshare.com/ 1.悲观锁和乐观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加 ...

最新文章

  1. 图灵有奖书评征集活动第001期
  2. 哪些操作会造成raid数据无法恢复?raid多块硬盘离线后切记不要做这些事情
  3. HDU2072 单词数
  4. 学会转变你的思维方式,一切都会变得不一样
  5. php 解包二进制,workerman的二进制怎么玩啊,怎么封包,怎么解包啊
  6. WP7中对ListBox的ItemTemplate中子元素的后台操作
  7. 我是一个请求,我该何去何从
  8. Linux vi的复制和粘贴快捷键
  9. 变分自编码器(VAE)详解与实现(tensorflow2.x)
  10. TypeScript:运算符
  11. docker-ce版本与安装过程
  12. 软考和华为证书的含金量,哪个更适合找工作
  13. VMware虚拟机安装Win10系统后出现蓝屏
  14. 阿里云服务器常用配置价格表
  15. 机动车尾气污染物分析仪的原理
  16. 阿里TPP图化框架技术实践 — 打造算法在线服务领域极致开发体验与性能
  17. C语言练习作品 - U盘病毒模拟
  18. 树莓派3b安装python3.6_树莓派编译安装Python3.6
  19. 用matlab读csv数据_matlab 读文件csvread textread用法实例
  20. 基于MITRE ATTCK的Red Teaming行动实践

热门文章

  1. 直播项目之仿全民TV(已开源)
  2. sparksql 保存点_Spark SQL笔记整理(三):加载保存功能与Spark SQL函数
  3. go-结构化,方法的创建以及使用
  4. scrapy[skp]快速入门
  5. oracle行相减,oracle两张表满足某个条件时,表中满足条件的那一行的某列相减
  6. python从入门到实践第二版_【Python入门教程】第二季网络爬虫基础
  7. 问题 A: 【一本通提高组合数学】Bullcow 牡牛和牝牛
  8. 谷歌:光靠软件修复不能完全防御“幽灵”漏洞
  9. GPU GEMS 3 EBOOK下载
  10. 【翻译】CodeMix使用教程(四):调试