详细讲解JAVA中的集合类以及具体案例(超详细!!!)

详细讲解JAVA中的集合类以及具体案例

集合体系结构图解:

在这里插入图片描述

一、Collection集合

Collection集合接口包含两个实现子接口,分别是List和Set
List包括ArrayList和LinkedList两个具体实现类
Set包括HashSet这个具体实现类

1、Collection集合的成员方法:

    * boolean add(E e):添加元素
    * boolean remove(Object o):从集合中移除元素
    * void clear():清空集合中的元素
    * boolean contains(Object o):判断集合中是否存在指定的元素
    * boolean isEmpty():判断集合是否为空
    * int size():集合的长度,也就是集合中元素的个数

2、Collection集合的遍历:

     * Iterator<E> iterator():
     *  返回在此 collection 的元素上进行迭代的迭代器。
     *  通过集合对象调用iterator()方法得到迭代器对象。
     * 
     * Iterator:
     * 	E next():返回迭代的下一个元素。 
     * 	boolean hasNext():如果仍有元素可以迭代,则返回 true

(I)List集合

1、List集合的特点:
1有序(存储和取出元素的顺序一致)
2存储的元素可以重复

2、List集合的特有成员方法:

     * void add(int index,E element):在指定位置添加元素,原位置上的元素后移
     * E remove(int index):删除指定位置的元素,返回删除的元素
     * E get(int index):获取指定位置的元素
     * E set(int index,E element):修改指定位置的元素,返回修改前的元素

3、List集合的遍历:
List集合的遍历:

//迭代器
		Iterator<Student> it = list.iterator();
		while(it.hasNext()){
			Student s = it.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
//普通for
		for(int x=0; x<list.size(); x++) {
			Student s = list.get(x);
			System.out.println(s.getName()+"---"+s.getAge());
		}

4、List集合子类特点及ArrayList集合:

    ArrayList:底层数据结构是数组,查询快,增删慢
    LinkedList:底层数据结构是链表,查询慢,增删快

ArrayList遍历:

//迭代器
		Iterator<String> it = array.iterator();
		while(it.hasNext()){
			String s = it.next();
			System.out.println(s);
		}
//普通for
		for(int x=0; x<array.size(); x++) {
			String s = array.get(x);
			System.out.println(s);
		}
//增强for
		for(String s : array) {
			System.out.println(s);
		}

提示:LinkedList的使用和ArrayList的相似,所以LinkedList的具体构造方法和成员方法可以去API文档查看。

(II)Set集合

1、Set集合的特点:
Set集合只有HashSet一个具体实现类
Set:一个不包含重复元素的 collection
-----元素唯一,存储元素无序

2、HashSet的特点:
-----它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变
-----HashSet实现了Set集合接口

HashSet保证元素唯一性的原理???
通过查看add方法的源码,我们知道了添加功能的执行过程中,是进行了数据的判断的。
这个判断的流程是:
		首先比较对象的哈希值是否相同,这个哈希值是根据对象的hashCode()计算出来的。
			如果哈希值不同,就直接添加到集合中
			如果哈希值相同,继续执行equals()进行比较,
				返回的是true,说明元素重复,不添加。
				返回的是false,说明元素不重复,就添加。
如果我们使用HashSet集合存储对象,你要想保证元素的唯一性,就必须重写hashCode()和equals()方法。

HashSet集合的遍历:

//迭代器
		Iterator<Student> it = hs.iterator();
		while(it.hasNext()){
			Student s = it.next();
			System.out.println(s.getName()+"---"+s.getAge());
		}
//增强for
		for(Student s : hs) {
			System.out.println(s.getName()+"---"+s.getAge());
		}

二、Map集合

Map集合:将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map集合是Collection集合的兄弟,他们两个是平级关系。
Map集合只有HashMap一个实现类。

(I)Map集合的成员方法

V put(K key,V value):添加元素
V remove(Object key):根据键删除键值对元素
void clear():移除所有的键值对元素
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
int size():返回集合中的键值对的对数

(II)Map集合的获取功能测试

V get(Object key):根据键获取值
Set<K> keySet():获取所有键的集合
Collection<V> values():获取所有值的集合
        //创建集合对象
		Map<String,String> map = new HashMap<String,String>();
		
		//添加元素
		map.put("郭靖", "黄蓉");
		map.put("杨过", "小龙女");
		map.put("张无忌", "赵敏");
		
		//V get(Object key):根据键获取值
		System.out.println("get:"+map.get("张无忌"));
		System.out.println("get:"+map.get("张三丰"));
		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> values = map.values();
		for(String value : values) {
			System.out.println(value);
		}

(III)Map集合的遍历之键找值

A:获取所有键的集合
B:遍历键的集合,获取到每一个键
C:根据键去找值

//创建集合对象
		Map<String,String> map = new HashMap<String,String>();
		
		//添加元素
		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);
		}

(IV)Map集合的遍历之键值对对象找键和值

A:获取所有键值对对象的集合
B:遍历键值对对象的集合,得到每一个键值对对象
C:根据键值对对象获取键和值

        Map<String,String> map = new HashMap<String,String>();
		
		//添加元素
		map.put("郭靖","黄蓉");
		map.put("杨过","小龙女");
		map.put("张无忌","赵敏");
		
		//获取所有键值对对象的集合
        //Set<Map.Entry<K,V>> entrySet()
        //获取键值对对象的集合
		Set<Map.Entry<String,String>> set = map.entrySet();
		//遍历键值对对象的集合,得到每一个键值对对象
		for(Map.Entry<String,String> me : set) {
			//根据键值对对象获取键和值
			String key = me.getKey();
			String value = me.getValue();
			System.out.println(key+"---"+value);
		}

(V)Map集合的两种遍历方式图解

在这里插入图片描述

(VI)HashMap集合案例:键是String,值是Student

HashMap<String,Student>
键:String 学号
值:Student 学生对象

public class Student {
	private String name;
	private int age;

	public Student() {
	}

	public Student(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

}
public class HashMapTest {
	public static void main(String[] args) {
		// 创建集合对象
		HashMap<String, Student> hm = new HashMap<String, Student>();

		// 创建元素对象
		Student s1 = new Student("林青霞", 30);
		Student s2 = new Student("张曼玉", 35);
		Student s3 = new Student("王祖贤", 33);

		// 添加元素到集合中
		hm.put("it001", s1);
		hm.put("it002", s2);
		hm.put("it003", s3);

		// 遍历
		// 根据键找值
		Set<String> set = hm.keySet();
		for (String key : set) {
			Student value = hm.get(key);
			System.out.println(key + "---" + value.getName() + "---" + value.getAge());
		}
		System.out.println("---------------------");

		// 根据键值对对象找键和值
		Set<Map.Entry<String, Student>> set2 = hm.entrySet();
		for (Map.Entry<String, Student> me : set2) {
			String key = me.getKey();
			Student value = me.getValue();
			System.out.println(key + "---" + value.getName() + "---" + value.getAge());
		}
	}
}

(VII)集合的嵌套:ArrayList嵌套HashMap

需求:ArrayList集合嵌套HashMap集合并遍历。
定义一个ArrayList集合,它包含三个元素,每一个元素都是HashMap类型的。
每一个HashMap集合的键和值都是String类型的,
键:String		丈夫的姓名
值:String		妻子的姓名
给出如下的字符串数据,请用代码实现需求。
第一个HashMap集合的元素:
		孙策		大乔
		周瑜		小乔
第二个HashMap集合的元素:
		郭靖		黄蓉
		杨过		小龙女
第三个HashMap集合的元素:
		令狐冲	任盈盈
		林平之	岳灵珊
public static void main(String[] args) {
		//创建集合对象
		ArrayList<HashMap<String,String>> array = new ArrayList<HashMap<String,String>>();
		
		//创建元素1
		HashMap<String,String> hm1 = new HashMap<String,String>();
		hm1.put("孙策","大乔");
		hm1.put("周瑜","小乔");
		//把元素添加到array中
		array.add(hm1);
		
		//创建元素2
		HashMap<String,String> hm2 = new HashMap<String,String>();
		hm2.put("郭靖","黄蓉");
		hm2.put("杨过","小龙女");
		//把元素添加到array中
		array.add(hm2);
		
		//创建元素3
		HashMap<String,String> hm3 = new HashMap<String,String>();
		hm3.put("令狐冲","任盈盈");
		hm3.put("林平之","岳灵珊");
		//把元素添加到array中
		array.add(hm3);
		
		//遍历ArrayList集合
		for(HashMap<String,String> hm : array) {
			Set<String> set = hm.keySet();
			for(String key : set) {
				String value = hm.get(key);
				System.out.println(key+"---"+value);
			}
			System.out.println("-----------------");
		}
		
	}

(VIII)集合的嵌套:HashMap嵌套ArrayList

需求:HashMap集合嵌套ArrayList集合并遍历。
定义一个HashMap集合,它包含三个元素,每一个元素的键是String类型,值是ArrayList类型。
键:String			人物来自哪部电视剧
值:ArrayList		人物的名称
每一个ArrayList集合的数据是String类型的。
给出如下的字符串数据,请用代码实现需求。
第一个ArrayList集合的元素:(三国演义)
		诸葛亮
		赵云
第二个ArrayList集合的元素:(西游记)
		唐僧
		孙悟空
第三个ArrayList集合的元素:(水浒传)
		武松
		鲁智深
public static void main(String[] args) {
		//创建集合对象
		HashMap<String,ArrayList<String>> hm = new HashMap<String,ArrayList<String>>();
	
		//创建元素1
		ArrayList<String> sgyy = new ArrayList<String>();
		sgyy.add("诸葛亮");
		sgyy.add("赵云");
		//把元素添加到hm中
		hm.put("三国演义", sgyy);
		
		//创建元素2
		ArrayList<String> xyj = new ArrayList<String>();
		xyj.add("唐僧");
		xyj.add("孙悟空");
		//把元素添加到hm中
		hm.put("西游记", xyj);
		
		//创建元素3
		ArrayList<String> shz = new ArrayList<String>();
		shz.add("武松");
		shz.add("鲁智深");
		//把元素添加到hm中
		hm.put("水浒传", shz);
		
		//遍历集合
		Set<String> set = hm.keySet();
		for(String key : set) {
			System.out.println(key);
			ArrayList<String> value = hm.get(key);
			for(String s : value) {
				System.out.println("\t"+s);
			}
		}
	}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值