javaSE面试题

  1. &和&&的区别
    &运算符有两种用法: (1)按位与; (2)逻辑与。
    &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。
    &&之所以称为短路运算是因为,如果&&左边的表达式的值是false, 右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null 而且不是空字符串,应当写为username != null &&!username.equals("),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals 比较,否则会产生NullPointerException 异常。注意:逻辑或运算符(|)和短路或运算符(|) 的差别也是如此。
  2. 两个对象值相同 (x.equals(y) == true) ,但却可有不同的hashCode,这句话对不对?
    不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hashCode) 应当相同
    Java对于eqauls方法和hashCode 方法是这样规定的: (1 )如果两个对象相同(equals 方法返回true) ,那么它们的hashCode值一定要相同; (2)如果两个对象的hashCode相同,它们并不一定相同。 当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
    关于equals和hashCode方法,
    首先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注解。
  3. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    是值传递Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和C#中可以通过传引用或传输出参数来改变传入的参数的值。说明: Java 中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper 类中,再将Wrapper 对象传入方法)
  4. 值传递和引用传递
    1.值传递是指一个参数传递给一个函数时,函数接收的是原始值得副本。
    2.引用传递是一个参数传递给一个函数时,函数接收的是原始值的地址。
    3.java应用程序中,有且仅有一种传递,即值传递。
    4.对象是按引用传递的。
  5. char 型变量中能不能存储一个中文汉字,为什么?
    char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode (不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char 类型占2个字节(16比特) ,所以放一个中文是没问题的
    补充:使用Unicode意味着字符在JVM内部和外部有不同的表现形式,在JVM内部都是Unicode, 当这个字符被从JVM内部转移到外部时(例如存入文件系统中),需要进行编码转换。所以Java中有字节流和字符流,以及在字
    符流和字节流之间进行转换的转换流,如InputStreamReader 和OutputStreamReader, 这两个类是字节流和字符流之间的适配器类,承担了编码转换的任务;对于C程序员来说,要完成这样的编码转换恐怕要依赖于union (联合体/共用体)共享内存的特征来实现了。
  6. 执行下面的代码,得到的返回值是什么?在这里插入图片描述代码在走到第3行的时候遇到了一个MathException,这时第四行的代码就不会执行了,代码直接跳转到catch语句中,走到第6行的时候,异常机制有这么一个原则如果在catch中遇到了return或者异常等能使该函数终止的话那么有finally就必须先执行完finally代码块里面的代码然后再返回值。因此代码又跳到第8行,可惜第8行是一个return语句,那么这个时候方法就结束了,因此第6行的返回结果就无法被真正返回。如果finally仅仅是处理了一个释放资源的操作,那么该道题最终返回的结果就是2。因此上面返回值是3。7. error 和exception的区别? (2017-2-23)
    Error类和Exception类的父类都是Throwable类,他们的区别如下。
    1. Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
    2. Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
    3. Exception类又分为运行时异常( Runtime Exception) 和受检查的异常(Checked Exception ),运行时异常ArithmaticException,IlegalArgumentException,编译能通过,但是一运行就终止了 ,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch 捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
  7. 请写出你最常见的5个RuntimeException
    下面列举几个常见的RuntimeException。
    1. java.lang.NullPointerException 空指针异常;出现原因:调用了未经初始化的对象或者是不存在的对象。
    2. java.lang.ClassNotFoundException 指定的类找不到;出现原因:类的名称和路径加载错误;通常都是程序试图通过字符串来加载某个类时可能引发异常。
    3. java.lang.NumberFormatException 字符串转换为数字异常;出现原因:字符型数据中包含非数字型字符。
    4. java.lang .IndexOutOfBoundsException数组角标越界异常,常见于操作数组对象时发生。
    5. java.lang.llegalArgumentException 方法传递参数错误。
    6. java.lang.ClassCastException 数据类型转换异常。
    7. java.lang.NoClassDefFoundException 未找到类定义错误。
    8. SQLException SQL异常,常见于操作数据库时的SQL语句错误。
    9. java.lang.InstantiationException 实例化异常。
    10. java.lang.NoSuchMethodException 方法不存在异常。
  8. throw 和throws的区别
    throw:
    1. throw 语句用在方法体内,表示抛出异常,由方法体内的语句处理。
    2. throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例, 执行throw 一定是抛出了某种异常。
      throws:
    3. throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
    4. throws 主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
    5. throws 表示出现异常的一种可能性,并不一定会发生这种异常。
  9. final、 finally、 finalize 的区别?
    1. final: Final用于修饰类、成员变量和成员方法。final修饰的类,不能被继承(String、StringBuilder、StringBuffer、Math,不可变类),其中所有的方法都不能被重写(这里需要注意的是不能被重写,但是可以被重载,这里很多人会弄混),所以不能同时用abstract和final修饰类(abstract修饰的类是抽象类,抽象类是用于被子类继承的,和final起相反的作用);Final修饰的方法不能被重写,但是子类可以用父类中final修饰的方法;Final修饰的成员变量是不可变的,如果成员变量是基本数据类型,初始化之后成员变量的值不能被改变,如果成员变量是引用类型,那么它只能指向初始化时指向的那个对象,不能再指向别的对象,但是对象当中的内容是允许改变的
      final详解
    2. finally: 异常处理语句结构的一部分,表示总是执行。
    3. finalize: Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法, 当该方法被系统调用则代表该对象即将"死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法) , 不需要我们调用。
  10. switch不能用于long类型
    switch支持int和枚举类型,可以用char,byte,short,int类型,jdk1.7中支持string类型,但是不支持long类型,因为
    byte取值范围-128~127
    int的取值范围为(-2147483648~2147483647)
    short的取值范围为-32768~32767,占用2个字节
    long类型数据范为-9223372036854774808~9223372036854774807
    当long转为int是会造成精度损失
  11. 什么情况下用 "+"运算符进行字符串连接比调用StringBuffer / StringBuilder对象的append方法连接字符串性能更好?
    在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder.那么是不是可以根据这个结论推出使用" + “和StringBuilder的效果是一样的呢? 这个要从两个方面的解释。如果从运行结果来解释,那么”+ “和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。
    当然,如果连接字符串行表达式很简单(如上面的顺序结构) ,那么” + “和StringBuilder基本是一样的, 但如果结构比较复杂,如使用循环来连接字符串,那么产生的Java Byte Code就会有很大的区别
    虽然编译器将” +"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环, 就会创建一StringBuilder对象虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。
  12. 请说出下面程序的输出
    在这里插入图片描述s1 == s5 是因为常量池已经有s1的值 s5的值与s1相同直接引用同一个内存地址 s1 != s6是因为s3 s4是单独的内存地址 s6也是新的内存地址
    注意:s6 != s3 + s4;
    补充:解答上面的面试题需要知道如下两个知识点: .
    1. String对象的intern () 方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals 结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
      2.字符串的+操作其本质是创建了StringBuilder对象进行append操作,然后将拼接后的StringBuilder对象用toString方法处理成String对象,这点可以用javap -C StringEqualTest.class命令获得class文件对应的JVM字节码指令就可以看出来。
  13. Java的基本数据类型都有哪些各占几个字节
    在这里插入图片描述
    String是引用类型,底层用char数组实现的。
  14. shorts1=1;s1=s1+1;有错吗?shorts1=1;s1+=1有错吗
    前者不正确,后者正确。对于shorts1 = 1;s1 =s1 + 1;由于1是int类型,因此s1+1运算结果也是int型,需要强制转换类型才能赋值给short 型。而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 =(short)(s1 + 1);其中有隐含的强制类型转换。
  15. 下面 Integer类型的数值比较输出的结果为?
    在这里插入图片描述如果整型字面量的值在-128到127之间,那么不会new新的Integer 对象,而是直接引用常量池中的Integer 对象,所以上面的面试题中f1 == f2的结果是true, 而f3==f4 的结果是false。
  16. 在成员方法中 不能通过this调用构造方法
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值