Java集合简单介绍

学了这么长时间的Java集合框架了,虽然说细节方面掌握的不是很牢靠,但是具体的使用头脑里还是很清楚,接下来我就分享一下我对Java集合的认识:

话不多说,先上一张图看看:


(1)Collection接口最最基本的集合接口,它提供了多个最基本的方法,供其集合接口使用。Collection接口派生出了两个子接口List接口,Set接口。


(2)List接口实际派生出三个实现类:ArrayList、LinkedList、Vector

这三者共同的特点:允许元素重复,并且能记录元素添加的先后顺序!

ArrayList:本质底层实现是以数组形式,而且添加元素时,数组是可变的,线程不安全;

LinkedList:本质底层实现是以双向链表的形式,而且还实现了Stack、Quene、Deque类,具有栈,队列,双向队列的特点,线程不安全;

Vector:本质上底层也是使用数组的形式来实现,可变,线程安全,每一个方法都使用了synchronized关键字修饰,也是Stack(栈)的父类


(3)Set接口派生出两个实现类:HashSet、TreeSet以及HashSet派生出子类LinkedHashSet类

两者共同特点:不允许元素重复,线程不安全!

HashSet:底层使用哈希表算法,本质上借用了HashMap底层的实现,并且是线程不安全的;

LinkedHashSet:底层使用了哈希表 + 双向链表算法实现,不允许元素重复,但是能够保存元素添加的先后顺序。


话不多说,再来一张图耀耀眼:



(4)Map接口没有继承Collection接口:

Map接口俗称映射,是两个集合之间的关系(key集合,value集合),但是每一个元素Entry(key-value)对形式保存的,只保证key值不重复,value属于附属;所以Entry元素就不会重复,满足Set集合的定义,也就称之为集合!

Map接口派生出两个实现类HashMap、TreeMap以及HashMap派生出子类LinkedHashMap类,最常用为HashMap实现类:

特点:元素不能重复(重复是指key不能重复,value可以),线程不安全!

HashMap:底层使用了哈希表算法,键值对元素不重复,不能保证元素添加的先后顺序,线程不安全;

LinkedHashMap:底层使用了哈希表 + 链表的算法,元素依然不重复,却能保证元素添加的先后顺序,线程不安全!


(5)Collection接口继承了Iterable接口,Collection接口的实现类都可以调用iterator()方法,返回一个实现Iterator接口的实例对象,因此就可以使用Iterator接口提供的for-each增强for循环(for-each本质上底层也是使用了迭代器遍历元素)

注意:如果需要边迭代边删除集合元素,必须要使用迭代器迭代遍历集合元素(而且必须要使用 迭代器 中的remove()方法)

1)当迭代时,在A线程中会单独的创建一个新的B线程,A线程赋值迭代,B线程负责去删除元素;

2)注意:B线程在删除的过程当中,每次会自动检查和A线程中的元素个数是否相同,如果不同,就会报错(并发修改异常)

public static void main(String[] args) {
		List list = new ArrayList();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");
		
		Iterator it = list.iterator();
		while(it.hasNext()){
			Object ele = it.next();
			if("B".equals(ele)){
				list.remove(ele);	//不能使用集合对象中的remove()方法
				//it.remove();
			}
		}
		System.out.println(list);
	}


这样做会出现并发修改异常:

Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at com.xupt.iterator.ForEachDemo.main(ForEachDemo.java:25)


解决方案:(保证删除迭代器中元素时,同时也要删除集合中的元素)

a) Collection接口中存在删除指定元素的方法:boolean remove(Object ele),该方法只能从集合中删除元素,不能从迭代器中指定的元素也删除;

b) 使用Iterator中的remove(Object ele)方法即可解决,该方法会从两个线程中同时移除指定元素,保证了两个线程的同步


(6)Arrays和Collections工具类:

Arrays这个工具类:主要提供数组中需要操作的一些静态方法,方便数组的数据操作!

主讲一个方法:

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

这个方法,会返回一个固定长度的List集合:(注意:这个List集合在Arrays类内部,并且没有和java.util.*关联)

//将数组转换为List对象
		List<String> list1 = Arrays.asList("A","B","C","D");
		list1.remove(0);	//报错:java.lang.UnsupportedOperationException(不支持操作异常)
		
		
		System.out.println(list1);


这个方法返回的List集合,不能添加、删除数据,否则报错,只能修改!


Collections类是Collection接口的工具类,主要提供了一些静态封装好的方法供其Collection集合实现类去使用!

Collections工具类中使用这三个方法,实现线程同步:



List list = Collections.synchronizedList(new ArrayList());	//返回一个线程安全的ArrayList集合
      ...
//当要迭代的时候得使用synchronized,因为迭代开启两个线程!
  synchronized(list) {	//锁定当前ArrayList集合的实例对象
      Iterator i = list.iterator(); // Must be in synchronized block
      while (i.hasNext())
          foo(i.next());
  }

常用方法简介:

//使用指定元素替换指定列表中的所有元素

public static <T> void fill(List<? super T> list,T obj)

 

//将所有元素从一个列表复制到另一个列表。执行此操作后,目标列表中每个已复制元素的索引将等同于源列表中该元素的索引

public static <T> void copy(List<? super T> dest,

                            List<? extends T> src)

 

//返回指定 collection 中等于指定对象的元素数

public static int frequency(Collection<?> c,Object o)

 

//根据元素的自然顺序,返回给定 collection 的最小、最大元素

public static <T> Tmin/max(Collection<? extends T> coll)

 

//反转指定列表中元素的顺序

public static void reverse(List<?> list)

 

sort()函数,底层使用了Arrays类中的sort()实现,二路归并算法!






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值