1. char型变量中能不能存储一个中文汉字?为什么?
- 可以。Java默认Unicode编码,Unicode码占16位。char两个字节正好16位
2. public、private、protected的区别,继承方法与访问权限对比
3. float f=3.4;是否正确?
- 不正确,3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting, 也称为窄化)会造成精度损失,因此需要强制类型转换float f = (float)3.4;或者写成float f = 3.4F
4. short s1 = 1;s1 = s1+1; 有错吗?short s1 = 1;s1 += 1; 有错吗?
- 对于short s1 = 1; s1 = s1 + 1; 由于1是int类型,因此 s1+1运算结果也是int型,需要强制类型转换才能赋值给short型。而short s1 = 1; s1 += 1; +=操作符会进行隐式自动类型转换,是Java语言规定的运算符;Java编译器会对它进行特殊处理,因此可以正确编译。因为s1 += 1;相当于s1 = (short)(s1 + 1)
5. & 和 &&的区别
-
&:(1)按位与;(2)逻辑与
- 按位与:0 & 1 = 0 ; 0 & 0 = 0;1 & 1 = 1
- 逻辑与:a == b & b == c (即使a==b已经是false, 程序还是会继续判断b是否等于c)
-
&& : 短路与
- a == b && b == c (当a == b为false则不会继续判断b是否等于c)
比如判断某对象中的属性是否等于某值,则必须使用&&, 否则会出现空指针问题
- Integer 在-128~127之间做了缓存,合理优化。最大边界可通过-XX : AutoBoxChacheMax进行配置
- 示例代码:
package otherDemo;
public class IntegerCache {
public static void main(String[] args) {
Integer a = 100, b = 100, c = 129, d = 129;
System.out.println("a==b: " + (a == b));
System.out.println("c==d: " + (c == d));
}
}
7. Locale类是什么?
- Locale类用来根据语言环境来动态调整程序的输出
8. Java中final、finally、finalize的区别和用法
-
final: 是一个修饰符也是一个关键字,主要用在三个地方:类、方法、变量
- 被final修饰的类无法被继承。final类中的所有成员方法都会被隐式地指定为final方法
- 对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改·;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。但是它指向的对象的内容是可变的
- 被final修饰的方法将无法被重写,但允许重载注意:类中所有的private方法会隐式的被指定为final方法
- 使用final方法的原因有两个:第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。
-
finally: 一个关键字
- finally在异常处理时提供finally块来执行任何清除操作。不管有没有异常被抛出或者捕获,finally块都会执行,通常用于释放资源
- finally块正常情况下一定会被执行。但是有至少两个极端情况:①如果对应的try块没有执行,则这个try块的finally块并不会被执行 ② 如果在try块中jvm关机,例如system.exit(n), 则finally块也不会执行
- finally块中如果有return语句,则会覆盖try或者catch中的return 语句,导致二者无法return ,所以强烈建议finally块中不要存在 return 关键字
-
finalize:
- finalize()是Object类的protected方法,子类可以覆盖该方法以实现资源清理工作
- GC再回收对象之前都会调用该方法,finalize()方法是存在很多问题的:
- Java语言规范并不保证finalize方法会被及时地执行,更根本不会保证它们一定会被执行 - finalize()方法可能带来性能问题,因为JVM通常在单独的低优先级线程中完成finalize的执行 - finalize()方法中,可将待回收对象赋值给GC Roots可达的对象引用,从而达到对象再生的目的 - finalize()方法最多由GC执行一次(但是可以手动调用对象的finalize方法)
19. hashCode()和equals()的区别
下面从性能和可靠性角度来介绍它们的区别,它们的区别也基本体现在这里
- equals()既然已经能实现对比的功能了,为什么还要hashCode()呢?
因为重写的equals()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode() 进行对比,则只要生成一个hash值就可以了,效率很高
- hashCode()既然效率那么高为什么还有equals()呢?(重要)
因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样 (生成hash值的公式可能存在的问题),所以hashCode()只能说是大部分时候可靠, 并不是绝对可靠,所以我们可以得出下面两条结论: 1. equals()相等的两个对象它们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的 2. hashCode()相等的两个对象他们的equals()不一定相等,也就是hashCode()不是绝对可靠的



