集合框架学习

本文深入解析Java集合框架,包括各种接口如Collection、List、Set、Map的特性与用途,以及其实现类如LinkedList、ArrayList、HashSet、TreeSet的运作原理。同时,探讨了Vector与ArrayList的异同,以及如何高效遍历集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、框架和基本集合必须要高效的
2、框架中允许有不同类型的集合,以类似的方式工作,具有高度操作性
3、对集合的扩展和适应必须是简单的。

所以,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,例如:LinkedList 、TreeSet 、HashSet等,也可以通过这些接口实现自己的集合。

Map(图):存储键/值对 映射
Collection(集合):存储元素集合{List、Set、Queue}

接口:代表集合的抽象数据类型。定义多个接口是为了以不同的方式操作集合对象
实现(类):集合接口的具体实现。
算法是实现集合接口的对象里的方法计算。

1 Collection接口
Collection代表一组Object,即Collection的元素,元素在Collection中无序,可重复,只提供继承与的子接口(如List和Set)

2 List 接口
List接口继承于Collection,是一组有序、可重复的Collection

3 Set接口
Set接口继承于Collection,存储无序,不可重复的对象

4 SortedSet
顾名思义,是Sorted(排序过的)Set,所以他存储有序,不可重复的集合

5 Map
Map接口存储键值对像,提供key到value的映射

6 Map.Entry
描述在Map中的一个元素(键/值对)。是一个Map的内部类

7 SortedMap
以升序排序key,继承与Map

Set和List的区别
1、Set接口实例存储的是无序的不重复的数据。而List可以存储有序和可重复的元素
2、Set检索效率低,插入删除效率高,且不会影响元素位置变化**<实体类有TreeSet、Hash Set>**
3、List和数组类似,插入删除会影响元素位置变化,但是查找的效率高,可动态增长。

集合类实现类
1、AbstractCollection 实现了大部分的集合接口
2、AbstractList 实现了大部分的List接口,继承与AbstractCollection
3、AbstractSequentialList 继承于AbstractList,提供了对数据元素的链式访问而不是随机访问
4、LinkedList 该类实现了List接口,允许有null(空)元素。主要用于创建链表数据结构,无同步方法,多线程许实现访问同步,需创建List时候构造一个同步的List
如:Listlist=Collections.synchronizedList(newLinkedList(…));

5、ArrayList 该类实现List接口,实现了可变大小的数组,随机访问、遍历元素有好性能。非同步,不能多线程使用

6、AbstractSet 实现了大部分Set接口

7、LinkedHashSet 具有可预知迭代顺序的Set接口的哈希表和连接列表实现

8、HashSet 该类实现了Set接口,不允许出现重复元素,不保证集合中元素的顺序,只允许有一个null。

9、TreeSet 实现了Set接口,可实现排序等功能

10、AbstractMap 实现了大部分Map接口

11、HashMap 是一个散列表,存储这键值对映射,具有很快的访问速度,不支持线程同步

12、TreeMap 继承AbstractMap,使用树

13、LinkedHashMap 继承于HashMap。使用元素的自然顺序排序

Vector
该类和ArrayList非常相似,允许多线程使用,默认增长长度,默认扩容方式为原来两倍。

Stack
栈是Vector的一个子类,实现了后进先出的栈

Dictionary
是一个抽象类,用来存储键值对,与Map类似

如何使用迭代器
通常遍历一个集合时,都是采用for循环或者增强for,这两个方法都可以用在集合框架,但是还可以使用迭代器遍历集合框架,它是一个对象,实现了Iterator接口或ListIterator接口。

遍历ArrayList

public class Test{
	public static void main (String[] args){
		List<String> list=new ArrayList<String>();
		list.add("Hello");
		list.add("World");
		list.add("Ha");
		//第一种遍历方法使用foreach遍历list
		for (String str : list){			//也可以写为for(int i = 0 ; i< list.size(); i++)这种形式
			System.out.println(str)
		}


		//第二种遍历,把链表变为数组相关内容遍历
		String []  strArray=new String[list.size()];
		list.toArray(strArray);
		for(String str:list){
			System.out.println(str)
		}
		
		//第三种遍历方式:使用迭代器
		Iterator<String> ite=new list.iterator();
		while(ite.hasNext()){
			System.out.println(ite.next());
		}
	}
}
public class Test{
	public static void main(String[] args){
	Map<String,String> map=new HashMap<String,String>();
	map.put("1", "value1");
	map.put("2", "value2");
	map.put("3", "value3");
	
	//第一种:普遍使用,二次取值
	System.out.println("通过Map.keySet遍历key和value:");
	for(String key : map.keySet()){
		System.out.ptintln("key=" + key + " and value" + map.get(key));
	}
	
	//第二种:
	System.out.println("通过Map.entrySet使用iterator遍历key和value:");
	Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
	while (it.hasNext()){
		Map.Entry<String,String> entry=it.next();
		System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
	}

	//第三种:推荐,尤其是容量大的时候
	System.out.println("通过Map.entrySet遍历key和value");
	for (Map.Entry<String,String> entry : map.entrySet()){
		System.out.println("key=" + entry.getKey() + "and value" + entry.getValue());
	}

	//第四种
	System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
    for (String v : map.values()) {
      System.out.println("value= " + v);
	}
}

在这里插入图片描述
a.如果在初始化ArrayList的时候没有指定初始化长度的话,默认的长度为10.
b.ArrayList在增加新元素的时候如果超过了原始的容量的话,ArrayList扩容ensureCapacity的方案为“原始容量*3/2+1"哦。
c.ArrayList是线程不安全的,在多线程的情况下不要使用。

 如果一定在多线程使用List的,您可以使用Vector,因为Vector和ArrayList基本一致,区别在于Vector中的绝大部分方法都

 使用了同步关键字修饰,这样在多线程的情况下不会出现并发错误哦,还有就是它们的扩容方案不同,ArrayList是通过原始

容量*3/2+1,而Vector是允许设置默认的增长长度,Vector的默认扩容方式为原来的2倍。

切记Vector是ArrayList的多线程的一个替代品。

d.ArrayList实现遍历的几种方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值