java基础面试题总结

女爷i 2022-05-28 01:38 332阅读 0赞

1.java中==和equals

  1. “==”的介绍:.基本数据类型,也称原始数据类型
    byte,short,char,int,long,float,double,boolean 他们之间的比较,应用双等号(==),比较的是他们的值
  2. 引用类型(类、接口、数组)
    当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见’==’是对栈中的值进行比较的。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了.

    1. public static void main(String[] args) {
    2. int int1 = 12;
    3. int int2 = 12;
    4. Integer Integer1 = new Integer(12);
    5. Integer Integer2 = new Integer(12);
    6. Integer Integer3 = new Integer(127);
    7. Integer a1 = 127;
    8. Integer b1 = 127;
    9. Integer a = 128;
    10. Integer b = 128;
    11. String s1 = "str";
    12. String s2 = "str";
    13. String str1 = new String("str");
    14. String str2 = new String("str");
    15. System.out.println("int1==int2:" + (int1 == int2)); //true
    16. System.out.println("int1==Integer1:" + (int1 == Integer1)); //int1==Integer1:true //Integer会自动拆箱为int,所以为true
    17. System.out.println("Integer1==Integer2:" + (Integer1 == Integer2)); //不同对象,在内存存放地址不同,所以为false
    18. System.out.println("Integer3==b1:" + (Integer3 == b1)); //Integer3指向new的对象地址,b1指向缓存中127地址,地址不同,所以为false
    19. System.out.println("a1==b1:" + (a1 == b1)); //true
    20. System.out.println("a==b:" + (a == b)); //false
    21. System.out.println("s1==s2:" + (s1 == s2)); //true
    22. System.out.println("s1==str1:" + (s1 == str1)); //false
    23. System.out.println("str1==str2:" + (str1 == str2)); //false

    }

Integer b1 = 127;java在编译的时候,被翻译成-> Integer b1 = Integer.valueOf(127);注解:
Integer b1 = 127;java在编译的时候,被翻译成-> Integer b1 = Integer.valueOf(127);

  1. public static Integer valueOf(int i) {
  2. assert IntegerCache.high >= 127;
  3. if (i >= IntegerCache.low && i <= IntegerCache.high)
  4. return IntegerCache.cache[i + (-IntegerCache.low)];
  5. return new Integer(i);
  6. }

看一下源码大家都会明白,对于-128到127之间的数,会进行缓存,Integer b1 = 127时,会将127进行缓存,下次再写Integer i6 = 127时,就会直接从缓存中取,就不会new了。所以a1==b1:true a==b:false

1.equals

  1. 1、默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法,而Objectequals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象)。下面是Object类中equals方法:
  2. public boolean equals(Object obj) {
  3. return (this == obj);
  4. }
  5. 定义的equals与==是等效的
  6. 2,要是类中覆盖了equals方法,那么就要根据具体的代码来确定equals方法的作用了,覆盖后一般都是通过对象的内容是否相等来判断对象是否相等。下面是String类对equals进行了重写:
  7. public boolean equals(Object anObject) {
  8. if (this == anObject) {
  9. return true;
  10. }
  11. if (anObject instanceof String) {
  12. String anotherString = (String)anObject;
  13. int n = count;
  14. if (n == anotherString.count) {
  15. char v1[] = value;
  16. char v2[] = anotherString.value;
  17. int i = offset;
  18. int j = anotherString.offset;
  19. while (n-- != 0) {
  20. if (v1[i++] != v2[j++])
  21. return false;
  22. }
  23. return true;
  24. }
  25. }
  26. return false;
  27. }
  28. Stringequals方法判断相等的步骤是:
  29. 1.A==B 即是同一个String对象 返回true
  30. 2.若对比对象是String类型则继续,否则返回false
  31. 3.判断AB长度是否一样,不一样的话返回false
  32. 4。逐个字符比较,若有不相等字符,返回false

可以看出,String类对equals方法进行了重写,用来比较指向的字符串对象所存储的字符串是否相等。

  其他的一些类诸如Double,Date,Integer等,都对equals方法进行了重写用来比较指向的对象所存储的内容是否相等。

  总结来说:

  1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

    如果作用于引用类型的变量,则比较的是所指向的对象的地址

  2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量

    如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

    诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

发表评论

表情:
评论列表 (有 0 条评论,332人围观)

还没有评论,来说两句吧...

相关阅读

    相关 超详细的Java基础面试总结

    最近在备战面试的过程中,整理一下面试题。大多数题目都是自己手敲的,网上也有很多这样的总结。自己感觉总是很乱,所以花了很久把自己觉得重要的东西总结了一下。 面向对象和面向过程