java基础常见面试题系列,11-20

10 篇文章 0 订阅

11、switch 是否能作用在 byte 上,是否能作用在 long 上, 是否能作用在 String 上?

在 Java 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。从 Java 5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,从 Java 7 开始, expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是 不可以的。

switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。

12、用最有效率的方法计算 2 乘以 8?

2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。

以用移位和减法运算来代替乘法.

13、数组有没有 length()方法?String 有没有 length()方法?

数组没有 length()方法,有 length 的属性。String 有 length()方法。

数组是一个容器对象,其中包含固定数量的同一类型的值。一旦数组被创建,他的长度就是固定的了。数组的长度可以作为final实例变量的长度。因此,长度可以被视为一个数组的属性。

14、在 Java 中,如何跳出当前的多重嵌套循环?

在最外层循环前加一个标记如 A,然后用 break A;可以跳出多重循环。(Java 中 支持带标签的 break 和 continue 语句)

15、构造器(constructor)是否可被重写(override)?

构造器不能被继承,因此不能被重写,但可以被重载。

当子类需要父类的功能,而子类有新的内容,可以重写父类中的方法。在实际开发过程中,随着代码量的逐渐增加,维护成了一个很大的问题,如果需要对某个方法进行修改,其本身代码以及其子类代码都会受到影响,而重写则很好的解决了这个问题。方法重写又称为方法覆盖、方法复写。

方法重写和方法重载的区别:

  • 方法重写:子类和父类中方法相同,两个类之间的关系,函数的返回值类型、函数名、参数列表都一样
  • 方法重载:指在同一个类中,多个方法名相同,他们的参数列表不同(个数不同,数据类型不同)

 多态性是面向对象编程的一种特性,和方法无关,
简单说,就是同样的一个方法能够根据输入数据的不同,做出不同的处理,即方法的重载——有不同的参数列表(静态多态性)

而当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法, 即在子类中重写该方法——相同参数,不同实现(动态多态性)

16、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code) 应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;(2) 如果两个对象的 hashCode 相同,它们并不一定相同。当然,你未必要按照要求 去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现 在 Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统, 如果哈希码频繁的冲突将会造成存取性能急剧下降)。

首先 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 方法的诀窍包括:1. 使用==操作符检查”参数是否为这个 对象的引用”;2. 使用 instanceof 操作符检查”参数是否为正确的类型”;3. 对 于类中的关键属性,检查参数传入对象的属性是否与之相匹配;4. 编写完 equals 方法后,问自己它是否满足对称性、传递性、一致性;5. 重写 equals 时总是要 重写 hashCode;6. 不要将 equals 方法参数中的 Object 对象替换为其他的类型, 在重写时不要忘掉@Override 注解。

17、是否可以继承 String 类?

String 类是 final 类,不可以被继承。 补充:继承 String 本身就是一个错误的行为,对 String 类型最好的重用方式是关 联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。

18、当一个对象被当作参数传递到一个方法后,此方法可改变 这个对象的属性,并可返回变化后的结果,那么这里到底是值传 递还是引用传递?

是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个 参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调 用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以 通过传引用或传输出参数来改变传入的参数的值。在 C#中可以编写如下所示的代 码,但是在 Java 中却做不到。

19、String 和 StringBuilder、StringBuffer 的区别?

Java 平台提供了两种类型的字符串:String 和 StringBuffer/StringBuilder,它 们可以储存和操作字符串。其中 String 是只读字符串,也就意味着 String 引用的 字符串内容是不能被改变的。而 StringBuffer/StringBuilder 类表示的字符串对象 可以直接进行修改。StringBuilder 是 Java 5 中引入的,它和 StringBuffer 的方 法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被 synchronized 修饰,因此它的效率也比 StringBuffer 要高。

1. String 对象的 intern 方法会得到字符 串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与 String 对象 的 equals 结果是 true),如果常量池中没有对应的字符串,则该字符串将被添加 到常量池中,然后返回常量池中字符串的引用;2. 字符串的+操作其本质是创建 了 StringBuilder 对象进行 append 操作,然后将拼接后的 StringBuilder 对象用 toString 方法处理成 String 对象,这一点可以用 javap -c StringEqualTest.class 命令获得 class 文件对应的 JVM 字节码指令就可以看出来。

20、重载(Overload)和重写(Override)的区别。重载的 方法能否根据返回类型进行区分?

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性, 而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同 的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写 发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返 回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里 氏代换原则)。重载对返回类型没有特殊的要求。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值