-------
什么是集合
集合是一个容器.
使用数组时通过下标操作数组中的元素
集合与数组比较
数组有什么特点?
1.有顺序
2.定长
3.类型单一
集合特点:
1.有顺序也可以没顺序
2.集合长度可以随着元素的增加而增加
3.集合中可以装入任何Object
java中的集合类都在java。util包下
java中的集合元素全是Object类型
集合类和数组的区别
数组和集合类都是容器,喝什么不同呢?
数组肃然可以存储对象,但长度是固定的;集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
并且集合可以存储不同类型的对象。
集合框架:
【Colection】
|----List: 元素是有序的,元素可以重复,因为集合体系有索引. 特点:增删操作快,查询操作稍慢.线程不同步.
|---LinkList: 底层使用的是链表结构. 特点: 增删操作快,查询操作稍慢.
|----Vertor: 底层是数组结构.线程同步.被ArrayList替代.
|-----Set: 元素是无序的(存入和取出顺序不一定一致),元素不可以重复.
|----HashSet: 底层数据结果是哈希表/
|----TreeSet: 底层数据结构是二叉树. 特点: 可以对Set集合中的元素进行排序.
取出List元素的方式:
. iterator():通过迭代方法获取迭代器对象。
迭代:迭代是取出集合中元素的一种方式。因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
用法:
Iterator
while(iter.hasNext())
{
System.out.println(iter.next());
}
for(Iterator
{
System.out.println(iter.next());
}
迭代注意事项:迭代器在Collcection接口中是通用的,它替代了Vector类中的Enumeration(枚举)。迭代器的next方法是自动向下取元素,要避免出现NoSuchElementException。迭代器的next方法返回值类型是Object,所以要记得类型转换。
List接口
st是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
基本操作:
增加元素:add
删除元素:remove
求交集:retainAll
访问/遍历集合元素的最佳方法使用Iterator接口(迭代器用于取代Enumeration)
Set接口中常用的类:HashSet:线程不安全,存取速度快。
TreeSet:线程不安全,可以对Set集合中的元素进行排序。
Set集合元素唯一性原因:HashSet:通过equals方法和hashCode方法来保证元素的唯一性。TreeSet:通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。
泛型:JDK1.5以后出现的机制
泛型的特点:提高了程序的安全性将运行期遇到的问题转移到了编译期省去了类型强转的麻烦泛型类的出现,优化了程序设计。
Map集合
Map与Collection在集合框架中属并列存在。Map存储的是键值对,存储元素使用put方法Collection使用add方法,Map集合没有直接取出元素的方法,而是先转成Set集合再通过迭代获取元素。Map集合中键要保证唯一性。
Map集合常用类:Hashtable:线程安全,速度慢,不允许存放null键,null值,已被 HashMap替代。
.
TreeMap:对键进行排序,排序原理与TreeSet相同。
集合框架中的工具类:Collections对集合进行查找,取出集合中的最大值,最小值,对 List集合进行排序等。
Arrays将数组转成List集合,对数组进行排序,对数组进行二分 查找。
新增for语句:Collection在JDK1.5后出现的父接口
格式:
for(数据类型
{
执行语句;
}
简化了对数组,集合的遍历。
返回值类型
{
执行语句;
}
其实接收的是一个数组,可以指定实际参数个数。
总结:
涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。