外观
Java 的基本数据类型,集合类型?
⭐ 题目日期:
字节 - 2024/12/10
📝 题解:
Java 的基本数据类型
Java 有 8 种基本数据类型,分为四类:
类别 | 类型 | 位数 | 默认值 | 范围/说明 |
---|---|---|---|---|
整数型 | byte | 8 | 0 | -128 ~ 127 |
short | 16 | 0 | -32768 ~ 32767 | |
int | 32 | 0 | -2^31 ~ 2^31-1 | |
long | 64 | 0L | -2^63 ~ 2^63-1 | |
浮点型 | float | 32 | 0.0f | 单精度,需后缀 f (如 3.14f ) |
double | 64 | 0.0d | 双精度,默认浮点类型 | |
字符型 | char | 16 | '\u0000' | 单个 Unicode 字符(如 'A' ) |
布尔型 | boolean | - | false | 仅 true /false |
注意:基本数据类型的变量直接存储值,而非对象。在集合中需使用对应的包装类(如 Integer
、Double
)。
Java 的集合类型(Collection Framework)
Java 集合框架分为 Collection 和 Map 两大类:
1. Collection 接口(单元素集合)
- List(有序,可重复):
ArrayList
:基于动态数组,查询快(O(1)),增删慢。LinkedList
:基于双向链表,增删快(O(1)),查询慢(O(n))。Vector
:线程安全的动态数组(已过时,可用CopyOnWriteArrayList
替代)。
- Set(无序,不可重复):
HashSet
:基于哈希表,快速插入和查询(O(1))。LinkedHashSet
:保持插入顺序的HashSet
。TreeSet
:基于红黑树,元素按自然顺序或自定义顺序排序(O(log n))。
- Queue(队列):
LinkedList
:可作普通队列或双端队列(Deque
)。PriorityQueue
:基于堆的优先级队列。
2. Map 接口(键值对集合)
HashMap
:基于哈希表,键无序,允许null
键/值(非线程安全)。LinkedHashMap
:保持插入顺序的HashMap
。TreeMap
:基于红黑树,键按自然顺序或自定义顺序排序。Hashtable
:线程安全的哈希表(已过时,建议用ConcurrentHashMap
)。
3. 线程安全集合
ConcurrentHashMap
:分段锁实现的线程安全HashMap
。CopyOnWriteArrayList
:写时复制的线程安全List
。BlockingQueue
:支持阻塞操作的线程安全队列(如ArrayBlockingQueue
)。
示例代码
// 基本数据类型
int num = 10;
double price = 9.99;
char grade = 'A';
// 集合示例
List<String> list = new ArrayList<>();
list.add("Java");
Set<Integer> set = new HashSet<>();
set.add(100);
Map<String, Integer> map = new HashMap<>();
map.put("age", 25);
Queue<String> queue = new LinkedList<>();
queue.offer("task1");
关键区别
- 数组 vs 集合:数组大小固定,集合动态扩容。
- List vs Set:List 允许重复和顺序访问,Set 去重。
- HashMap vs TreeMap:HashMap 基于哈希表(无序),TreeMap 有序。
提示:根据场景选择数据结构。例如,高频查询用 ArrayList
,去重用 HashSet
,排序用 TreeSet
,线程安全用 ConcurrentHashMap
。
面试高频问题扩展
- HashMap vs. Hashtable
- HashMap 非线程安全,Hashtable 线程安全(方法加
synchronized
)。 - HashMap 允许
null
键值,Hashtable 不允许。
- HashMap 非线程安全,Hashtable 线程安全(方法加
- ArrayList vs. LinkedList
- 随机访问:ArrayList 更快(数组索引);增删操作:LinkedList 更快(指针操作)。
- ConcurrentHashMap 如何保证线程安全?
- JDK 1.7:分段锁(Segment),减少锁竞争。
- JDK 1.8:CAS + synchronized 锁单个桶(Node)。
- 集合的 fail-fast 机制
- 迭代时检测到结构性修改(如并发修改),抛出
ConcurrentModificationException
。
- 迭代时检测到结构性修改(如并发修改),抛出
- 如何选择集合类型?
- 查询多:ArrayList、HashMap;增删多:LinkedList、LinkedHashMap;排序需求:TreeSet、TreeMap。
总结
- 基本数据类型:关注内存占用、范围及默认值。
- 集合类型:掌握底层实现、线程安全、适用场景及性能差异。
- 面试核心:结合源码理解设计原理(如 HashMap 的哈希冲突解决、ConcurrentHashMap 的分段锁机制)。