JavaSE三个特殊类 --- 包装类

本文深入讲解Java中的包装类,包括其定义、使用场景、装箱与拆箱过程,以及与基本数据类型之间的转换方法。特别关注Integer类在不同数值范围内的对象创建方式,和编码规范建议。
  • 包装类---包装类就是讲基本数据类型封装到类中。

范例:

 

这个时候的IntDemo类实际上就是int数据类型的包装类,利用intValue就可以实现基本数据类型变为对象的需求。

结论:将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。

 

在Java中为了方便开发,专门提供了包装类的使用,而对于包装类的使用,提供了两种类型。

  1. 对象型(Object的直接子类):Boolean , Character(char);
  2. 数据型(Number的直接子类):Byte , Double , Short , Long , Integer(int) , Float;
  • 装箱与拆箱

装箱:将基本数据类型变为包装类对象,利用每一个包装类提供的构造方法实现装箱处理。

拆箱:将包装类中包装的基本数据类型取出,利用Number类中提供的六种方法(XXXValue( ),例如:intValue( )  )。

范例:手工装箱,拆箱

范例:自动装箱,拆箱

这个时候,依然存在“==”和“equals( )”问题

观察以下一段代码:   (!!!大坑)

说明:对于Integer  var  = ?在[-128,127]区间内,Integer对象是在常量池产生,会复用已有对象,可以直接用“==”来判断值;但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,推荐使用equals( )方法进行判断。

 

阿里编码规范: 使用int还是Integer?

  1. 【强制】所有的POJO类属性必须使用包装数据类型。
  2. 【强制】RPC方法的返回值和参数必须使用包装数据类型。
  3. 【推荐】所有的局部变量使用基本数据类型。
  • 字符串与基本数据类型转换

  1. String变为int类型(Integer类):public static int parseInt(String s) throws NumberFormatException
  2. String变为double类型(Double类):public static double parseDouble(String s) throws NumberFormatException
  3. String变为boolean类型(Boolean类):public static boolean parseBoolean(String s)

范例:将字符串变为int型

范例:将字符串变为double

注意:将字符串转为数字时,如果字符串的组成由非数字,那么转换就会出现错误(NumberFormatException)。

而字符串与boolean转换就不受此影响。

范例:将字符串转换为boolean

  • 基本数据类型变为字符串:
  1. 任何数据类型使用了“+”连接空白字符串就变为了字符串类型。
  2. 使用String类中提供的valueOf( )方法,此方法不产生垃圾。

 

<think>我们正在整理JavaSE集合框架的详细知识点。根据引用[1][2][3],我们可以将知识点分为以下几个部分:1.集合框架的概述(为什么需要集合框架)2.集合框架的核心接口与(Collection和Map两大体系)3.具体集合的特性与使用(List、Set、Map的实现)4.集合的遍历与工具5.集合的性能比较与选择6.集合中的对象要求(如Comparable和Comparator)7.典型代码示例我们将结合引用内容,详细展开每个部分,并在适当位置添加引用标记。注意:引用[4]主要涉及数组和冒泡排序,与集合直接关联不大,但可以对比数组与集合的区别。下面开始详细整理:</think>### JavaSE 集合框架详细知识点解析 #### 一、集合框架概述 1. **核心作用**:替代数组实现动态数据结构,支持对象的高效存储与操作[^2] 2. **两大体系**: - **Collection**:单列元素集合(List/Set/Queue) - **Map**:键值对集合(Key-Value)[^2] 3. **优势对比数组**: - 动态扩容(无需预定义大小) - 丰富API(增删改查、排序、过滤) - 类型安全(泛型支持) #### 二、Collection 体系详解 1. **List 接口**(有序可重复) - 实现- `ArrayList`:动态数组,随机访问$O(1)$,插入删除$O(n)$ - `LinkedList`:双向链表,插入删除$O(1)$,随机访问$O(n)$ - 核心方法: ```java list.add(index, element); // 指定位置插入 list.get(index); // 索引访问 ``` 2. **Set 接口**(无序不可重复) - 去重机制:依赖`equals()`和`hashCode()`[^2] - 实现- `HashSet`:哈希表实现,操作$O(1)$ ```java Set<String> set = new HashSet<>(); set.add("Java"); // 成功 set.add("Java"); // 被忽略[^1] ``` - `TreeSet`:红黑树实现,自动排序$O(\log n)$ ```java Set<Integer> treeSet = new TreeSet<>(); treeSet.add(5); treeSet.add(2); // 输出[2,5][^1] ``` #### 三、Map 体系详解 1. **核心特性**: - Key唯一性(重复Key覆盖旧值) - 键值对存储结构[^3] 2. **实现**: - `HashMap`:哈希表实现,快速查找$O(1)$ ```java Map<String, Integer> map = new HashMap<>(); map.put("A", 100); map.get("A"); // 返回100 ``` - `TreeMap`:红黑树实现,Key自动排序 ```java Map<Integer, String> treeMap = new TreeMap<>(); treeMap.put(3, "Three"); treeMap.put(1, "One"); // 自动排序{1=One, 3=Three} ``` #### 四、关键技术与机制 1. **迭代器(Iterator)**: - 统一遍历接口 - 快速失败机制(遍历中修改集合抛异常) - 特殊迭代器: ```java // Map的Entry迭代 for(Map.Entry<String, Integer> entry : map.entrySet()) { entry.getKey(); entry.getValue(); }[^3] ``` 2. **对象可比性**: - `Comparable`:自然排序(对象实现compareTo) - `Comparator`:自定义排序(独立比较器) ```java TreeSet<String> customSet = new TreeSet<>( (s1, s2) -> s2.length() - s1.length() // 按长度降序 ); ``` 3. **哈希机制**: - `HashSet/HashMap`依赖`hashCode()`确定存储位置 - 冲突解决:链表→红黑树(Java8优化) #### 五、工具与性能优化 1. **Collections 工具**: ```java Collections.sort(list); // 排序 Collections.shuffle(list); // 随机打乱 Collections.synchronizedList(list); // 线程安全包装 ``` 2. **内存优化策略**: - ArrayList:动态扩容(默认1.5倍) - HashMap:负载因子(0.75)控制扩容 - 避免装箱:使用`IntStream`等原始类型集合 #### 六、集合选择指南 | 场景 | 推荐集合 | 理由 | |-----------------------|-------------------|--------------------------| | 高频随机访问 | ArrayList | 数组索引$O(1)$访问 | | 频繁插入删除 | LinkedList | 链表节点操作$O(1)$ | | 去重需求 | HashSet | 哈希去重$O(1)$ | | 范围查询/排序遍历 | TreeSet/TreeMap | 红黑树有序结构$O(\log n)$| | 高并发环境 | ConcurrentHashMap| 分段锁线程安全 | #### 七、典型代码实践 ```java // 对象去重示例(需正确重写equals和hashCode) class Student { private String name; private int age; @Override public boolean equals(Object o) { /* 比较字段 */ } @Override public int hashCode() { return Objects.hash(name, age); // 确保相同对象哈希值一致[^2] } } Set<Student> students = new HashSet<>(); students.add(new Student("Alice", 20)); students.add(new Student("Alice", 20)); // 自动去重 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值