Java 集合框架体系结构

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


 共勉:明日复明日,明日何其多。我生待明日,万事成蹉跎。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值