Java 面试中遇到的坑

1.StringBuilder/StringBuffer替代String拼接面试中经常问

      String,StringBuilder,StringBuffer的区别

    String类作为java语言中最常见的字符串类被广泛使用,如果在做大量字符串拼接效率时变得比较低,因为虚拟机需要不断地将对象引用指向新的地址。

  因此,一般方法内的私有变量推荐使用stringBuilder来完成

            如果是多线程需要同步的自然选用stringBuffer。

2. 对参数未做空验证,就做判断值相等

     Java 面试中遇到的坑

    下面的写法将常量放到方法左边,能防止NPE。  

    Java 面试中遇到的坑 

  关于这道题需要查看String类中equals的实现方法,当左边为Null时会出现NPE。因此后续代码中需要保证equals方法左边变量不为null。

 3. Integer的Cache缓存

    Integer a = 128;

    Integer b = 128;

    System.out.println(a==b);

    打印的结果为false

  而:

    Integer a = 127;

    Integer b = 127;

    System.out.println(a==b);

    打印结果为true

  为啥?通过源码可知Integer的valueof()方法缓存了-127-128的数值,为什么要缓存该部分值呢?因为这部分值使用频率相比较高,可以提升效率。

  Integer类型当正整数小于128时是在内存栈中创建值的,并将对象指向这个值,这样当比较两个栈引用时因为是同一地址引用两者则相等。当大于127时将会调用new Integer(),两个整数对象地址引用不相等了。这就是为什么当值为128时不相等,当值为100时相等了。

4、将变量作为参数传递,在方法中改变参数值,变量的值改变了么?

        下图total值到底是几?

        Java 面试中遇到的坑

将一个私有变量作为形参传递赋值并不会改变参数原有的值,但是如果将一个对象作为参数传递改变属性,对象的属性值就会随着改变。因此total的值仍然为0。

5、由数组转换的list,只能循环遍历,而不能看长度,增加元素,删除元素,这是为何?

      下图代码执行竟然出错!

       Java 面试中遇到的坑

     因为将数组转换的列表其实不是我们经常使用的arrayList,但只是数组中内部定义的一种数据结构类型,本质还是原数组而并非列表,因此当向列表添加元素就会出现错误。

6、遍历ArrayList的时候执行添加删除,会出现什么问题?

      Java 面试中遇到的坑

  在列表中移除最后一个元素按说应该没有问题的,但是这个算法还是出现了错误,主要是这种写法的列表循环遵循下表索引查找,当移除某个元素时,上次计算出来的长度超过了当前列表长度,故而会出现越界错误。

7、在指定目录下创建文件目录,到底使用哪一种呢,为何第一次没创建目录而第二次创建?

  Java 面试中遇到的坑

 mkdirs()可以建立多级文件夹

 mkdir()只会建立一级的文件夹。

 这个主要依靠java底层调用操作系统的实现。

8、面试官:你能说出来java中实现多线程的几种方法么?

 面试者:继承Thread类和实现runnable接口!
 面试官:除此以外还有方法么?
 面试者:就这两种实现啊?!
 面试官:我们聊点别的,呵呵。

 继承Callable接口,实现call方法,配合FutureTask

其实 实现多线程还可以实现Callable接口,利用task来接受异步线程的执行结果。

不同的地方:(可以获取执行结果)。

9、我只是想让这个好好循环三次,有什么问题么?

 Java 面试中遇到的坑 

这道题主要是犯了整数符号位的问题了

Integer.MAX_VALUE加上1以后的数值这道陷阱题就解决了。

10、这个一直没有弄明白,到底返回哪个true还是false?

Java 面试中遇到的坑

这道题大家需要弄明白finally的使用场景,主要是捕获异常以后必须要执行的代码,大多是关闭流之类的。即使try的代码块已经返回结果但程序仍然会执行finally里面的代码,因此上题返回false。

大家可以看看下面这道题返回结果是多少?

Java 面试中遇到的坑

11、两个float类型数据相减会丢失精度,尾部带着常常的一串数字

Java 面试中遇到的坑

两个float类型数据相减会丢失精度,尾部带着常常的一串数字。如果实际场景要做计算我给你两个思路:第一可以用bigdecimal来计算,第二先将单位做成整数再做除法。