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

 

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

 

集合和数组的区别

相同点

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

不同点

                        存储内容不同

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

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

                       存储数量不同

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

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

                      可使用的方法不同

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

                                 集合中有很多自己的方法

集合体系

                                        

集合分类

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

              双列集合:每个操作都是针对一对数据进行操作,一对数据作为一个单位: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向左存储。这个存储顺序可以保证输出顺序。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值