集合应该怎么玩

集合之诞生

不用多说了,在Java世界我们每天和什么打交道?代码?不对,是和对象打交道。程序在运行的时候才会去创建对象,试想一下开发阶段代码无法编译,我们也不知道要创建多少对象,也不知道对象的确切类型时。我们怎么去解决?可能数组可以解决燃眉之急,可以解决创建数量问题,但是类型一定是统一的。这就难搞了对吧,这时候集合的作用就显现出来了。

 

集合之框架结构

下面看下集合家族是如何由**人物Collection和Map创建兴起的

 

Map放在下边不是对他有意见而是他的家族人员比较少,但是它的复杂程度绝对是很高的,对HashMap和ConcurrentHashMap有过研究的小伙伴队都会知道。在后面我们会专门来说这些东西的。

提到Map大家都很清楚键值对,没啥异议。但是提到Collection大家有木有和Collections混淆的,他两长的太像了,有图有真相,我从jdk1.8API中特意拎过来了。

但是其实Collections只是为了方便优秀的你们更加方便的操作Collection集合以及其子类而存在的工具类。

 

在jdk1.8API中是这样说的“ 此类仅由静态方法组合或返回集合。 它包含对集合进行操作的多态算法,“包装器”,返回由指定集合支持的新集合,以及其他一些可能的和最终的。 如果提供给它们的集合或类对象为null,则此类的方法都抛出一个NullPointerException 。”

 从这里我们可以知道其包含方法都是静态,并且是操作集合的一些算法,部分返回值可能是指定的集合或者指定集合的子类。因为此类中的方法大都是泛型,所以要是传入null对象就会抛出我们最常见的异常NullPointerException。(想了解异常的同学可以看前边的文章)

 

Collection家族各元老的特性

我们可以看到collection下边有三大子接口Set、Queue、List。(当然子接口不止这三个)

Set子接口:无序,但不允许重复。

List子接口:有序,但允许元素重复。

Queue子接口:只能在对列尾进行插入,只能在队列头进行删除,获取和修改。可以用一句话概括“先来先服务”。

 

Collection集合下的具体实现类比较多,还有他们的插入和删除的效率问题,以及底层的数据结构我们放在后边的详细介绍中讲。这里就不多做赘述(不是一两句能说清楚的)(也可以先看文章末尾的视频讲解链接)。

 

Map家族四大掌门的特性

Map下边有四大实现类HashMap、Hashtable、LinkedHashMap、TreeMap

我们都知道Map的存储方式是键值对,他始终遵循一个原则“键要唯一,值无所谓”,

 

Hashmap 是一个 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,也就是说任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections工具类的里的static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 方法使HashMap同步。

 

Hashtable 与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,现在基本上弃用,使用ConcurrentHashMap来代替。

 

LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历 的时候会比HashMap慢。

 

TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。

 

 

遍历神器----迭代器

说起集合怎能忘记迭代器呢,下面我们就看下迭代器。

//迭代器的创建与使用

Iterator it = map.keySet().iterator();

while (it.hasNext()) {

       key = it.next();

       value = map.get(key);

System.out.println("key: " + key + "; value: " + value);

}

一般我们要是遍历一张表的时候可以这么用:

// 或者使用迭代器遍历Map的记录Map.Entry

 Map.Entry entry = null;

 it = map.entrySet().iterator();

 while (it.hasNext()) {

        entry = (Map.Entry) it.next();//表中一条记录

        // 通过entry可以获得记录的键和值

        System.out.println("key: " + entry.getKey() + "; value: " + entry.getValue());

 }

当然遍历还可以使用增强for循环,增强for循环大家用的比较多就不说了。

 

Map的用法

Map大家都使用的比较多了,在这就提一下他的用法格式

Map myMap = new TreeMap();//创建map对象

String key="每天";//定义键

String vaule="学java";//定义值

myMap.put(key,vaule);//put键值对   添加

//放得进去也得拿得出来

myMap.get(key);//通过键拿到值

 

https://mp.weixin.qq.com/s?__biz=MzU0MDg1MzQzNA==&mid=2247484045&idx=1&sn=65e968a6d5b14bb3292f7dd92d660895&chksm=fb339758cc441e4eaefe9803e6ebfdb5c760b5ba10ac9ea24a5f6c4ee34738c57038245f514e&token=1784242693&lang=zh_CN#rd

更多内容请前往公众号“每天学Java”  免费资源、工具等你get