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的区别
+=会进行隐式类型转换,而 = 不会,会编译错误,并且小类型会隐式隐式转换为大类型,而大类型不会隐式转换为小类型