1.什么是集合框架
集合类是用于保存一些列数据或对象的结构,每种集合类型都有自己的算法,给各种数据或对象提供插入,删除,查询和排序等功能。
简单来说,它除了替代数组完成多个对象的存储功能,也提供了额外的算法。
java集合框架是这些框架集类库,及实现相关操作的类库的总称
2.java集合框架包含哪些内容
java集合框架大致分为两个概念:Collection和Map
Collention是一种接口,用于存储系列对象;该接口下分别有List、Set等接口。List接口会按照插入的顺序保存元素;Set接口是无序的,并且不会有重复的元素。
Map:一种用来存储一系列“键值对”的对象(可以理解为python的字典)
3.List Set Map等常用库的用法
3.1 List接口
List接口会按照插入的顺序保存元素,这个接口下最常用的实现类是ArrayList
public class MyArrayList {
public static void main(String[] args){
ArrayList list = new ArrayList();
list.add("123"); //添加元素
Object obj = list.get(0); //通过下标获取元素
System.out.println("List长度:"+list.size());//获取List长度
System.out.println(obj);
}
}
如果用上面的方式创建List,在读取的时候,只能用Object类型去接收。
可以使用泛型来限制List存储的类型
ArrayList<Integer> list1 = new ArrayList<Integer>();
list1.add(1);
int x = list1.get(0);
<>里面可以传基本数据类型的包装类
上面代码中的数组就只能接收Integer或int的数据
其他常用pai
//其他常用api
ArrayList<Integer> list2 = new ArrayList<Integer>();
System.out.println("list2是否为空集合:"+list2.isEmpty()); //判断是否为空集合
list2.addAll(list1); //将另外一个集合的元素全部添加进来
System.out.println("list2是否为空集合:"+list2.isEmpty());
System.out.println("是否有某个元素:"+list2.contains(1));; //判断集合中是否有某个元素
System.out.println("是否有某个元素:"+list2.contains(2)); //判断集合中是否有某个元素
System.out.println("查询元素下标:"+list2.indexOf(1)); //查询某个元素的下标
list2.clear(); //清空集合中的元素
System.out.println("list2是否为空集合:"+list2.isEmpty());
3.2 Set接口
Set,无序,不会有重复数据,也支持泛型
最常用的Set是HashSet
public static void main(String[] args){
//可以使用多态,支持泛型
Set<Integer> setl = new HashSet<Integer>();
setl.add(5);
setl.add(7);
setl.add(9);
setl.add(1);
setl.add(9);
System.out.println("setl长度:"+setl.size());
for (int i:setl){
System.out.println(i);
}
}
可以看到setl的长度是4,并没有重复添加。打印出来的顺序也不是添加的顺序。
3.3 Map接口
Map是一个键值对的结构,可以通过键来查找值
常用的有HashMap
public static void main(String[] args){
Map<String, String> map = new HashMap<String,String>();
map.put("北京", "beijing");
map.put("上海", "shanghai");
map.put("上海", "guangzou");
System.out.println(map.get("上海"));
System.out.println(map.size());
System.out.println("===========================");
}
添加相同的键,会被覆盖
Map循环方式
通过Map.keySet()遍历key和value
//通过Map.keySet()遍历key和value
System.out.println("通过Map.keySet()遍历key和value");
System.out.println(map.keySet()); //返回集合的所有key
for (String key:map.keySet()){
System.out.printf("key为%s时,value为%s。\n", key, map.get(key));
}
Map.keySet()返回了map的所有key
使用Map.get()方法,通过key,获取对应的value
通过Map.entrySet遍历key和value
推荐使用该方式
//通过Map.entrySet遍历key和value
System.out.println("===========================");
System.out.println("通过Map.entrySet遍历key和value");
System.out.println(map.entrySet());
for (Map.Entry<String, String> ent:map.entrySet()){
System.out.printf("key为%s时,value为%s。\n", ent.getKey(), ent.getValue());
}
Entry是Map下的子类,专门用来表示Map结构的键值对
map.entrySet()返回的是key=value结构的数据,通过Entry下的getKey()和getValue()获取key和value
推荐使用该方法
通过Map.values()遍历所有的value
//通过Map.values()遍历所有的value,但是不能遍历key
System.out.println("===========================");
System.out.println("通过Map.values()遍历所有的value");
for (String value: map.values()){
System.out.println(value);
}
通过Map.values()方法,可以获得map所有的value
该方式只有value,没有办法获取对应的key
迭代器
集合框架提供了统一迭代的功能,可以在List,Set,Map中使用
在迭代之前,必须让容器对象返回一个迭代器对象,通过迭代器对象的hasNext()方法判断是否有下一条数据,有则通过next()方法获取这条数据
迭代器类Iterator
Iterator 迭代器名 = 集合对象.iterator()
List使用迭代器
ArrayList<String> list4 = new ArrayList();
list4.add("1");
list4.add("2");
list4.add("3");
//创建迭代器对象
Iterator<String> ite = list4.iterator();
//使用for循环
for (String i ;ite.hasNext();){
i = ite.next();
System.out.println(i);
}
//使用while循环
while(ite.hasNext()){
String i = ite.next();
System.out.println(i);
}
迭代器遍历时,是一条一条往下的。当遍历结束后,就停在最后一条了
上面代码由于for循环和while循环都是使用一个迭代器对象,在for循环的时候,就已经把所有对象给遍历完了。再用while循环的时候。没有内容可以遍历了
Map使用迭代器
//对Map.entrySet()方法创建迭代器
Iterator<Map.Entry<String, String>> it1 = map.entrySet().iterator();
//for循环
for (Map.Entry<String,String> a ;it1.hasNext();){
a = it1.next();
System.out.println(a);
System.out.println(a.getKey());
System.out.println(a.getValue());
}
//while循环
while (it1.hasNext()){
Map.Entry<String, String> a = it1.next();
System.out.println(a.getValue());
System.out.println(a.getKey());
}
//对Map.keySet()方法创建迭代器
Iterator<String> it2 = map.keySet().iterator();
//使用for循环
for (String i;it2.hasNext();){
i = it2.next();
System.out.println(i);
}
//使用while循环
while (it2.hasNext()){
String i = it2.next();
System.out.println(i+map.get(i));
}