集合应该怎么玩
集合之诞生
不用多说了,在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);//通过键拿到值
更多内容请前往公众号“每天学Java” 免费资源、工具等你get