首先我们要知道为什么会出现集合?
面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象进行存储和操作,就必须对对象进行存储,java提供了集合类供我们使用,因此集合类就是存储对象最常用的一种方式。这就是集合类的由来。
数组和集合类同是容器,有何不同呢?那么我给大家介绍一下数组与集合类的区别:
数组:
可以存储基本数据类型,也可以存储引用数据类型。数组的长度固定。但只能存储同一种数据类型的元素。
集合:
只能存储引用数据类型。如果存储的是基本数据类型,那是因为JDK5以后,可以进行自动装箱。下面代码体现一下:
Integer i = 10; //做了什么操作,装箱 Integer i = new Integer(10);
i += 20; //做了什么操作:
// i = i + 20;
// 先把i做了拆箱,变成int类型 -- i.intValue()+20
//最后把结果30再次装箱赋值给Integer类型的i变量
集合的也有个特点那就是长度是可变的。 可以存储不同类型的对象元素,一般存储的是同一种类型的元素。
介绍完集合与数组的不同,现在介绍集合类的体系结构,图解:
----collection 的几种方法
存储:add,addAll 删除:remove,removeAll,clear 判断:contains, containsAll,isEmpty
取出:iterator 将集合变成数组:toArray 取两个集合的交集:retainAll 获取集合的长度:size
----List接口中的特有方法
存储元素:add(int index,Object obj ) 删除元素:remove(int index) 修改元素:set(int index,Object obj) 截取元素: subList(int start,int end) 获取元素:get(int index) 获取位置:indexOf(Object obj) 特有迭代器:listIterator
----List 接口下的几种常用的类的特点:
ArrayList:底层数据结构是数组结构。线程不安全。所以它的出现替代了Vector。增删的效率很慢,但是查询的效率很高。
Vector:底层数据结构是数组结构。线程安全。无论增删还是查询都非常慢。
LinkedList:底层是链表数据结构。线程不安全。对元素的增删的操作效率很高,查询的效率低。
-----Set 接口下的常用类介绍:
HashSet底层数据结构是哈希表。哈希表这种结构,其实就是对哈希值的存储。
如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals
HashSet的一个子类的介绍
LinkedHashSet:它是基于哈希表和链接列表结果的对象。它既用哈希表存储数据,又用链表保证元素有序。
TreeSet
数据结构是二叉树数据结构。这种结构,可以提高排序性能。
它又是如何保证元素唯一性的呢?
它通过compareTo方法来达到这一目的。实现compareTo方法有两个 1:让元素具备比较性,元素需要实现Comparable接口,覆盖comparableTo方法,这个方式称为元素的自然比较顺序。 2:让集合具备比较性,当你觉得自然比较性不爽时,你可以自定义比较器,实现Comparator接口,覆盖compare方法。
--Map 集合的特点:
1:是一个双列集合
2:Map一次存一对元素,以键值对的形式存在,键和值有对应关系
3:Map集合中必须要保证集合中键的唯一性
Map接口中的功能:
存储:put,putAll
删除:remove,clear
判断:containsKey,containsValue,isEmpty
获取:size,get,keySet,values, entrySet
Map下的常用类:
HashMap:底层也是哈希表数据结构。线程不安全。允许null作为键和值,替代了Hashtable
Hashtable:底层是哈希表数据结构。线程安全。不允许null作为键和值。
TreeMap:底层是二叉树。线程不安全。可以用来对Map集合中的键进行排序。
那么,就差不多介绍到这里了,关于取出集合元素呢我提供一个Iterator 迭代器。