Java学习笔记----关于集合框架
集合框架的概述
集合、数组都是多个数据进行存储操作的结构,简称java容器
说明:此时的存储,主要指的是内存层面的存储,不涉及到持久化的存储
数组在存储多个数据方面的特点
一旦初始化以后,长度就确定 --------> 不可修改长度
数组一旦定义好,其元素的类型也就确定了 -----------> 只能操作指定类型的数据
缺点
一旦初始化以后,其长度就不可修改
数组中提供的方法非常有限,对于添加、删除、插入数据等操作,非常不便
获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
数组存储数据的特点:有序、可重复,对于无序、不重复的需求,无法满足
集合框架
- Collection接口 :单列数据,定义了存取一组对象的方法的集合
- List接口:元素有序、可重复的集合 -----> “动态”数组
- ArrayList \ LinkedList \ Vector
- Set接口:元素无序、不可重复的集合
- HashSet \ LinkedHashSet \ TreeSet
- List接口:元素有序、可重复的集合 -----> “动态”数组
- Map接口:双列数据,保存具有映射关系"key - value对"的集合
- HashMap \ LinkedHashMap \ TreeMap \ Hashtable \ Properties
Collection接口中方法的使用
向Collection接口的实现类的对象中添加obj时,要求obj所在类要重写equals()
-
Collection coll = new ArrayList(); add(Object e):将元素e添加到集合coll中; size():获取添加的元素的个数; addAll(Collection coll1):将coll1集合中所有元素添加到当前的集合中; clear():清空所有元素; isEmpty():判断当前集合是否为空;
-
contains():判断当前集合中是否包含obj; // 判断时会调用obj对象所在类的equals(); containsAll(Collection coll2):判断形参coll2中所有元素是否都存在于当前集合中
-
remove(Object obj):移除当前集合中obj元素; removeAll(Collection coll1):从当前集合中移除coll1集合中所包含的元素; retainAll(Collection call1):获取当前集合中和coll1集合的交集,并返回给当前集合
-
hashCode():返回当前对象的哈希值; // 集合 ------------> 数组 toArray(): Object[] arr = coll.toArray(); // 拓展: 数组 -----------> 集合 asList(): //例子 List<String> list = Array.asList(new String[]{"aa", "bb"}); iterator():返回Iterator接口的实例,用于遍历集合元素,放在IteratorTest.java中测试
集合元素的遍历操作:使用迭代器接口
Itetator iterator = coll.iterator();
方式一:iterator.next()
方式二:for循环
方式三(推荐):
while(iterator.hasnext()){
System.out.println(iterator.next());
}
迭代器执行原理
Iterator迭代器remove()的使用
内部定义了remove(),可以删除遍历的时候,删除集合中的元素,此方法不同于集合直接调用remove();
Iterator iterator = coll.interator();
while(iterator.hasnext){
Object obj = iterator.next();
if("Tom".equals(obj)){
iterator.remove();
}
}
Collection子接口之一:List接口
List集合类中元素有序、且可重复
ArrayList:作为List接口的主要实现类
线程不安全,效率高
底层使用Object[] elementData存储
LinkedList
对于频繁的插入、删除操作,使用此类效率比ArrayList效率高
底层使用双向链表存储
Vector:作为List接口的古老接口
线程安全,效率低
底层使用Object[] elementData存储
面试题:ArrayList \ LinkedList \ Vector 三者的异同
同:三者类都是实现了List接口,存储数据的特点相同:存储有序、可重复的数据
异:分析三者的特点
List子接口之二:LinkedList
常用方法
总结:常用方法
增:add(Object obj)
删:remove(int index) \ remove(Object obj)
改:set(int index, Object obj)
查:get(int index)
插入:add(int index, Object)
长度:size()
遍历:
- Iterator迭代器方式
- 增强for循环
- 普通的循环
Collection子接口之二:Set接口
存储无序、不可重复的数据
无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值
不可重复性:保证添加的元素按照equals()判断时,不能返回ture,即相同的元素只能添加一个
要求
- 对于存放在Set容器中的对象,对应的类一定要重写equals()和hashCode()方法,以实现对象相等规则,即相等的对象必须具有相等的散列码
Set实现类之一:HashSet
线程不安全,可以存储null值
Set实现类之二:LinkedHashSet
作为HashSet的子类,遍历其内部数据时,可以按照添加的顺序遍历
双链点,一个结点两端是指针域,中间是数据域
LinkedHashSet作为HashSet的子类,在添加数据的同时,每个数据还维护了两个引用,记录此数据前一个和后一个数据
优点:对于频繁的遍历操作,LinkedHashSet效率高于HashSet
Set实现类之三:TreeSet
自然排序(实现Compare接口)
可以按照添加对象的指定属性,进行排序
自然排序中,比较两个对象是否相同的标准为:compareTo()返回0,不再是equals().
注
不能添加不同类的对象
定制排序(Comparator)
Comparator com = new Comparator(){
@Override
public int compare(Object obj1, Object obj2){
return 0;
}
};
TreeSet set = new TreeSet(com);
Map接口
双列数据,存储key - value 对数据
HashMap
- 作为Map的主要实现类
- 线程不安全的,效率高
- 能存储null的key和value
linkedHashMap
- 保证遍历map元素时,可以按照添加的顺序实现遍历
- 对于频繁的遍历操作,此类执行效率高于HashMap
原因
在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素
========================
TreeMap
保证按照添加的key - value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序,底层使用红黑树
========================
Hashtable
- 线程安全的,效率低
- 不能存储null的key和value
Propertise
- 常用于处理配置文件
- key和value都是String类型
HashMap的底层
数组 + 链表 JDK 7 以及之前
数组 + 链表 + 红黑树 jdk8
Map的常用方法
添加、删除、修改
Object put(Object key, Object value);
// 将指定的key - value存放到map中
void putAll(Map m);// 将m中的所有key - value对存放到当前map中
Object remove(Object key); // 移除指定key的key-value对,并返回value
void clear(); // 清除当前map中所有的数据
元素查询
Object get();
boolean containKey(Object key);
boolean containValue(Object value);
int size();
boolean isEmpty();
boolean equals(Object obj);
元视图操作的方法
Set keySet(); // 返回所有key构成的Set集合
Collection values(); // 返回所有value构成的Collection集合
Set entrySet(); // 返回所有key - value对构成的Set集合
遍历所有的key - value
方式一:entrySet()
Set set = map.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext){
Object obj = iterator.next();
Map.Entry entry = (Map.Enter) obj;
System.out.println(entry.getKey() + "," + entry.getValue);
}
方式二:
Set keySet = map.keySet();
Iterator iterator = set.iterator();
while(iterator.hasNext){
Object key = iterator.next();
Object value = map.get(key);
}
增:put(Object key, Object value);
删:remove(Object key);
改:put(Object key, Object value);
查:get(Object key)
长度:size()
遍历:keySet() \ values() \ entrySet()
TreeMap两种添加方式
想TreeMap中添加key - value ,要求key必须是由用一个类创建的对象
因为要按照key进行排序:自然排序、定制排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构