2019年总结:Java中高级面试题228道系列(6)

2019年Java面试题中高级系列228道

Java面试题(一)

第一篇更新1~20题的答案解析

juejin.im/post/5de8c6…

第二篇更新21~50题答案解析
juejin.im/post/5dea1d…

第三篇更新51~95题答案解析
juejin.im/post/5decd3…


Java面试题(二)

第四篇更新1~20题答案解析

第五篇更新21~50题答案解析

juejin.im/post/5def4d…



Java面试题(二)

51、ArrayList 与 LinkedList 的不区别?
52、用哪两种方式来实现集合的排序?
53、Java 中怎么打印数组?
54、Java 中的 LinkedList 是单向链表还是双向链表?
55、Java 中的 TreeMap 是采用什么树实现的?(答案)
56、Hashtable 与 HashMap 有什么不同之处?
57、Java 中的 HashSet,内部是如何工作的?
58、写一段代码在遍历 ArrayList 时移除一个元素?
59、我们能自己写一个容器类,然后使用 for-each 循环码?
60、ArrayList 和 HashMap 的默认大小是多数?
61、有没有可能两个不相等的对象有有相同的 hashcode?
62、两个相同的对象会有不同的的 hash code 吗?
63、我们可以在 hashcode() 中使用随机数字吗?
64、Java 中,Comparator 与 Comparable 有什么不同?
66、在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?
67、Java 中怎么创建 ByteBuffer?
68、Java 中,怎么读写 ByteBuffer ?
69、Java 采用的是大端还是小端?
70、ByteBuffer 中的字节序是什么?
71、Java 中,直接缓冲区与非直接缓冲器有什么区别?
72、Java 中的内存映射缓存区是什么?
73、socket 选项 TCP NO DELAY 是指什么?
74、TCP 协议与 UDP 协议有什么区别?
75、Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答案)
76、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?
77、说出几点 Java 中使用 Collections 的最佳实践
78、说出至少 5 点在 Java 中使用线程的最佳实践。
79、说出 5 条 IO 的最佳实践(答案)
80、列出 5 个应该遵循的 JDBC 最佳实践

本篇更新21-50题的答案

51、ArrayList 与 LinkedList 的不区别?

最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。

52、用哪两种方式来实现集合的排序?

你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。

53、Java 中怎么打印数组?

你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println()方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。

54、Java 中的 LinkedList 是单向链表还是双向链表?

是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。

55、Java 中的 TreeMap 是采用什么树实现的?

Java 中的 TreeMap 是使用红黑树实现的。

56、Hashtable 与 HashMap 有什么不同之处?

这两个类有许多不同的地方,下面列出了一部分:
a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。
b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。
c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。

57、Java 中的 HashSet,内部是如何工作的?

HashSet 的内部采用 HashMap 来实现。由于 Map 需要 key 和 value,所以所有 key 的都有一个默认 value。类似于 HashMap,HashSet 不允许重复的key,只允许有一个 null key,意思就是 HashSet 中只允许存储一个 null 对象。

58、写一段代码在遍历 ArrayList 时移除一个元素?

该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。

59、我们能自己写一个容器类,然后使用 for-each 循环码?

可以,你可以写一个自己的容器类。如果你想使用 Java 中增强的循环来遍历,你只需要实现 Iterable 接口。如果你实现 Collection 接口,默认就具有该属性。

60、ArrayList 和 HashMap 的默认大小是多数?

在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16 个元素(必须是 2 的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段:
// from ArrayList.java JDK 1.7
private static final int DEFAULT_CAPACITY = 10;
//from HashMap.java JDK 7
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// aka 16复制代码

61、有没有可能两个不相等的对象有有相同的 hashcode?

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的 hashcode 值,但是没有关于不相等对象的任何规定。

62、两个相同的对象会有不同的的 hash code 吗?

不能,根据 hash code 的规定,这是不可能的。

63、我们可以在 hashcode() 中使用随机数字吗?

不行,因为对象的 hashcode 值必须是相同的。参见答案获取更多关于 Java 中重写 hashCode() 方法的知识。

64、Java 中,Comparator 与 Comparable 有什么不同?

Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。

65、为什么在重写 equals 方法的时候需要重写 hashCode 方法?

因为有强制的规范指定需要同时重写 hashcode 与 equal 是方法,许多容器类,如 HashMap、HashSet 都依赖于 hashcode 与 equals 的规定。

66、在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?

这个需要看你是并行处理还是串行处理了。

67、Java 中怎么创建 ByteBuffer?

byte[] bytes = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(bytes);复制代码

68、Java 中,怎么读写 ByteBuffer ?

69、Java 采用的是大端还是小端?

70、ByteBuffer 中的字节序是什么?

71、Java 中,直接缓冲区与非直接缓冲器有什么区别?

72、Java 中的内存映射缓存区是什么?

73、socket 选项 TCP NO DELAY 是指什么?

74、TCP 协议与 UDP 协议有什么区别?

75、Java 中,ByteBuffer 与 StringBuffer 有什么区别?

76、Java 中,编写多线程程序的时候你会遵循哪些最佳实践?

a)给线程命名,这样可以帮助调试。
b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。
c)如果可以,更偏向于使用 volatile 而不是 synchronized。
d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

77、说出几点 Java 中使用 Collections 的最佳实践

a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是Vector。
b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。
c)使用接口代表和访问集合,如使用 List 存储 ArrayList,使用 Map 存储HashMap 等等。
d)使用迭代器来循环集合。
e)使用集合的时候使用泛型。

78、说出至少 5 点在 Java 中使用线程的最佳实践。

这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该:
a)对线程命名
b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。
c)使用线程池

79、说出 5 条 IO 的最佳实践

IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你应用的关键路径上避免 IO 操作。下面是一些你应该遵循的 Java IO 最佳实践:
a)使用有缓冲区的 IO 类,而不要单独读取字节或字符。
b)使用 NIO 和 NIO2
c)在 finally 块中关闭流,或者使用 try-with-resource 语句。
d)使用内存映射文件获取更快的 IO。

80、列出 5 个应该遵循的 JDBC 最佳实践

有很多的最佳实践,你可以根据你的喜好来例举。下面是一些更通用的原则:
a)使用批量的操作来插入和更新数据
b)使用 PreparedStatement 来避免 SQL 异常,并提高性能。
c)使用数据库连接池
d)通过列名来获取结果集,不要使用列的下标来获取。

最后

欢迎大家关注我的公众号【程序员追风】,整理了1000道2019年多家公司java面试题400多页pdf文档,文章都会在里面更新,整理的资料也会放在里面。

喜欢文章记得点个赞哟,感谢支持!



猜你喜欢

转载自juejin.im/post/5df39302f265da33d039d2d8