集合可以看作是一种容器,用来存储对象信息。
关于集合和数组的不同点:
数组的长度是固定的,如果想增加长度,只能创建新的数组。
集合的长度是可变的,数据理论可以无限添加,自动扩容。
数组元素的类型必须是同一种类型,比如 String[] arr = ["a","b","c"];
集合元素可以是不同的类型 ArrayList<Object> arr = new ArrayList<Object>();
Java集合类主要由两个根接口Collection和Map
Collection:
集合的顶层接口
有三个子类
list---------------- 列表是有序的,有下标的,可重复的
ArrayList
ArrayList实现了长度可变的数组,在内存中分配连续的空间
– 优点:遍历元素和随机访问元素的效率比较高
– 缺点:添加和删除需要大量移动元素效率低,按照内容查询效率低
LinkedList
LinkedList采用链表存储方式。
– 优点:插入、删除元素时效率比较高
– 缺点:遍历和随机访问元素效率低下
Vector Vector 类实现了一个动态数组。和 ArrayList 很相似 过时了
Vector和ArrayList的联系和区别:
– 实现原理相同,功能相同,都是长度可变的数组结构,很多时
候可以互用
– 两者的主要区别如下
▪ Vector是早期的JDK接口,ArrayList是替代Vector的新接口
▪ Vector线程安全,ArrayList重速度轻安全,线程非安全
▪ 长度需要增长时,Vector默认增长一倍,ArrayList增长50%
(1.5+1)
Set-----------------集合是无序的,但是要把LinkHashSet除外,没有下表,不可重复!
(存入和取出的顺序丌一定一致) 操作数据的方法不List类似,Set接口不存在get存在get()方法!
HashSet:采用Hashtable哈希表存储结构
优点:添加速度快,查询速度快,删除速度快
缺点:无序
LinkedHashSet
采用哈希表存储结构,同时使用链表维护次序
有序(添加顺序)
TreeSet
采用二叉树(红黑树)的存储结构
优点:有序(排序后的升序)查询速度比List快
缺点:查询速度没有HashSet快
Queue 队列 队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。
Map:
HashMap-------------------------
Key无序 唯一(Set)
Value无序 丌唯一(Collection)
TreeMap-------------------------
有序 速度没有hash快
ConcurrentHashmap---------------
并发相关的Map
HashMap和Hashtable的联系和区别:
– 实现原理相同,功能相同,底层都是哈希表结构,查询速度快,
在很多情况下可以互用
– 两者的主要区别如下
▪ Hashtable是早期的JDK提供的接口,HashMap是新版的
JDK提供的接口
▪ Hashtable继承Dictionary类,HashMap实现Map接口
▪ Hashtable是线程安全,HashMap线程非安全
▪ Hashtable丌允许null值,HashMap允许null值
Iterator 接口:
所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象。
▪ Iterator对象称作迭代器,用以方便的实现对容器内元素的遍历操作。
▪ Iterator接口定义了如下方法:
boolean hasNext(); //判断是否有元素没有被遍历
Object next(); //返回游标当前位置的元素并将游标移动到下一个位置
void remove(); //删除游标左面的元素,在执行完next之后该
//操作只能执行一次
Collections工具类
Collections和Collection不同,前者是集合的操作类,后者是集合接口
Collections提供的静态方法
addAll():批量添加
sort():排序
binarySearch():二分查找
fill():替换
shuffle():随机排序
reverse():逆序
泛型:
泛型解决了数据类型操作丌统一产生的异常。
使用泛型可以更好的去保护数据类型。
一个例子:
List arrayList = new ArrayList();
arrayList.add("abc");
arrayList.add(100);
for(int i = 0; i< arrayList.size();i++){
String item = (String)arrayList.get(i);
Log.d("泛型测试","item = " + item);
}
运行结果会崩溃,并且报:java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
arrayList里面没有规定泛型,就可以在里面添加不同类型的元素!当再拿出来的时候,发现int类型以String类型拿出来的时候,报错了!
如果我们在一开始就规定好了泛型例如:
List<String> arrayList = new ArrayList<String>();
那么在进行 arrayList.add(100); 的时候,程序在编译期间就会报错!
泛型有三种使用方式,
分别为:
泛型类:
泛型接口
泛型方法
还有泛型的上限 和 下限
等待以后补充..........