欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单列集合Collection-------------List和Set

程序员文章站 2024-03-16 18:45:34
...

 

为了弥补对象数组的不足:长度固定,进行里面的增删改查很不方便:所以有了集合对对象进行大规模的操作,将数组封装,操作都封装为公共方法

 

集合和数组的区别

相同点

                          都是用来存储数据的容器,一大堆零散的数据不方便进行管理,装进去进行统一的操作管理

不同点

                        存储内容不同

                             数组既可以存放基础数据类型,也可以存放引用数据类型;而且数组存储的类型是指定的

                              集 合只能够存储引用数据类型,如果要存放引用数据类型,封装成包装类;

                       存储数量不同

                                数组的长度时不可变的,一旦确定大小就无法更改

                                集合的长度时可变的,是一个可以伸缩的容器

                      可使用的方法不同

                                数组中只能调用Object中继承下来的方法

                                 集合中有很多自己的方法

集合体系

                                        单列集合Collection-------------List和Set

集合分类

              单列集合:每个元素都是一个单独的个体

              双列集合:每个操作都是针对一对数据进行操作,一对数据作为一个单位:Key(键值)——Value(真实值)

单列集合体系

Collection:单列结合的顶层接口

           List:有序的子接口

                    ArrayList:底层为数组,顺序存储

                    LinkedList:底层为链表,链式存储

                    Vector:被ArrayList取代

           Set:无序的一个子接口

                    HashSet:哈希存储

                    TreeSet:二叉树存储

双列集合体系

           Map:双列集合的顶层接口

                    HashMap:哈希存储

                    TreeMap:二叉树存储

Collection常用方法

                                    add(E e):添加元素

                                    remove(Object o):删除元素

                                    clear():删除所有元素

                                    isEmpty():判断是否为空

                                    contains(Object o):判断集合中是否包含此元素

                                    size():返回此集合中的元素个数

                                    addAll(Collection c):将另外一个集合中的元素全部加到这个集合里面

                               All系列

                                    containsAll(Collection c):判断这个集合是否为调用者集合的子集

                                    removeAll(Collection c):删除调用者集合中c集合中也有的元素:除去相同元素:如果两个集合中没有相同元素返                                                                                  回false

                                    retainAll(Collection c):只保留两个集合中相同的元素,只保留子集

                                转换

                                    toArray():返回一个Object对象的集合

                                    toArray(T[] a):里面放一个字符串数组,可以不用返回直接载入到这个字符串数组中

Collection遍历方法

集合转化为数组,然后对数组进行遍历

Person[] p = new Person[c.size()];
c.toArray(p);
for(Person pp:p) { 
        System.out.println(pp.getName()+"...."+pp.getAge()); 
}

 

利用迭代器来进行遍历(增强for循环底层就是迭代器)

Iterator<Person> iterator = c.iterator();
while(iterator.hasNext()) { 
     Person p = iterator.next();
     System.out.println(p.getName()+"...."+p.getAge()); 
}

List

                   是Collection的子接口

                  有序,每个元素都有自己的位置,不同元素是有分别的

                  有索引,每个元素都有自己的编号

                  可以存储相同的元素,位置和索引不同,所以也不是相同的。

List中的特有方法

                                    add(int index,E element):在指定位置添加元素,如果指定位置大于文件的长度,那么会报角标越界异常,如果是在                                                          集合末尾,那么直接缀杂末尾,如果是在中间,那么后面的元素统一后移,这个元素会放到这里。

                                    remove(int index):如果是末尾,直接删除;中间的话后面的元素会统一往前移;会返回被删除的元素

                                    set(int index,E element):替换指定位置的值;会返回被替换的元素

                                    get(int index):会获得指定位置的值;会返回指定位置的值

List中的遍历方法

for(int i=0;i<l.size();i++) {
     System.out.println(l.get(i)); 
}

 

并发修改异常

如果用迭代器进行遍历的时候,调用集合中的方法对集合进行修改,那么就会发生并发修改异常

解决办法           ①让集合本身进行遍历然后进行修改

                          ②让迭代器进行迭代的时候调用迭代器中的方法进行修改

用第二种方法的时候如果利用Iterator迭代器的话里面功能太少,只有remove()操作,删除的是迭代器中迭代器最后的元素

这里调用子类listIterator,这里的功能比Iterator强大很多,

ListIterator<String> li = l.listIterator(); 
while(li.hasNext()) { 
    if(li.next()=="sdf") { 
    li.set("aaaa"); 
    } 
}

vector

                                 线程安全,效率慢,顺序存储,增删较慢

                   特有方法

                                    addElement(E obj):将其元素添加到集合的末尾,大小加1

                                    removeElement(Object obj):删除指定元素,如果有重复,从前往后看,删除碰到的第一个

                                    elements():返回一个枚举器类型

枚举器的遍历方法

Enumeration elements = v.elements(); 
while(elements.hasMoreElements()) { 
    System.out.println(elements.nextElement()); 
}

LinkedList

特有方法

                                    addFirst(E e):在头部添加一个元素:因为其有头指针和尾指针,所以在头部和尾部添加速度特别快

                                    addLast(E e):在尾部添加一个元素

                                    getFirst():获取头部元素

                                    getLast():获取尾部元素

                                    removeFirst():删除头元素

                                    removeLast():删除尾元素

Set

         无序;没有任何前后的分别;所有的元素没有位置的概念;所有的元素都在集合中;没有索引;集合中没有任何的位置相关的方法

        不能存储相同的元素:因为没有位置的区别,存储了相同的也没有办法进行调用查看

         存取顺序可能不一样

HashSet

          底层为哈希表,保证了元素的唯一性,值相同的元素都给去掉了,但是进行自定义类型存储时,会进行哈希值的比较,如果哈希值不相等,

         即便内容一样,也会认为是不一样

         保证不重复机制

          先比较哈希值

相同:再进行equals比较

            equals相同:重复元素,不进行存储

           equals不相同:不重复元素,存储时会挂到相同哈希值的后面

不相同:直接进行存储

TreeSet

底层为二叉树,保证元素唯一,且可以进行排序。

如果是字符串就可以直接进行排序,但是对于自定义类就不可以直接进行排序,因为String类实现了Compable的接口

所以如果自定义类想实现排序则也必须进行实现Compable的接口重写compareTo方法。

返回值为0则相等,返回值为1向右存储,返回值为-1向左存储。这个存储顺序可以保证输出顺序。