JAVA集合

​​​​​​​集合

笔记:Java704 | ProcessOn免费在线作图,在线流程图,在线思维导图

集合类是Java数据结构的实现。Java的集合类是java.util包中的重要内容,它允许以各种方式将元素分组,并定义了各种使这些元素更容易操作的方法。Java集合类是Java将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供。集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适合不同的场合,用以解决一些实际问题。

在这里插入图片描述

 一、List集合

List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。
List接口继承于Collection接口,它可以定义一个允许重复的有序集合。因为List中的元素是有序的,所以我们可以通过使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
List接口为Collection直接接口。List所代表的是有序的Collection,即它用某种特定的插入顺序来维护元素顺序。用户可以对列表中每个元素的插入位置进行精确地控制,同时可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector。

ArrayList
ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。ArrayList是擅长随机访问的。
 

public static void main(String[] args) {
		//定义一个list集合,指定泛型为String,()中为集合初始长度
		List<String> list=new ArrayList<String>(100);
		//list集合的add方法是指向集合中添加一个(符合泛型要求的)元素
		list.add("张三");
		list.add("李四");
		list.add("王五");
		//list集合的add方法是指向集合中指定位置,添加一个(符合泛型要求的)元素[属于方法重载]
		list.add(0,"赵六");
		
		//list集合使用size()方法获取集合长度,集合从0开始,最后一位元素为size-1,与数组相似
		for (int i = 0; i < list.size(); i++) {
			//list集合通过get(index)方法获取集合中的元素,index为集合下标,集合下标从0开始
			System.out.println(list.get(i));
		}
		
	}

 常用方法如表格

isEmpty()判断 arraylist 是否为空,如果为空返回true
void add(Object obj)向List集合中添加元素,元素可以重复添加,元素值可以是null
int size()获取List集合中元素的个数
Object get(int index)从List集合中获取元素
boolean remove(Object obj)从List集合中删除元素
boolean remove(int index)从List集合中删除元素
void clear()从List集合中删除所有元素

ArrayList是线程不同步,不安全的集合

LinkedList
同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。
由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入

   常用方法名称方法介绍
getFirst获取列表第一个元素
getLast获取列表最后一个元素
pollFirst获取列表第一个元素,并进行删除
pollLast获取列表最后一个元素并进行删除
pop弹出一个元素,本质是一种删除
push在链表头添加一个元素

LinkedList是线程不同步,不安全的集合

  • Vector
    与ArrayList相似,但是Vector是线程同步的。所以说Vector是线程安全的动态数组集合。它的操作与ArrayList几乎一样。

二、Set集合

Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样允许null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,同时要注意任何可变对象,如果在对集合中元素进行操作时,导致e1.equals(e2)==true,则必定会产生某些问题。Set接口有三个具体实现类,分别是散列集HashSet、链式散列集LinkedHashSet和树形集TreeSet。
Set是一种不包含重复的元素的Collection,无序,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。需要注意的是:虽然Set中元素没有顺序,但是元素在set中的位置是由该元素的HashCode决定的,其具体位置其实是固定的。
Set接口中的不重复是有特殊要求的,如果一个类重写了hashcode和equals方法,并且重写后的hashcode和equals方法是相同的话。那么这个类实例化的两个对象是不能同时放入到Set集合中去的,也就是Set集合中的去重和hashcode与equals方法直接相关。
HashSet
HashSet 是一个没有重复元素的集合。它是由HashMap实现的,不保证元素的顺序(这里所说的没有顺序是指:元素插入的顺序与输出的顺序不一致),而且HashSet允许使用null 元素。HashSet是非线程同步的,如果多个线程同时访问一个哈希set,而其中至少一个线程修改了该set,那么它必须保持外部同步。 HashSet按Hash算法来存储集合的元素,因此具有很好的存取和查找性能。
Set易出现的误区:
HashSet中可以存放null值,但只能存放一个null值。
HashSet中存储元素的位置是固定的,也是无序的,HashSet的位置是根据HashCade的实现的。
HashSet中如果存储可变对象,那么要注意一但对象发生变化,会引起错误。

public static void main(String[] args) {
		Set<String> set=new HashSet<String>();
		set.add("张三");
		set.add("张三1");
		
		for (String string : set) {
			System.out.println(string);
		}
	}

LInkedHashSet
LinkedHashSet继承自HashSet,其底层是基于LinkedHashMap来实现的,有序,非线程同步。LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
 

public static void main(String[] args) {
		LinkedHashSet<String> set=new LinkedHashSet<String>();
		set.add("张三");
		set.add("张三1");
		
		for (String string : set) {
			System.out.println(string);
		}
		System.out.println();
	}

TreeSet:

TreeMap

定义treeset集合需要指定比较器
TreeSet stu =
new TreeSet(Comparator.comparing(student::getScore));

Set<Gongzill> g=new TreeSet<Gongzill>(Comparator.comparing(Gongzill::getGongzi));
		g.add(new Gongzill(1,"5000","张三"));
		g.add(new Gongzill(2,"3000","李四"));
		g.add(new Gongzill(3,"3500","王五"));
		g.add(new Gongzill(4,"4000","赵六"));
		Iterator<Gongzill> i=g.iterator();
		while(i.hasNext()) {
			System.out.println(i.next());
		}

默认按照指定排序内容进行升序排序

​​​​​​​
三、Map集合

四、迭代器Iterator 与 ListIterator

Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。

常用方法方法介绍
boolean hasNext()判断集合里是否存在下一个元素。如果有,hasNext()方法返回 true
Object next()返回集合里下一个元素。
void remove()删除集合里上一次next方法返回的元素

public static void main(String[] args) {
		ArrayList<String> a = new ArrayList<String>();
        a.add("aaa");
        a.add("bbb");
        a.add("ccc");
        Iterator<String> it = a.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值