Java面试题目网站有哪些?


如果是想找高质量面试题的话不妨看看动力节点上面试题也是非常全面新鲜的!

Java面试题目网站有哪些?

文章插图
1、String类可以被继承吗?
String类在声明时使用final关键字修饰 。被final关键字修饰的类无法被继承 。
接下来我们可以看一下String类的源代码片段:
public final class String implements java.io.Serializable, Comparable<String>,CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L;
● 为什么Java语言的开发者 。把String类定义为final的呢?
因为只有当字符串是不可变的 。字符串池才有可能实现 。字符串池的实现可以在运行时节约很多heap空间 。因为不同的字符串变量都指向池中的同一个字符串 。但如果字符串是可变的 。那么String interning将不能实现 。因为这样的话 。如果变量改变了它的值 。那么其它指向这个值的变量的值也会一起改变 。如果字符串是可变的 。那么会引起很严重的安全问题 。譬如 。数据库的用户名、密码都是以字符串的形式传入来获得数据库的连接 。或者在socket编程中 。主机名和端口都是以字符串的形式传入 。因为字符串是不可变的 。所以它的值是不可改变的 。否则黑客们可以钻到空子 。改变字符串指向的对象的值 。造成安全漏洞 。
因为字符串是不可变的 。所以是多线程安全的 。同一个字符串实例可以被多个线程共享 。这样便不用因为线程安全问题而使用同步 。字符串自己便是线程安全的 。
因为字符串是不可变的 。所以在它创建的时候HashCode就被缓存了 。不需要重新计算 。这就使得字符串很适合作为Map中的键 。字符串的处理速度要快过其它的键对象 。这就是HashMap中的键往往都使用字符串 。
● final关键字除了修饰类之外 。还有哪些用法呢?
final修饰的变量 。一旦赋值 。不可重新赋值;
final修饰的方法无法被覆盖;
final修饰的实例变量 。必须手动赋值 。不能采用系统默认值;
final修饰的实例变量 。一般和static联用 。用来声明常量;
注意:final不能和abstract关键字联合使用 。
总之 。final表示最终的、不可变的 。
2、& 和 && 的区别?
● &运算符是:逻辑与;&&运算符是:短路与 。
● &和&&在程序中最终的运算结果是完全一致的 。只不过&&存在短路现象 。当&&运算符左边的表达式结果为false的时候 。右边的表达式不执行 。此时就发生了短路现象 。如果是&运算符 。那么不管左边的表达式是true还是false 。右边表达式是一定会执行的 。这就是他们俩的本质区别 。
● 当然 。&运算符还可以使用在二进制位运算上 。例如按位与操作 。
Java面试题目网站有哪些?

文章插图
3、两个对象值相同equals结果为true 。但却可有不同的 hashCode 。这句话对不对?
不对 。如果两个对象x和y满足x.equals(y) == true 。它们的哈希值(hashCode)应当相同 。Java 对于equals方法和hashCode方法是这样规定的:
(1)如果两个对象相同(equals方法返回true) 。那么它们的hashCode值一定要相同;
(2)如果两个对象的 hashCode相同 。它们并不一定相同 。当然 。你未必按照要求去做 。但是如果你违背了上述原则就会发现在使用集合时 。相同的对象可以出现在Set 集合中 。同时增加新元素的效率会大大降低(对于使用哈希存储的系统 。如果哈希码频繁的冲突将会造成存取性能急剧下降) 。
关于equals和hashCode方法 。很多Java程序员都知道 。但很多人也就是仅仅了解而已 。在Joshua Bloch的大作《Effective Java》(《Effective Java》在很多公司 。是Java程序员必看书籍 。如果你还没看过 。那就赶紧去买一本吧)中是这样介绍 equals 方法的:
首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true 时 。y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时 。x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时 。多次调用x.equals(y)应该得到同样的返回值) 。而且对于任何非null值的引用x 。x.equals(null)必须返回false 。实现高质量的equals方法的诀窍包括:
使用==操作符检查\"参数是否为这个对象的引用\";

推荐阅读