集合部分(一)

(一)集合体系
集合部分(一)_第1张图片

集合部分(一)_第2张图片
(二)集合特点

集合能存储任意对象,长度可以改变,随着元素的增加而增加,随着元素的减少而减少。

(三)集合和数组的区别

①存储对象。
数组可以存储引用数据类型,也可以存储基本数据类型。
集合只能存储引用数据类型,也能存储基本数据类型的,但是会自动装箱为引用数据类型。
②长度。
数组长度不能改变。当存储的元素大于定义的数组元素时,要重新定义数组。
集合长度可以改变,随着元素的增加而增加。

但是从内存角度来说,数组开辟的内存空间是连续的。集合底层是用数组实现的,比如说集合初始定义长度为10个,当第11个元素来的时候,就要重新开辟一个1.5倍(即15个)空间,将原有的10个元素拷贝过去,再添加第11个,而原有的10个数组对象变为了垃圾。所以,在已知长度的情况下,尽量使用数组。长度不知的情况下,推荐使用集合。

(四)集合转化为数组

//使用toArray方法
        Collection c = new ArrayList();
        c.add(new Student("张三",23));  //将Student类型提升为Object类型
        c.add(new Student("lisi",22));
        c.add(new Student("wangwu",21));
        c.add(new Student("zhou三",25));

        Object[] arr = c.toArray();
        for(int i=0;i<arr.length;i++){
            //System.out.println(arr[i]); //直接调用toString()方法输出
            Student s= (Student) arr[i]; //向下转型,可以调用方法进行操作
            System.out.println(s.getName()+"..."+s.getAge());
        }

(五)遍历方式有二:
①转为数组

(方法同上)

②迭代器遍历

Iterator itr = c.iterator();
for(;itr.hasNext();){
    Student s= (Student) itr.next();
    System.out.println(s.getName()+"..."+s.getAge()); 
}
或者
while(itr.hasNext()){
    Student s= (Student) itr.next();
    System.out.println(s.getName()+"..."+s.getAge());
}

(六)迭代器原理

迭代器是对集合进行遍历,而每一个集合内部的存储结构都是不同的,所以迭代器将hasNext()和next()方法向上提取为接口,每个类(例如:ArrayList)将自己的存取方法定义好即可。好处有二:一是对定了整个集合体系的遍历方式都是hasNext()和next();第二,代码有底层内部实现,使用者不用关心怎么实现,会用即可。

(七)List集合特有功能

①void add(int index,E element)在指定位置添加元素
②E remove(int index) 删除指定位置的元素
③E get(int index) 获取指定位置元素
④E set(int index,E element) 设置指定位置元素

(八)List集合遍历

通过size() 和 get() 方法
类似于集合转为数组遍历的方法

List list = new ArrayList();
list.add(new Student("张三", 18));
list.add(new Student("李四", 18));
list.add(new Student("王五", 18));
list.add(new Student("赵六", 18));

for(int i = 0; i < list.size(); i++) {
    Student s = (Student)list.get(i);
    System.out.println(s.getName() + "," + s.getAge());
}

(九)并发修改异常及解决方案

List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("d");
list.add("e");

Iterator it = list.iterator();
while(it.hasNext()) {
    String str = (String)it.next();
    if(str.equals("world")) {
        list.add("javaee");         
        //这里会抛出ConcurrentModificationException并发修改异常
    }
}

出现并发修改异常的原因:在遍历的同时又在添加元素
解决办法:用List特有的迭代器ListIterator

ListIterator lit = list.listIterator();
while(lit.hasNext()) {
    String str = (String)lit.next();
    if(str.equals("world")) {
    //如果想在遍历的过程中添加元素,可以用ListIterator中的add方法 
    }
}

(十)ListIterator

可正序遍历
boolean hasNext()是否有下一个
Object next()返回下一个元素

可逆序遍历(注:指针要先到最后一个位置,然后再往前走)
boolean hasPrevious()是否有前一个
Object previous()返回前一个元素

(十一)Vector遍历

使用Vector的elements()方法,返回的是枚举数组
public void addElement(E obj)
public E elementAt(int index)
public Enumeration elements()

Vector v = new Vector(); //创建集合对象,List的子类
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");

//Vector迭代
Enumeration en = v.elements(); //获取枚举
while(en.hasMoreElements()) {           //判断集合中是否有元素
    System.out.println(en.nextElement());//获取集合中的元素
}

(十二)数据结构之数组和链表比较

数组:查询修改快,增删慢
集合:查询修改慢,增删快

(十三)List的三个子类特点

ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
Vector相对ArrayList查询慢(线程安全的)
Vector相对LinkedList增删慢(数组结构)
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。

Vector和ArrayList的区别

Vector是线程安全的,效率低
ArrayList是线程不安全的,效率高
共同点:都是数组实现的

ArrayList和LinkedList的区别

ArrayList底层是数组结果,查询和修改快
LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
共同点:都是线程不安全的

List有三个儿子,我们到底使用谁呢?

查询多用ArrayList
增删多用LinkedList
如果都多ArrayList

你可能感兴趣的:(集合部分(一))