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);
    }
}

java 中的集合框架包含的主要接口 java集合框架总结_java

如果用上面的方式创建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());

java 中的集合框架包含的主要接口 java集合框架总结_java 中的集合框架包含的主要接口_02

 

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);
		}

	}

java 中的集合框架包含的主要接口 java集合框架总结_java 中的集合框架包含的主要接口_03

可以看到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));
		}

java 中的集合框架包含的主要接口 java集合框架总结_java_04

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());
		}

java 中的集合框架包含的主要接口 java集合框架总结_java 中的集合框架包含的主要接口_05

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));
		}