JAVA容器集合

容器集合

JDK1.2开始引入了集合框架的概念,以弥补java中只有数组这种容器的单一问题,这些框架多数由接口构成,另外也包含了一些对于接口实现的类,其中这些接口的最上层接口为java.util.Collection,Collection下也包含几个常见的子接口:List(列表)、Set(集合)、Queue(队列);另外还有个常见接口:Map.

List(列表)

List是java集合框架种最常见的一个集合接口,直接从Collection继承而来;List集合是一个有序集合(内部的元素顺序按照添加顺序存储);List接口中包含几个常用的实现类:ArrayList、LinkedList、Vector。

  • ArrayList:(数组列表),基于动态数组的实现
  • LinkedList: (链表),基于链表的实现
  • Vector:(数组列表),基于动态数组的实现

ArrayList基本使用

public class ArrayListDemo {

	public static void main(String[] args) {
	
		List<Integer> list = new ArrayList<>();
		list.add(10);
		list.add(20);
		list.add(30);
		//不允许在对集合遍历时调用集合的remove方法更改元素,会抛出一ConcurrentModificationException
		//如果需要在遍历时删除,因该调用通过集合获取的迭代器对象自生的remove方可更改
		Iterator<Integer> it = list.iterator();
		while(it.hasNext()){
			int i = it.next();
			//remove前要确保next()获取过元素,否则会出现IllegalStateException
			it.remove();
		}
	}

注意事项:

ArrayList、LinkedList、Vector区别是什么?
ArrayList:是基于动态数组的实现,内部的实现基于数组完成,因此在进行元素查找的时候只需要根据元素的索引即可快速找到,但是在更新时或者插入时,由于数组结构是连续的,元素一旦向中间插入,则后续的元素需要整体后移,效率低。ArrayList是线程不同步的实现,在多线程并发操作时不能保证数据的安全,但是效率高;另外ArrayList在进行容量扩充是增长原来的1.5倍(增长原来长度的一半);线程安全的ArrayList可以使用java.util.concurrent.CopyOnWriteArrayList
LinkedList:是基于双链表的实现,集合中元素的组织是通过元素的首尾指针连接,在进行数据修改时只需要改动指针的指向即可轻松实现,但是在进行查询的时候,需要从链表头依次搜索,因此修改时,效率较低.
Vector:和ArrayList一样也是基于动态数组的实现,但是Vector是老式JDK(JDK1.0)中的一个动态数组类,提供的是一些线程安全(线程同步)的集合操作,因此,在多线程并发时,对数据的安全性会有一定保障,但是带来的影响就是效率低;另外Vector当容量不足时会在原来长度的基础上增长一倍(ArrayList增长一半)

Set(集合)

Collection接口还提供了另一个子接口Set,Set是一个无序集合,元素的存储顺序不是按照添加顺序存储(具体存储顺序跟使用的实现类有关);因为元素的存储是无序的,因此无法像List一样通过索引获取元素,所以对于Set集合中元素的获取只能通过迭代器进行迭代;另外Set集合中不允许出现重复的元素(不允许存在e1.equals(e2)),实际上是后出现的元素会覆盖原来存在的。

Set集合有两个常见的实现:

  1. HashSet:基于散列算法(Hashtable)实现的元素存储顺序
  2. TreeSet:基于二叉树中红黑树的实现,元素的排序方式需要通过实现Comparable或者Comparator接口完成

HashSet和TreeSet区别?
HashSet:基于Hash表实现的元素存储,内部元素的排序按照hash表中的地址进行排序,内部允许null值存在,但是不允许重复的元素,如果一旦出现重复的元素(此时hash值是已经存在的情况,不会将新的元素存储)。
TreeSet:基于树的实现,内部元素的排序需要通过提供排序比较器(Comparable,Comparator)进行实现;内部的元素必须是Comparable实现类(或者在创建TreeSet对象时提供Comparator比较器),并且由于比较器内部会使用到集合中的元素,因此元素不允许为null(会导致NullPointerException).

Map

Map接口是JDK1.2新增集合框架中的一种容器,Map集合内部的元素存储采用键值对(Key-Value)结构,key不允许重复,另外每一个key都会对应一个value对象;Map集合有三个常见实现类:

  1. HashMap
  2. TreeMap
  3. Hashtable

HashMap使用

public class HashMapDemo {

	public static void main(String[] args) {
		
		HashMap map = new HashMap();
		map.put(3.14, Math.PI);
		map.put(1, "hello");
		map.put(true, new String("true"));
		map.put("a", "admin");	
		System.out.println(map);	
		System.out.println(map.get("a"));
		
		//获取Map集合中键集(keys)
		Set set = map.keySet();
		for (Object key : set) {
			System.out.println(key+"-----"+map.get(key)); 
		}
		
		//获取Map集合中值集(values)
		Collection c = map.values();
		for (Object v : c) {
			System.out.println(v);
		}
	}
}	

HashMap、Hashtable、TreeMap的区别?
HashMap:是基于hash表的实现,是Map接口的一个实现类,内部的元素存储顺序是根据key的hash地址进行排序,因此,元素的顺序存储顺序可能跟添加的顺序不一致;HashMap使用链表加数组共同来实现元素存储;HashMap允许空键值出现,但是不允许重复的键存在(值可以重复);HashMap是线程不同步的实现,因此在操作数据时效率较高,但是线程并发是不能保障数据的一致性。如果多线程并发下使用建议使用:java.util.concurrent.ConcurrentHashMap****
Hashtable:Hashtable是集合框架出现之前的键值对集合解决方案,从Dictionary类(JDK1.0)继承而来,在JDk1.2出现Map接口后,Hashtable又从改接口实现,Hashtable不允许空键值出现,该类的实现是线程同步,因此在多线程并发操作时对数据的一致性有保障,但是效率低。
TreeMap:是基于二叉树中的红黑树实现,元素的存储按照键的自然顺序排序(键必须实现Comparable接口,或者在创建TreeMap对象时指定的Comparator比较器),TreeMap中的键必须是相同的数据类型,并且不允许空元素出现,同HashMap一样,TreeMap也是线程不同步的实现。

Collections类

Collections类是是一个用于对集合进行一些常规操作的工具类(排序,查找,反转等),内部包含的都是静态方法.

public class CollectionsDemo {

	public static void main(String[] args) {
	
		List<String> list = Arrays.asList("tom","jack","rose","lucy","lily");
		List<String> list2 = Arrays.asList("狗蛋","傻根","旺财","来福");
		System.out.println(list);
		
		//二分查找
		int pos = Collections.binarySearch(list, "rose");
		System.out.println(pos);
		
		//将第二个集合拷贝到第一个集合中(第一个集合中的元素会被覆盖)
//		Collections.copy(list, list2);
//		System.out.println(list);
	
		Collections.emptyList();	
		String s = Collections.max(list);
		System.out.println(s);
		
		//反转集合
		Collections.reverse(list);
		System.out.println(list);
		
		//洗牌
		Collections.shuffle(list);
		System.out.println(list);
		
		//排序
		Collections.sort(list);
		System.out.println(list);
	}

}

总结

在容器集合学习过程中会结合一些数据结构方面的知识,这样可以帮助自身理解这些接口与类的底层实现,更能帮助自身去掌握它,但是我觉得最重要的是在面对实际问题时要如何选择最合适的容器集合去解决问题,那才是最重要的,而对于这些容器集合的使用方法可以自己去参考一下API文档,这样能帮助自己运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值