2021 年 Java 面试题抢先看,够全!中篇,java 基础程序
最明显的区别是 ArrrayList 底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构书链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。更多细节的讨论参见答案。
[](
)45)用哪两种方式来实现集合的排序?(答案)
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。
[](
)46)Java 中怎么打印数组?(answer 答案)
你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。
需要更多大厂面试资料的话也可以[点击直接进入,免费获取!](
)暗号:CSDN
[](
)47)Java 中的 LinkedList 是单向链表还是双向链表?(答案)
是双向链表,你可以检查 JDK 的源码。在 Eclipse,你可以使用快捷键 Ctrl + T,直接在编辑器中打开该类。
[](
)48)Java 中的 TreeMap 是采用什么树实现的?(答案)
Java 中的 TreeMap 是使用红黑树实现的。
[](
)49) Hashtable 与 HashMap 有什么不同之处?(答案)
这两个类有许多不同的地方,下面列出了一部分:a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增加的。b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,所以会更快。c)Hashtable 不允许有个空的 key,但是 HashMap 允许出现一个 null key。更多的不同之处参见答案。
[](
)50)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
[](
)51)有没有可能两个不相等的对象有有相同的 hashcode?
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。相等 hashcode 值的规定只是说如果两个对象相等,必须有相同的 hashcode 值,但是没有关于不相等对象的任何规定。
[](
)52)两个相同的对象会有不同的的 hash code 吗?
不能,根据 hash code 的规定,这是不可能的。
[](
)九、Java IO 和 NIO 的面试题
IO 是 Java 面试中一个非常重要的点。你应该很好掌握 Java IO,NIO,NIO2 以及与操作系统,磁盘 IO 相关的基础知识。下面是 Java IO 中经常问的问题。
[](
)53)在我 Java 程序中,我有三个 socket,我需要多少个线程来处理?
[](
)54)Java 中怎么创建 ByteBuffer?
[](
)55)Java 中,怎么读写 ByteBuffer ?
[](
)56)Java 采用的是大端还是小端?
[](
)57)ByteBuffer 中的字节序是什么?
[](
)58)Java 中,直接缓冲区与非直接缓冲器有什么区别?(答案)
[](
)59)Java 中的内存映射缓存区是什么?(answer 答案)
[](
)60)socket 选项 TCP NO DELAY 是指什么?
[](
)61)TCP 协议与 UDP 协议有什么区别?(answer 答案)
[](
)62)Java 中,ByteBuffer 与 StringBuffer 有什么区别?(答案)
[](
)十、Java 最佳实践的面试问题
包含 Java 中各个部分的最佳实践,如集合,字符串,IO,多线程,错误和异常处理,设计模式等等。
[](
)63)Java 中,编写多线程程序的时候你会遵循哪些最佳实践?(答案)
这是我在写 Java 并发程序的时候遵循的一些最佳实践:
a)给线程命名,这样可以帮助调试。
b)最小化同步的范围,而不是将整个方法同步,只对关键部分做同步。
c)如果可以,更偏向于使用 volatile 而不是 synchronized。
d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通信,如 BlockingQueue,CountDownLatch 及 Semeaphore。
e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。
[](
)64)说出几点 Java 中使用 Collections 的最佳实践(答案)
这是我在使用 Java 中 Collectionc 类的一些最佳实践:a)使用正确的集合类,例如,如果不需要同步列表,使用 ArrayList 而不是 Vector。b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。c)使用接口代表和访问集合,如使用 List 存储 ArrayList,使用 Map 存储 HashMap 等等。d)使用迭代器来循环集合。e)使用集合的时候使用泛型。
[](
)65)说出至少 5 点在 Java 中使用线程的最佳实践。(答案)
这个问题与之前的问题类似,你可以使用上面的答案。对线程来说,你应该:
a)对线程命名
b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。
c)使用线程池
评论