目录
一、概述
在Java中所有的容器都属于Collection接口下的内容
1、Set------这种容器的特点: 存储的数据不能重复. 自动去重. 无序 无索引 不可重复
2、List------这种容器和数组差不多, 优势是不定长. 随便加. 有序 有索引,可重复
3、Map------这种容器是一对一对的存 ,键值对 就像我们存电话号码的时候. 肯定是"名字-电话"这样存储. 找电话用名字找就行了
二、List
List有两个常用的实现类: ArrayList, LinkedList.
List list = new ArrayList()------实现类 向上转型
List list = new LinkedList()------实现类 向上转型
ArrayList和LinkedList在使用上没有什么区别. 注意, 其实是有区别的. 只是在明面上看不出来而已.
1、List的常用API
-
add(obj) ------添加元素
-
get(i) ------查看第i个元素
-
set(...)------修改某个位置
-
size() ------查看列表中的数据个数
-
isEmpty() ------判断是否是空列表
-
indexOf(xxx) ------查看xxx元素在列表中的位置
-
lastIndexOf(xxx) ------查看xxx元素在列表中最后一次出现的位置
-
contains(xxx) ------判断列表中是否包含了xxx,列表中包含指定元素,则返回 true,否则返回 false
-
subList(start,end) ------从列表中start开始截取, 截取到end 但不包括end
-
toArray() 集合转化成数组
-
remove(obj) 删除某个元素
-
remove(i) 删除某个位置的元素
⚠️容器为了通用性,往容器里面加的东西都会被向上转型为Object类型,get() 拿到的数据是object类型,需要再强转为原本的类型(向下转型)
2、ArrayList
List是一个接口,而ArrayList是List接口的一个实现类。
ArrayList类继承并实现了List接口。
因此,List接口不能被构造,也就不能创建实例对象,但是我们可以为List接口创建一个指向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。
List list = new ArrayList();
-
特点:有序 有索引 可重复 底层是数组 里面可以放不同的变量
-
正确使用方式是要 规定集合的数据类型------泛型:可以是任意的引用数据类型;
-
泛型:规定集合存储的数据类型。
3、List遍历
List遍历:for循环;增强for;迭代器
java
ArrayList<String> list = new ArrayList<>();
list.add("fsakjfs");
list.add("13213");
list.add("[][(*(");
//遍历格式1: (通用格式):size() + get();
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
//遍历格式2:增强for 不能直接访问索引 只能从头遍历到尾
for(String element : list){
System.out.println(element);
}
//遍历格式3:迭代器 返回一个迭代器的对象 泛型
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){ //是不是有下一个元素
String next = iterator.next();//获取当前元素 最开始指向空 移动指针 移动到下一个元素
System.out.println(next);
}
三、Set
Set是一个可以自动去除重复的容器
Set是一个接口. 有两个常用的实现类. 一个是HashSet, 另一个是TreeSet(排序)
HashSet按照Hash的想法来放数据, TreeSet按照Tree的思想来存放数据.
HashSet 瞎摆->存储的速度快
TreeSet 按顺序摆->存储的时候 帮我们排序, 存储的速度就慢
1、Set的常用方法:
-
add() ------添加元素
-
remove() ------删除元素
-
size() ------集合中元素的个数
-
contains() ------判断是否包含了xxxx
-
isEmpty() ------判断集合是否为空
-
clear() ------将集合里的所有数据清空
-
toArray() ,将集合转化成为对应数组类型的数据, Set 集合中的所有对象创建一个数组**。**
2、HashSet
- 特点:无序,不可重复。 HashSet<T> set = new HashSet<T>();
3、遍历集合:
Set遍历:1、增强for 2、迭代器
因为HashSet无序,不可重复,没有索引不能用for循环
java
//遍历1:增强for,底层就是迭代器next
for(String element : set) {
System.out.println(element);
}
//遍历2:迭代器
/*
迭代器是一个接口 Iterable接口有个iterator()方法,
该方法返回一个Iterable接口的实现类 实现类重写iterator()方法
*/
System.out.println("==================");
Iterator<String> it = set.iterator(); //生成返回值的快捷方式:ctrl + alt + v / .var tab键
while(it.hasNext()) {
String next = it.next();
System.out.println(next);
}
四、Map
Map常见的实现类也有两个, 一个是HashMap(常用),不排序; 另一个TreeMap.排序
1、Map常用API
-
put(...)------添加数据
-
get(key) ------使用key查询value
-
isEmpty()------ 判断Map是否是空的
-
size() ------返回key, value键值对的个数
-
containsKey(key) ------判断是否存在key
-
remove(key) ------根据key删除信息
-
keySet() ------获取到map中key的集合set
-
clear() ------清空map里的所有key和value
-
entrySet()------返回一个Set集合,此集合的类型为Map.Entry。
2、HashMap
-
特点:键值对。一个键对应一个值,键不能重复。存储重复的键后会覆盖之前的值。
-
key+value是一个entry
entry:Map是java中的接口,Map.Entry是Map的一个内部接口,内部类,此接口为泛型,定义为Entry<K,V>。
它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法
keySet()方法返回值是Map中key值的集合;
entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Set<Map.Entry<K,V>> entrySet = map.entrySet();
for(Entry e : entrySet) {
System.out.println(e.getKey() + "===" + e.getValue());
}
3、遍历Map
增强for、迭代器
java
public static void main(String[] args) {
HashMap<String,Integer> map = new HashMap<>();
map.put("ID",99); //put 添加+覆盖(相同的key会覆盖)
map.put("AGE",18);
map.put("SCORE",99);
System.out.println(map);
//1、通过键找值 get 找到所有的键
keySet------把key拿出来打包成set集合,遍历以此取出对应的值
//找出所有的键
Set<String> keySet = map.keySet(); //
for(String key : keySet) {
//找到对应的值
Integer value = map.get(key);
System.out.println(key + ":" + value);
}
System.out.println("================");
//2、通过取出所有的键值对,entrySet------------也是一个set集合
//Entry是map的类中类
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
for(Map.Entry<String, Integer> entry : entrySet) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
System.out.println("==============");
//3、Lambda
map.forEach((k,v) -> {
System.out.println(k + " : " + v);
});
//4、迭代器 通过key的迭代器
Set set = map.keySet();//拿出所有的key
Iterator it = set.iterator();
while(it.hasNext()){
String key = (String) it.next();//拿到所有的key 强制转换
System.out.println(map.get(key));
}
//5、迭代器 通过entry entry是map的内部类
Set setEntry = map.entrySet();//entry也是set集合
Iterator itentry = setEntry.iterator();
while(itentry.hasNext()){
Map.Entry entry = (Map.Entry) itentry.next();
//拿到所有的key 强制转换
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
五、迭代器
迭代器是用来干嘛的? 遍历数据集合的. 它存在的意义就是可以让不同的数据类型拥有相同的遍历方式
List, Set, Map. 完全不同的三种数据类型. 但是都可以使用Iterator.
方法:
- next() ------会自动帮我们获取到元素. 并且指针指向下一个元素
- hasnext()------判断有没有下一个元素,因为集合如果拿空了会报错