您的位置:首页 > 其它

集合(关于collection)

2015-10-19 21:50 309 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

collection:collection是单列集合的顶层接口,collections是其工具类,要学习collection接口,那么先要搞清楚它的分类,用一张图清晰的表示一下,学起来比较方便.



首先声明collection是单列集合的顶层接口,这个要和map集合区分开,map集合是双列结合的顶层接口

(一)collection

collection下面分为两类:一个是list,另一个是set,list下面有三个分支vector,arraylist,linkedlist;set下面有两个分支:treeset和hashset

(二)list和set

list和set的异同:首先他们都是继承自collection的接口,list是存取有序的,并且值是可以重复的,而set集合是存取无序的,并且值是唯一的.

vector底层是数组结构的,但因为效率较低,后来被arraylist取代了,他们的属性都是一样的,只是vector效率低

arraylist底层也是数组结构,线程同步,但不安全,效率较高,主要用于查询,而增删就比较慢了,此刻不得不介绍linkedlist,这个集合底层是链表结构,因为它的增删效率非常的高,但是查询就比较慢了,这都是由于他们的底层构造所决定的,linkedlist也是线程同步的,不安全性质伴随存在,效率较高.

再来说set集合,hashset底层是哈希表,而treeset底层是二叉树

那么他们是怎么保证元素的唯一性的呢,hashset是因为它自身重写了hashcode() 和equals()方法,hashcode比较的是元素的地址值,而equals比较的是元素的属性值.

treeset是通过匿名内部类,重写了compareto方法,来保证元素的唯一性,如果这个数和之前一样那么返回0,如果前面没有重复,返回值是1,向set集合添加元素,其实根据二叉树也能够得到这个结论,将第一个数作为根节点,下一个数如果比第一个数小那么,就添加到根节点的左孩子的位置,如果大就添加到根节点的右孩子位置,如果一样大,系统默认为覆盖.

那么介绍完再来说一下集合和数组的区别:最大的区别就是集合的长度是可变的,而数组的长度是不可以改变的,是固定的.数组中既可以添加基本类型的元素,也可以添加引用数据类型的元素,而集合只能添加引用数据类型的元素.

通过长度可变不可变,我们还能延伸出迭代器的问题.

(三)迭代器
<span style="color:#000000;">public static void main(String[] args) {

Collection c = new ArrayList();
c.add(new Student("张三", 23)); //Object obj = new Student("张三",23);
c.add(new Student("李四", 24));
c.add(new Student("王五", 25));
c.add(new Student("王佳", 26));

//获取迭代器
Iterator it = c.iterator();
while(it.hasNext()) {
//System.out.println(it.next());
Student s = (Student)it.next();	//向下转型
System.out.println(s.getName() + "..." + s.getAge());
}

}</span>


以上代码就是通过迭代器遍历这个集合,吗么需要注意的就是向下转型问题,记住一定要向下转型,不然编译就会错误,因为要用到子类的特性了.

虽然在代码当中没有展示Student类,可是需要注意的是Student类中一定要重写tostring方法,否则输出的那些那些乱码相信大家都遇到过吧.

在这里需要特别说明一个问题:在迭代器进行迭代的时候能不能同时修改集合中的元素呢????

答案肯定是不能的.这个迭代器是根据集合创建出来的,如果你修改了集合中的元素,迭代器同样会发生变化,这时候就会出现一个异常,叫做并发修改异常,一定要记得这个异常

并发修改异常:ConcurrentModificationException,在java中,这种异常是运行通过不了的.

那么应该如何解决这个问题呢??

a.如果我们想修改集合中的元素,可以通过普通for来遍历这个集合,对集合中的元素进行修改.

b.使用list集合中的特有的迭代器ListIterator,记住这个迭代器是list集合特有的迭代器,对元素进行修改.
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");	//Object obj = new String();
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e");

ListIterator lit = list.listIterator();	//获取迭代器
while(lit.hasNext()) {
System.out.println(lit.next()); 	//获取元素并将指针向后移动
}

System.out.println("-----------------");

while(lit.hasPrevious()) {
System.out.println(lit.previous()); //获取元素并将指针向前移动
}
}


以上是用代码举例说明ListIterator迭代器,如果直接用list集合添加"javaee",那么迭代器也会发生变化(list.add("javaee")),而我们用list集合特有的迭代器进行添加(lit.add("javaee")),是不会有问题的.

至于linkedlist,要说下当中的特有的方法
addFirst();

addLast();

RemoveFirst();如果集合当中没有元素,那么会出现空元素异常NoSuchElementException

RemoveLast();如果集合当中没有元素,那么也会出现空元素异常NoSuchElementException
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: