1、hashmap的底层设计原理以及扩容规则,是否线程安全,如何线程安全。
- 底层原理:数组 + 链表 + 红黑树。HashMap 的底层实现是一个数组,数组中的每个元素是一个链表或红黑树(JDK 1.8 以后,当链表长度超过一定阈值时,链表会转换成红黑树)。
- 扩容规则:HashMap 默认的初始容量是 16,扩容时,HashMap 的容量会扩大到原来的两倍。
- 是否线程安全:HashMap 是非线程安全的。在多线程环境下,如果多个线程同时对 HashMap 进行操作,可能会导致不可预知的行为,比如数据丢失、数据不一致等。
- 如何实现线程安全:使用 ConcurrentHashMap、使用读写锁、手动同步
2、八大基本数据类型以及长度
-
byte:字节类型,用于表示有符号的8位整数。范围是 -128 到 127,默认值为 0,占用1个字节。
-
short:短整型,用于表示有符号的16位整数。范围是 -2^15 到 2^15-1,默认值为 0,占用2个字节。
-
int:整型,用于表示有符号的32位整数。范围是-2^31到 2^31-1,默认值为 0,占用4个字节。
-
long:长整型,用于表示有符号的64位整数。范围是 -2^63 到 2^63 ,默认值为 0L,占用8个字节。
-
float:浮点型,用于表示符合IEEE 754标准的单精度浮点数。占用4个字节。
-
double:双精度浮点型,用于表示符合IEEE 754标准的双精度浮点数。占用8个字节。
-
char:字符型,用于表示单个16位Unicode字符。范围是 '\u0000' 到 '\uffff',默认值为 '\u0000',占用2个字节。
-
boolean:布尔型,用于表示逻辑上的真或假。在JVM内部,boolean类型通常使用int类型来实现,因此占用4个字节,但boolean数组在内存中是以位的形式存储的,每个boolean值占用1位。
3、多线程创建四种方式,以及callable和runnable的区别,如何获取返回值
多线程创建四种方式:继承 Thread 类、实现 Runnable 接口、实现callable接口、使用线程池
callable和runnable的区别:前者有返回值还可以抛异常,后者没有;落地方法不一样,一个是run,一个是call
如何获取 Callable 任务的返回值:将 Callable
实例包装在 FutureTask
中,然后将 FutureTask
对象作为线程的任务执行。通过调用 FutureTask
的 get
方法,可以获取 Callable
任务的返回值。