集合框架和泛型

1,认识集合
开发应用程序时,可以使用数组来存储多个同类型的数据,但是有以下缺陷:
(1),数组长度固定不变,不能很好的适应元素数量动态变化的情况
(2),可通过数组名.length获取数组的长度,却无法直接获取数组中实际存储的元素个数
(3),数组采用在内存中分配连续空间的存储方式存储,根据元素信息查找时效率比较低,需要多次比较
针对数组的缺陷,Java提供了比数组更灵活,更实用的集合框架,可大大提高软件的开发效率,并且不同的集合可适用于不同应用场合
Java集合框架提供了一套性能优良,使用方便的接口和类,它们都位于java.util包中,Java的集合类主要由Map接口和Collection接口派生而来,其中Collection接口有两个常用的子接口即List接口和Set接口
2,List接口
Collection接口是最基本的集合接口,可以存储一组不唯一,无序的对象,List接口继承自Collection接口,可以存储一组不唯一,有序的对象
List接口常用的实现类有ArrayList和LinkedList
1,使用ArrayList类动态存储数据
ArrayList集合类对数组进行了封装,实现了长度可变,并且和数组采用相同的存储方式,而且ArrayList集合中可以添加任何类型的数据,添加的数据都将转换成Object类型
注意:
(1),调用ArrayList类的add(Object obj)方法时,添加到集合当中的数据将被转换为Object类型
(2),使用ArrayList类之前,需要导入相应的接口和类,代码如下:
import java.util.ArrayList;
import java.util.List;
ArrayList集合因为可以使用索引来直接获取元素,所以其优点是遍历元素和随机访问元素的效率比较高,但在添加和删除非尾部元素时性能低下,效率比较低
2,使用LinkedList类动态存储数据
LinkedList类是List接口的链接列表实现类,它支持实现所有List接口可选的列表的操作,并且允许元素值是任何数据,包括null
LinkedList类采用链表存储方式存储数据,优点在于插入,删除元素时效率比较高,但查找效率很低
3,Set接口
Set接口是Collection接口的另外一个常用子接口,可以存储一组唯一,无序的对象
Set接口常用的实现类有HashSet
使用HashSet类动态存储数据,HashSet集合的特点:
(1),集合内的元素是无序排列的
(2)HashSet类是非线程安全的
(3)允许集合元素值为null
注意:
使用HashSet类之前,需要导入相应的接口和类,代码如下:
import java.util.HashSet;
import java.util.Set;
4,Iterator接口
Iterator接口表示对集合进行迭代的迭代器,Iterator接口为集合而生,专门实现集合的遍历,此接口的主要方法:
(1),hasNext():判断是否存在下一个可访问的元素,如果仍有元素可以迭代,则返回true
(2),next():返回要访问的下一个元素
凡是由Collection接口派生而来的接口或者类,都实现了iterate()方法,iterate()方法返回一个Iterator对象
5,Map接口
Map接口存储一组成对的键(key)——值(value)对象,提供key到value的映射,通过key来检索,Map接口中的key不要求有序,不允许重复,value同样不要求有序,但允许重复
Map接口中存储的数据都是键——值对,最常用的Map实现类是HashMap,优点是查询指定元素效率高
注意:
(1),数据添加到HashMap集合后,所有数据的数据类型将转换为Object类型,所以从其中获取数据时需要进行强制类型转换
(2),HashMap类不保证映射的顺序,特别是不保证顺序恒久不变
6,Collections类
Collections类是Java提供的一个集合操作工具类,它包含了大量的静态方法,用于实现对集合元素的排序,查找和替换等操作
注意:
Collections和Collection的区别:前者是集合的操作类,后者是集合接口
在Java中,如果想实现一个类的对象之间比较大小,那么这个类就要实现Comparable接口,此接口强行对实现它的每个类的对象进行整体排序,这种排序被称为类的自然排序,类的compareTo()方法被称为它的自然比较方法,此方法用于比较此对象与指定对象的顺序
compareTo()方法的定义语法格式:
int compareTo(Object obj);
其中:
(1),参数:obj既要比较的对象
(2),返回值:负整数,零或正整数,根据此对象是小于,等于还是大于指定对象返回不同的值
实现此接口的对象列表(和数组)可以通过Collections.sort()方法(和Arrays.sort()方法)进行自动排序
元素之间可以比较大小之后,就可以使用Collections类的sort()方法对元素进行排序操作,Map接口本身是无序的,所以不能对Map接口做排序操作,但List接口是有序的,所以可以对List接口进行排序,注意List接口中存放的元素,必须是实现了Comparable接口的元素才可以
替换集合元素:需要把一个List集合中的所有元素都替换为相同的元素,可以使用Collections类的静态方法fill()来实现
7,认识泛型
1,泛型的定义
将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性,这就是泛型,泛型的本质就是参数化类型
泛型的定义语法格式:类1或者接口<类型实参>对象 = new 类2<类型实参>();
注意:
首先,“类2”可以是“类1”本身,可以是“类1”的子类,还可以是接口的实现类,其次,“类2”的类型实参必须与“类1”中的类型实参相同
2,泛型在集合中的应用
使用泛型集合在创建集合对象时指定集合中元素的类型,从集合中取出元素时无需进行强制类型转换,并且如果把非指定类型对象放入集合,会出现编译错误
List和ArrayList的泛型形式是List和ArrayList,Map和HashMap的泛型形式是Map<K.V>和HashMap<K.V>
泛型使集合的使用更方便,也提升了安全:
(1),存储数据时进行严格类型检查,确保只有合适类型的对象才能存储在集合中
(2),从集合中检索对象时,减少了强制类型转换
3,深入泛型
泛型的本质就是参数化类型,参数化类型的重要性在于允许创建一些类,接口和方法,其所操作的数据类型被定义为参数,可以在真正使用时指定具体的类型
学习泛型之前,需要了解的概念:
(1),参数化类型:参数化类型包含一个类或者接口,以及实际的类型参数列表
(2),类型变量:是一种非限定性标识符,用来指定类,接口或者方法的类型
泛型类就是具有一个或者多个类型参数的类
语法格式:访问修饰符class className
TypeList表示类型参数列表,每个类型变量之间以逗号分隔
泛型接口就是拥有一个或者多个类型参数的接口
语法格式:访问修饰符 interface interfaceName
泛型方法实际上就是带有类型参数的方法,可以简化代码,提高代码重用性,无论是泛型类还是非泛型类,如果需要就可以定义泛型方法
语法格式:访问修饰符<类型参数>返回值 方法名(类型参数列表)
注意:在泛型方法中,类型变量放置在访问修饰符与返回值之间
面对对象的特性同样适用于泛型类,所以泛型类也可以继承,不过,继承了泛型类的子类,必须也是泛型类
语法格式:class 子类extends父类{}

<think>好的,我现在需要帮助用户了解Java集合框架的使用原理。首先,我得回顾一下用户提供的引用内容,看看里面有哪些关键点可以提取。引用1提到了类、接口方法,特别是可变参数的使用。引用2引用3讨论了集合框架中的增强for循环Collection接口的基本操作,比如clear方法。引用4展示了在Map中的应用,比如TreeMap遍历方式。用户的需求是了解Java集合框架的使用或原理,所以需要从这两个方面展开。首先,我应该解释集合框架的整体结构,包括主要接口实现类,比如List、Set、Map等。然后,讨论如何与集合框架结合,提供类安全,避免强制类转换的错误。接下来,需要分点说明。比如集合框架的层次结构,CollectionMap的区别,常用方法。然后部分,包括类、接口、方法的定义使用,以及类擦除的概念。可能还需要对比使用前后的区别,比如在引用4中,使用后不需要强制转换Entry的键值对。用户提供的示例代码中有遍历集合的方法,比如增强for循环迭代器,这也是需要提到的部分。同时,引用2中强调在遍历时不要进行增删操作,这可能涉及到ConcurrentModificationException,可以解释一下原因。 另外,引用3中的clear方法说明集合容器本身还存在,只是元素被清空,这也是集合操作的一个注意点。在部分,类通配符边界(如<?extends T>)可能也需要提及,但用户提供的引用中没有提到,可能需要根据基础知识补充。 还需要注意用户可能存在的疑问,比如为什么使用,类擦除带来的影响,以及集合框架的线程安全性问题。不过根据引用内容,可能主要集中在基本使用原理上,而不是高级话题。 最后,生成相关问题时要围绕用户的问题,可能涉及性能、最佳实践、常见错误等。例如,如何选择集合中的类擦除原理,或者如何处理集合的并发修改异常。 现在需要组织这些内容,确保结构清晰,分点说明,同时结合引用中的示例代码,帮助用户更好地理解。还要注意使用中文,避免技术术语使用不当,保持口语化但专业。</think>### Java集合框架的使用与原理分析 #### 一、集合框架核心结构 Java集合框架分为两大根接口:`Collection``Map`。 - **`Collection`**:包含`List`(有序可重复,如`ArrayList`)、`Set`(无序唯一,如`HashSet`) - **`Map`**:键值对存储,如`TreeMap`(引用4中的示例) **关键方法示例**: ```java // Collection接口的clear方法(引用3) Collection<String> coll = new ArrayList<>(); coll.add("abc"); coll.clear(); // 清空元素但容器保留 ``` #### 二、的作用与实现 1. **类安全** 通过编译时类检查避免`ClassCastException`。例如: ```java List<String> list = new ArrayList<>(); // 只能添加String类 ``` 2. **类/接口定义** - **类**(引用1): ```java public class GenericClass<T> { ... } ``` - **接口**(引用1): ```java public interface Test<T> { T print(T t); } ``` 3. **方法** 支持可变参数(引用1): ```java public static <T> List<T> makeList(T... args) { List<T> result = new ArrayList<>(); for (T t : args) result.add(t); return result; } ``` 4. **类擦除原理** 信息在编译后会被擦除,替换为`Object`或边界类。例如`List<String>`编译后变为`List`。 #### 三、集合遍历与应用 1. **增强for循环**(引用2) ```java for (String s : coll) { // 遍历集合元素 System.out.println(s); } ``` 2. **Map的遍历**(引用4) - **`entrySet()`方式**: ```java Set<Entry<Integer, String>> entries = map.entrySet(); for (Entry<Integer, String> entry : entries) { System.out.println(entry.getKey() + " " + entry.getValue()); } ``` - **`keySet()`方式**: ```java for (Integer key : map.keySet()) { System.out.println(key + " " + map.get(key)); } ``` #### 四、设计原则与注意事项 1. **集合操作限制** 遍历时修改集合可能引发`ConcurrentModificationException`(引用2的警告)。 2. **通配符** - `<?>`:未知类 - `<? extends T>`:上界通配符 - `<? super T>`:下界通配符 3. **性能考量** - `ArrayList`基于数组,随机访问快;`LinkedList`插入删除快 - `TreeMap`基于红黑树,键有序;`HashMap`基于哈希表,查找$O(1)$ --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值