Java集合(List Set Map) 超全详解

概述

先来一张Java中的集合框架图
在这里插入图片描述
由上图可知,Java集合框架包含三大块内容:对外的接口、接口的实现、对集合运算的算法。总结成一个表格:

接口是否唯一是否有序
List不唯一(重复)有序
Set唯一(不重复)无序
Mapkey:唯一 value:不唯一key:无序 value:无序

List接口

List接口有两个实现,分别是:

ArrayList

特点:

存储方式与数组相同,允许重复、有序,但是数组的长度不可变,ArrayList集合长度可以改变,默认大小是10。优点:遍历元素和随机访问元素的效率比较高。

存储方式示意图:
0123456
aaabbbcccdddeeewwwsss
常用方法
方法名称说明
boolean add(Object o)在列表末尾顺序添加元素,起始索引位置从0开始
void add(int index,Object o)在指定的索引位置添加元素,原索引位置及其后面的元素依次后移。注意:新添加元素的索引位置必须介于0和列表中元素个数之间
int size()返回列表中元素个数
Object get(int idnex)返回指定索引位置处的元素
boolean contains(Object o)判断列表中是否存在指定元素
boolean remove(Object o)从列表中删除元素
Object remobe(int index)从列表中删除指定位置元素,起始索引位置从0开始

LinkedList

特点:

采用链表存储方式。优点:插入、删除元素时效率较高。

存储方式示意图:

在这里插入图片描述
LinkedList集合中的每个元素是通过地址互相连接,比如:第2个元素的地址就在第一个数据中存储着,方便找到,惊醒插入、删除。

常用方法
方法名称说明
void addFirst(Object o)在列表的首部添加元素
void addLast(Object o)在列表的末尾添加元素
Object getFirst()返回列表的第一个元素
Object getLast()返回列表的最后一个元素
Object removeFirst()删除并返回列表中的第一个元素
Object removeLast()删除并返回列表中的最后一个元素

Map接口

HashMap集合

特点:

存储一组成对的键-值对象,可供key(键)到value(值)的映射。优点:查询指定元素效率高。

常用方法
方法名称说明
Object put(Object key,Object value)以“键-值”对的方式存储,注意:键必须唯一,值可以重复。如果试图添加重复的键,那么最后加入的“键-值对”将替换掉原先的“键值对”
Object get(Object key)根据键返回相关联的值,若不存在指定的键,则返回null
Object remove(Object key)根删除指定的键映射的“键-值对”
int size()返回元素个数
Set keySet()返回键的集合
Collection values()返回值的集合
boolean containsKey(Object key)若存在指定的键映射的“键-值对”,则返回true
boolean isEmpty()若不存在键-值映射关系,则返回true
void clear()从此映射中删除所有映射关系

迭代器Iterator

所有集合接口和类都没有提供相应的遍历方法,而是把遍历交给迭代器Iterator完成。Iterator为集合而生,专门实现集合的遍历。Iterator有两个方法可以实现遍历:
1,boolean hasNext():判断是否存在另一个可访问的元素。
2,Object next():返回要访问的下一个元素。

来个小案例:

public abstract class Pet {
	protected String name = "无名氏";
	protected int health = 100;
	protected int love = 0;
	public Pet(String name){
		this.name = name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getHealth() {
		return health;
	}
	public void setHealth(int health) {
		this.health = health;
	}
	public int getLove() {
		return love;
	}
	public void setLove(int love) {
		this.love = love;
	}
	/**
	 * 输出宠物信息
	 */
	public void print(){
		System.out.println("宠物的自白:\n我的名字叫"+this.name+",健康值是"+this.health+
				",和主人的其密度是"+this.love+"。");
	}
	/**
	 * 抽象方法eat(),负责宠物吃饭功能
	 */
	public abstract void eat();
}

public class Dog extends Pet{
	public String strain;//品种
	public Dog(String name,String strain){
		super(name);
		this.strain = strain;
	}
	/**
	 * 重写父类的print方法
	 */
	public void print(){
		super.print();
		System.out.println("我是一只:"+this.strain+"。");
	}
	/**
	 * 实现狗狗吃饭的方法
	 */
	public void eat(){
		super.health +=3;
		System.out.println("狗狗"+super.name+"吃饱了,健康值增加3。");
	}
	/**
	 * 实现飞盘功能
	 */
	public void catchingFlyDisc(){
		System.out.println("狗狗"+super.name+"正在接飞盘");
		super.health+=10;
		super.love+=5;
	}
}

public class Test5 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//创建4个狗狗对象
		Dog ououDog = new Dog("偶偶", "雪瑞纳1");
		Dog yayaDog = new Dog("丫丫", "雪瑞纳2");
		Dog meimeiDog = new Dog("美美", "雪瑞纳3");
		Dog feifeiDog = new Dog("菲菲", "雪瑞纳4");
		//创建Map集合对象并把多个狗狗对象放入其中
		Map dog = new HashMap();
		dog.put(ououDog.getName(), ououDog);
		dog.put(yayaDog.getName(), yayaDog);
		dog.put(meimeiDog.getName(), meimeiDog);
		dog.put(feifeiDog.getName(), feifeiDog);
		//通过迭代器依次输入集合中所有狗狗的信息
		Set keys = dog.keySet();//拿到集合中所有key的集合
		Iterator iterator = keys.iterator();//获取Iterator对象
		while (iterator.hasNext()) {//判断是否存在可访问的元素
			String keyString = (String)iterator.next();//拿到迭代器中的key值
			Dog dog2 = (Dog)dog.get(keyString);//根据key取出对应的值
			System.out.println(keyString+"\t"+dog2.strain);
			
		}
	}

}

运行结果是:

丫丫   雪瑞纳2
偶偶   雪瑞纳1
菲菲   雪瑞纳4
美美   雪瑞纳3

Set接口

HashSet集合

特点:

优点:HashSet具有去重功能。

public class Demo01 {
	/**
	 * Set集合 特点: 无序(没有下标)、集合中的元素不重复 hashset具有去重功能
	 */
	public static void main(String[] args) {
		// 创建一个hashset 保存 f f a a b b d d
		HashSet<String> set = new HashSet<>();
		set.add("f");
		set.add("f");
		set.add("a");
		set.add("a");
		set.add("b");
		set.add("b");
		set.add("d");
		set.add("d");
		// 增强for循环
		for (String string : set) {
			System.out.println(string);// 打印结果 a b d f ,去重且无序(不是按照输出顺序打印)
		}
	}
}
a
b
d
f

集合和数组的区别

1.数组可以存储基本数据类型和对象,而集合中只能存储对象(可以以包装类形式存储基本数据类型)。
2. 数组长度固定,集合长度可以动态改变
3. 定义数组时必须指定数组元素类型,集合默认其中所有元素都是Object。
4. 不能直接获取数组中实际存储元素的个数,length用来获取数组的长度。集合可以通过size()获取集合中实际存储的元素个数。
5. 集合以借口和类的形式存在,就有封装、继承、多态等类的特性。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦梦~~

你的鼓励是对我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值