你不知道的Java

1、用public static final就能保证对象的全局唯一性,为什么还要那么麻烦的用单例模式呢?

2、try catch finally,try里有return,finally还执行么?

执行,并且finally的执行早于try里面的return

  • 不管有木有出现异常,finally块中代码都会执行;
  • 当try和catch中有return时,finally仍然会执行;
  • finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,不管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
  • 、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

3、boolean占用几个字节

对于boolean占4字节,对于boolean数组占一字节

  • 虽然定义了boolean这种数据类型,但是只对它提供了非常有限的支持。在Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达式所操作的boolean值,在编译之后都使用Java虚拟机中的int数据类型来代替,
  • 而boolean数组将会被编码成Java虚拟机的byte数组,每个元素boolean元素占8位。这样我们可以得出boolean类型占了单独使用是4个字节,在数组中又是1个字节。使用int的原因是,对于当下32位的处理器(CPU)来说,一次处理数据是32位(这里不是指的是32/64位系统,而是指CPU硬件层面),具有高效存取的特点。

4、下面的代码会输出什么?

Integer如果数值在[-128,127]之间,便返 回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。

public class Main{
    
    
    public static void main(String[] args) {
    
    
        Integer i1 = 100, i2 = 100, i3 = 200, i4 = 200;
        float f1 = 100.0f;
        double d1 = 100.0, d2=100;
        long l1 = 100L;
        int i5 = 100;
        System.out.println(3*0.1 == 0.3);
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
        System.out.println((i1 == f1) && (i1 == d1) && (i1 == l1));
        System.out.println(i1 == i5);
        System.out.println(d1 == d2);
    }
}

false
true
false
true
true
true

5、为什么要重写equals和hashcode,重写equals了之后为什么还要重写hashcode?

如果没有重写quals的话,用的是==,比较的是对象的内存地址,而不是比较两个对象的内容是否相等

1、如果两个对象相同,则他们的哈希值(hashcode)一定相同
2、如果两个对象的哈希值相同(hashcode)相同,并不意味着他们是相同的
因为数字比较比字符串比较快许多,所以两个对象比较是先比较其hashcode,hashcode相同才会调用equals进行比较

6、static的作用

  • static可以修饰变量和方法,称为静态变量和静态方法,为类实例所共享.
  • static也用于静态代码块,多用于初始化操作
  • 此外static也多用于修饰内部类,此时称之为静态内部类.
  • 最后一种用法就是静态导包,即import static ,是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名,
    比如:
import static java.lang.Math.*;
public class Main{
    
    
    public static void main(String[] args) {
    
    
        System.out.println(Math.sin(20));   //传统做法
        System.out.println(sin(20));
    }
}

7、Java中 a += b 与 a = a + b的区别

+=会进行隐式类型转换,而 = 不会,会编译错误,并且小类型会隐式隐式转换为大类型,而大类型不会隐式转换为小类型

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_40660894/article/details/108309032