switch是否能作用在byte上,是否能作用在long上,是否能作用在String上?
- 在Java5以前,
switch(expr)
中,expr
只能是byte
、short
、char
、int
类型 - 从Java5开始,Java中引入了枚举类型,
expr
也可以是enum
类型 - 从Java7开始,expr还可以是
String
类型,但是长整型(long)在目前所有的版本中都是不可以的
用最有效率的方法计算2乘以8?
2<<3:2左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方
数组有没有length()
方法?String有没有length()
方法?
- 数组没有
length()
方法,有length
属性 - String有
length()
方法 JavaScript
中,获得字符串的长度是通过length
属性得到的
在Java中,如何跳出当前的多重嵌套循环?
- 在最外层循环前加一个标记如A,然后用
break A;
可以跳出多重循环 - Java中支持带标签的
break
和continue
语句,作用有点类似于C和C++中的goto
语句 - 不建议使用该方法
构造器(constructor)是否可被重写(override)?
构造器不能被继承,因此不能被重写,但可以被重载。
两个对象值相同(x.equals(y) == true),但却可有不同的hashCode,这句话对不对?
不对
如果两个对象x和y满足x.equals(y) == true
,它们的哈希码(hash code)应当相同。Java对于equals方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode值相同,它们并不一定相同。
如果违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大降低(如果哈希码频繁的冲突将会造成存取性能急剧下降)。
实现高质量的equals方法的诀窍包括
- 使用
==
操作符检查参数是否为这个对象的引用 - 使用
instanceof
操作符检查参数是否为正确的类型 - 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配
- 编写完
equals
方法后,检查是否满足对称性、传递性、一致性 - 重写
equals
方法时总是要重写hashCode
方法 - 不要将
equals
方法参数中的Object
对象替换为其他的类型,在重写时不要忘记@Override
注解
是否可以继承String
类?
String
类是final
类,不可以被继承。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递,Java语言的方法调用只支持参数的值传递。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
String
和StringBuilder
、StringBuffer
的区别?
String
是只读字符串,即String
引用的字符串内容是不能被改变的StringBuilder
/StringBuffer
类表示的字符串对象可以直接进行修改StringBuilder
是Java5引入的,它和StringBuffer
的方法完全相同,区别在于它是单线程环境下使用的,因为它的所有方法都没有被synchronized
修饰,因此它的效率比StringBuffer
要高
重载(overload)和重写(override)的区别。重载的方法能否根据返回类型进行区分?
- 方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性
- 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载
- 重写发生在子类与父类之间,重写要求子类重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)
- 重载对返回类型没有特殊的要求