Java 集合类型--- Collection 和 Map集合

目录

Collection接口基本结构

Map接口基本结构

Set接口

List接口

Queue接口

Map接口


Java 集合类型分为 Collection 和 Map接口,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。

Collection接口:set接口【HashSet类、Treeset类】、list接口【LinkedList类、ArrayList类和Vector类】、Queue接口

set接口

特点:数据是不能重复的、无序的和最多可以存储一个null值。

实现类:HashSet、LinkedHashSet和TreeSet。

list接口

特点:元素有序(按照添加的顺序在集合中摆放);元素可重复

实现类:ArrayList、LinkedList、Vector这三个实现类

Map接口的实现类:HashMap、ConcurrentHashMap、TreeMap、Hashtable以及Properties等

Collection接口基本结构

Map接口基本结构

黄色块为集合的接口,蓝色块为集合的实现类【来源:C语言中文网】

Set接口

1.概述

  • Set接口是Collection的子接口,set接口没有提供额外的方法
  • Set集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set集合中,则添加操作失败。(多用于过滤操作,去掉重复数据)
  • Set判断两个对象是否相同不是使用==运算符,而是根据equals()方法

2.特点:数据是不能重复的、无序的和最多可以存储一个null值

3.实现类:HashSet、LinkedHashSet和TreeSet

4.元素添加过程:(以HashSet为例)

HashSet底层:数组+链表的结构。(JDK 7.0以前)

我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:

情况1:如果此位置上没有其他元素,则元素a添加成功。
如果此位置上有其他元素b(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
情况2:如果hash值不相同,则元素a添加成功。

如果hash值相同,进而需要调用元素a所在类的equals()方法:
equals()返回true,元素a添加失败
equals()返回false,则元素a添加成功。—>情况3
对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。

5.LinkedHashSet

底层:数组+双链表+红黑树

6.二叉排序树

treeset底层是二叉排序树,会将存入的元素按照从小到大(或字典序)自动排列

常用方法

//声明一个treeset
        TreeSet a=new TreeSet();
        a.add(1);
        a.add(2);
        a.add(0);

//遍历,不能用get(index)
        Iterator it =a.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }

List接口

1.实现类:ArrayList、LinkedList、Vector这三个实现类,底层如下

(1)ArrayList:数组实现,查询快,增删慢,轻量级;(线程不安全)
(2)LinkedList:双向链表实现,增删快,查询慢 (线程不安全)
(3)Vector:数组实现,重量级 (线程安全、使用少)

 ArrayList底层:是由动态数组实现的。动态数组就是长度不固定,随着数据的增多而变长。当实例化ArrayList时(比如:List<Integer> intList = new ArrayList<>();),如果不指定它的长度,则默认为10。如果当添加的元素超过当前数组的长度时,它会新创建一个数组,长度为当前数组的1.5倍,然后将当前数组的元素复制到新的数组,当前数组的内存被释放。

LinkedList底层:是由双向链表的数据结构实现的。

由上图可以看到:双向链表是由三个部分组成:prev、data、next。prev:由用来存储上一个节点的地址;data:是用来存储要存储的数据;next:是用来存储下一个节点的地址。

2.List集合的特点

a:元素有序(按照添加的顺序在集合中摆放);

b:元素可重复

public static void main(String[] args) {
	//定义集合
	List list=new ArrayList<>();
	//往集合中添加数据
	list.add("aa");
	list.add("bb");
	list.add("cc");
	list.add("dd");
	list.add("aa");
	list.add("bb");
	//输出显示
	for (Object o : list) {
		System.out.println(o);
	}
}

输出:aa  bb cc dd aa bb

2.list集合的三种遍历方式

a:foreach循环(上面中的输出显示方式就是foreach循环)
b:for循环:

public static void main(String[] args) {
	//定义集合
	List list=new ArrayList<>();
	//往集合中添加数据
	list.add("aa");
	list.add("bb");
	list.add("cc");
	list.add("dd");
	list.add("aa");
	list.add("bb");
	//for循环
	for(int i=0;i<list.size();i++) {
		System.out.println(list.get(i));
	}
	
}

c:迭代器

public static void main(String[] args) {
	//定义集合
	List list=new ArrayList<>();
	//往集合中添加数据
	list.add("aa");
	list.add("bb");
	list.add("cc");
	list.add("dd");
	list.add("aa");
	list.add("bb");
	//迭代器输出显示
	Iterator it = list.iterator();
	while(it.hasNext()) {
		System.out.println(it.next());
	}
	
}

Queue接口

Map接口

1.实现类: hashMap、hashtable、LinkedHashMap

2.特点:

  • 将键(key) 映射到值(value)的对象,
  • 一个映射不能包含相同的key
  • 一个key只能映射一个value
  • 可以存储多个键值对

3.hashMap

底层是:基于哈希表(数组 + 链表 + 二叉树(红黑树) 

使用:

// 创建一个映射
Map<Integer, String> dict = new HashMap<>();

// 向映射中添加一个键值对
dict.put(1, "张三");
dict.put(2, "李四");
dict.put(3, "王五");

// 根据key 获取 value
System.out.println(dict.get(1));
System.out.println(dict.get(2));
System.out.println(dict.get(3));


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值