2019年Java面试题基础系列228道(6)

5一、ArrayList 与 LinkedList 的不区别?vue

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

5二、用哪两种方式来实现集合的排序?面试

  你可使用有序集合,如 TreeSet 或 TreeMap,你也可使用有顺序的的集合,如 list,而后经过 Collections.sort() 来排序。数据库

5三、Java 中怎么打印数组?数组

你可使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。因为数组没有实现 toString() 方法,因此若是将数组传递给 System.out.println()方法,将没法打印出数组的内容,可是 Arrays.toString() 能够打印每一个元素。缓存

5四、Java 中的 LinkedList 是单向链表仍是双向链表?数据结构

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

5五、Java 中的 TreeMap 是采用什么树实现的?并发

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

5六、Hashtable 与 HashMap 有什么不一样之处?

这两个类有许多不一样的地方,下面列出了一部分:

a) Hashtable 是 JDK 1 遗留下来的类,而 HashMap 是后来增长的。

b)Hashtable 是同步的,比较慢,但 HashMap 没有同步策略,因此会更快。

c)Hashtable 不容许有个空的 key,可是 HashMap 容许出现一个 null key。

5七、Java 中的 HashSet,内部是如何工做的?

HashSet 的内部采用 HashMap 来实现。因为 Map 须要 key 和 value,因此全部 key 的都有一个默认 value。相似于 HashMap,HashSet 不容许重复的key,只容许有一个 null key,意思就是 HashSet 中只容许存储一个 null 对象。

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

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

5九、咱们能本身写一个容器类,而后使用 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 1

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

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

6二、两个相同的对象会有不一样的的 hash code 吗?

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

6三、咱们能够在 hashcode() 中使用随机数字吗?

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

6四、Java 中,Comparator 与 Comparable 有什么不一样?

  Comparable 接口用于定义对象的天然顺序,而 comparator 一般用于定义用户定制的顺序。Comparable 老是只有一个,可是能够有多个 comparator 来定义对象的顺序。

6五、为何在重写 equals 方法的时候须要重写 hashCode 方法?

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

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

这个须要看你是并行处理仍是串行处理了。

6七、Java 中怎么建立 ByteBuffer?

byte[] bytes = new byte[10];
ByteBuffer buf = ByteBuffer.wrap(bytes);

6八、Java 中,怎么读写 ByteBuffer ?

6九、Java 采用的是大端仍是小端?

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

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

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

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

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

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

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

a)给线程命名,这样能够帮助调试。

b)最小化同步的范围,而不是将整个方法同步,只对关键部分作同步。

c)若是能够,更偏向于使用 volatile 而不是 synchronized。

d)使用更高层次的并发工具,而不是使用 wait() 和 notify() 来实现线程间通讯,如 BlockingQueue,CountDownLatch 及 Semeaphore。

e)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

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

a)使用正确的集合类,例如,若是不须要同步列表,使用 ArrayList 而不是Vector。

b)优先使用并发集合,而不是对集合进行同步。并发集合提供更好的可扩展性。

c)使用接口表明和访问集合,如使用 List 存储 ArrayList,使用 Map 存储HashMap 等等。

d)使用迭代器来循环集合。

e)使用集合的时候使用泛型。

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

  这个问题与以前的问题相似,你可使用上面的答案。对线程来讲,你应该:

a)对线程命名

b)将线程和任务分离,使用线程池执行器来执行 Runnable 或 Callable。

c)使用线程池

7九、说出 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)经过列名来获取结果集,不要使用列的下标来获取。

相关文章
相关标签/搜索