Java集合框架:
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.uti包中
框架体系结构:
- collection:代表的是一个集合框架,各种集合类型的父接口,一个接口
- collections:对于集合提供算法的类,一个算法类
Collection:
代表的是一个集合框架,各种集合类型的父接口,一个接口
(1)List接口存储一组不唯一,有序(插入顺序)的对象
(2)Set接口存储一组唯一,无序的对象
(3)Map接口存储一组键值对象,提供key到value的映射
键key是无序的也是唯一的
值value可以重复
注:Collections(面试题 / 代码块)详解:https://blog.csdn.net/weixin_41540362/article/details/102750740
一、List接口
1、List接口的实现类:
- ArrayList
- LinkedList
(1)ArrayList
(1)长度可变的数组
(2)遍历元素和随机访问元素
ArrayList
是List接口的一个具体实现类
实现了可变大小的数组
随机访问和遍历元素时,它提供更好的性能
用到的方法:
add()
size()
get()
ArrayList常用方法:
方法名 | 说明 |
---|---|
boolean add(Object o) | 在列表的末尾顺序添加元素,起始索引位置从0开始 |
void add(int index,Object o) | 在指定的索引位置添加元素。索引位置必须介于0到列表中元素的个数之间 |
int size() | 返回列表中的元素个数 |
Object get(int index) | 返回指定索引位置处的元素。取出的元素是Object类型,使用前需要进行强制类型转换 |
boolean contains(Object o) | 判断列表中是否存在指定元素 |
boolean remove(Object o) | 从列表中删除元素 |
Object remove(int index) | 从列表中删除指定位置元素,起始索引位置从0开始 |
Collection接口常用通用方法还有: | clear()、isEmpty()、iterator()、toArray() |
(2)LinkedList
(1)链表存储方式
(2)插入、删除元素
LinkedList
是List接口的一个具体实现类
用于创建链表数据结构
插入或者删除元素时,它提供更好的性能
独有方法: addXXX(、getXXX()、 removeXXX() //Frist 、 Last
LinkedList方法结合代码执行结果理解其作用
查阅帮助文档熟练对方法使用的掌握
LinkedList独有方法:
方法名 | 说明 |
---|---|
void addFrist(Object o) | 在列表的首部添加元素 |
void addLast(Object o) | 在列表的末尾添加元素 |
Object getFrist() | 返回列表中的第一个元素 |
Object getLast() | 返回列表中的最后一个元素 |
Object removeFrist() | 删除并返回列表中的第一个元素 |
Object removeLast() | 删除并返回列表中的最后一个元素 |
2、List总结:ArrayList与LinkedList
LinkedList与ArrayList-同:
(1)同为List实现类,元素有序、不唯一、长度可变
(2)共有Collection及List的通用方法
LinkedList与ArrayList-异:
(1)ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高
(2)LinkedList采用链表存储方式,插入、删除元素时效率比较高
注:查阅List代码可参照:https://blog.csdn.net/weixin_41540362/article/details/102679852
Java集合框架(回顾)
二、Set接口
1、Set接口存储一组唯一, 无序的对象
(1)Set中存放对象的引用人
(2)采用对象的equals()方法比较两个对象是否相等2、HashSet是Set接口常用的实现类
3、Set中存放对象的弓|用
注:更多Set案例可参看:https://blog.csdn.net/weixin_41540362/article/details/102715773
Set接口的两个类
- HashSet:存储自定义对象并保证元素唯一性
- TreeSet :能够对元素按照某种规则进行排序。
1、HashSet类概述:存储自定义对象并保证元素唯一性
- 不保证set的迭代顺序
- 特别是它不保证该顺序恒久不变。
HsahSet如何保证元素的唯一性:
- 底层数据结构是哈希表(是一个元素为链表的数组)
- 哈希表底层依赖两个方法:hashCode()和equals()
2、TreeSet类概述:能够对元素按照某种规则进行排序。
排序有两种方式:
- 自然排序(无参排序)Comparable
- 比较器排序(带参排序)
1、HashSet:存储字符串并遍历
- HashSet:存储自定义对象并保证元素唯一性:
(1)图解
(2)Hash Set存储字符串并遍历案例:
/*
* HashSet:存储字符串并遍历
* 问题:为什么存储字符串的时候,字符串内容相同的只存储了一个呢?
* 通过查看add方法的源码,我们知道这个方法底层依赖 两个方法:hashCode()和equals()。
* 步骤:
* 首先比较哈希值
* 如果相同,继续走,比较地址值或者走equals()
* 如果不同,就直接添加到集合中
* 按照方法的步骤来说:
* 先看hashCode()值是否相同
* 相同:继续走equals()方法
* 返回true: 说明元素重复,就不添加
* 返回false:说明元素不重复,就添加到集合
* 不同:就直接把元素添加到集合
* 如果类没有重写这两个方法,默认使用的Object()。一般来说不同相同。
* 而String类重写了hashCode()和equals()方法,所以,它就可以把内容相同的字符串去掉。只留下一个。
*/
public class HashSetDemo {
public static void main(String[] args) {
// 创建集合对象
HashSet<String> hs = new HashSet<String>();
// 创建并添加元素
hs.add("hello");
hs.add("world");
hs.add("java");
hs.add("world");
// 遍历集合
for (String s : hs) {
System.out.println(s);
}
}
}
1.2、LinkedHashSet:底层数据结构由哈希表和链表组成。(了解)
- 哈希表保证元素的唯一一性。
- 链表保证元素有素。(存储和取出是一致)
2、TreeSet:能够对元素按照某种规则进行排序。
排序有两种方式:
- 自然排序 (无参排序)
- 比较器排序 (带参排序)
TreeSet(二叉树结构图解):
/*
* TreeSet:能够对元素按照某种规则进行排序。
* 排序有两种方式
* A:自然排序
* B:比较器排序
*
* TreeSet集合的特点:排序和唯一
*
* 通过观察TreeSet的add()方法,我们知道最终要看TreeMap的put()方法。
*/
public class TreeSetDemo {
public static void main(String[] args) {
// 创建集合对象
// 自然顺序进行排序
TreeSet<Integer> ts = new TreeSet<Integer>();
// 创建元素并添加
// 20,18,23,22,17,24,19,18,24
ts.add(20);
ts.add(18);
ts.add(23);
ts.add(22);
ts.add(17);
ts.add(24);
ts.add(19);
ts.add(18);
ts.add(24);
// 遍历
for (Integer i : ts) {
System.out.println(i);
}
}
}
(1)自然排序 (无参排序)-- TreeSet()
自然排序(元素具备比较性)
- 让元素所属的类实现自然排序接口 Comparable
(2)比较器排序(带参排序) -- TreeSet(带参)
比较器排序(集合具备比较性)
- 让集合的构造方法接收一个比较器接口的子类对象 Comparator
三、Map集合
Map集合的基本功能概述:
1、添加功能
- V put(K key,V value):添加元素。这个其实还有另一个功能?
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值2、删除功能
- void clear():移除所有的键值对元素
- V remove(Object key):根据键删除键值对元素,并把值返回
3、判断功能
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean containsValue(Object value):判断集合是否包含指定的值
- boolean isEmpty():判断集合是否为空
4、获取功能
- Set<Map.Entry<K,V>> entrySet():???
- V get(Object key):根据键获取值
- Set<K> keySet():获取集合中所有键的集合
- Collection<V> values():获取集合中所有值的集合
5、长度功能
- int size():返回集合中的键值对的对数
Map(代码块 / 面试题):https://blog.csdn.net/weixin_41540362/article/details/102741134
1、Map的基本功能:
- V put(K key,V value):添加元素。
- void clear():移除所有的键值对元素
- V remove(Object key):根据键删除键值对元素,并把值返回
- boolean containsKey(Object key):判断集合是否包含指定的键
- boolean isEmpty():判断集合是否为空
- int size():返回集合中的键值对的对数
案例说明:
public class MapDemo {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 添加元素
// V put(K key,V value):添加元素。这个其实还有另一个功能?
// System.out.println("put:" + map.put("文章", "马伊俐"));
// System.out.println("put:" + map.put("文章", "姚笛"));
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "蔡依林");
map.put("刘恺威", "杨幂");
// void clear():移除所有的键值对元素
// map.clear();
// V remove(Object key):根据键删除键值对元素,并把值返回
// System.out.println("remove:" + map.remove("黄晓明"));
// System.out.println("remove:" + map.remove("黄晓波"));
// boolean containsKey(Object key):判断集合是否包含指定的键
// System.out.println("containsKey:" + map.containsKey("黄晓明"));
// System.out.println("containsKey:" + map.containsKey("黄晓波"));
// boolean isEmpty():判断集合是否为空
// System.out.println("isEmpty:"+map.isEmpty());
//int size():返回集合中的键值对的对数
System.out.println("size:"+map.size());
// 输出集合名称
System.out.println("map:" + map);
}
}
2、获取功能:
- V get(Object key):根据键获取值
- Set<K> keySet():获取集合中所有键的集合
- Collection<V> values():获取集合中所有值的集合
案例说明:
public class MapDemo2 {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加元素
map.put("邓超", "孙俪");
map.put("黄晓明", "杨颖");
map.put("周杰伦", "蔡依林");
map.put("刘恺威", "杨幂");
// V get(Object key):根据键获取值
System.out.println("get:" + map.get("周杰伦")); //返回蔡依林
System.out.println("get:" + map.get("周杰")); // 返回null
System.out.println("----------------------");
// Set<K> keySet():获取集合中所有键的集合
Set<String> set = map.keySet();
for (String key : set) {
System.out.println(key);
}
System.out.println("----------------------");
// Collection<V> values():获取集合中所有值的集合
Collection<String> con = map.values();
for (String value : con) {
System.out.println(value);
}
}
}
集合的遍历:
/* 思路:
* A:把所有的丈夫给集中起来。
* B:遍历丈夫的集合,获取得到每一个丈夫。
* C:让丈夫去找自己的妻子。
*
* 转换:
* A:获取所有的键
* B:遍历键的集合,获取得到每一个键
* C:根据键去找值
*/
public class MapDemo3 {
public static void main(String[] args) {
// 创建集合对象
Map<String, String> map = new HashMap<String, String>();
// 创建元素并添加到集合
map.put("杨过", "小龙女");
map.put("郭靖", "黄蓉");
map.put("杨康", "穆念慈");
map.put("陈玄风", "梅超风");
// 遍历
// 获取所有的键
Set<String> set = map.keySet();
// 遍历键的集合,获取得到每一个键
for (String key : set) {
// 根据键去找值
String value = map.get(key);
System.out.println(key + "---" + value);
}
}
}
打印结果:
3、Map集合遍历的两种方式(图解):
HashMap :是基于哈希表的Map接口实现。
哈希表的作用是用来保证键的唯一性的。
HashMap案例:
- HashMap<String,String>
- HashMap<Integer,String>
- HashMap<Strinq,Student>
- HashMap<Student,String>
案例详情可参看:https://blog.csdn.net/weixin_41540362/article/details/102715773
共勉:明日复明日,明日何其多。我生待明日,万事成蹉跎。