集合(一)

一、集合概述

集合是批量存储对象的,针对的是堆内存中的对象,包括自定义类对象,数组对象,系统类对象

数组存储批量数据,数组即可以存放引用数据类型,又可以存放基本数据类型

集合本身是只能直接在存放引用数据类型,但是可以存放包装类,间接存放基本数据类型

数组长度不可变,集合长度可变

  • 集合在Java开发中相当于Python字典加集合,功能强大,所以地位很高。

二、集合框架

学习要点:

  1. 各种集合的增删改查(开发、应用)

  2. 底层数据结构的了解(面试)

三、Collection接口方法

add(Object o);放入任意的引用数据类型

size()返回一个集合的长度

集合是可以直接输出

addAll(Collection c);一个集合所有元素添加另一个集合,如果用add添加集合到集合就会变成二维集合

contains(参数);判断参数是否包含在集合中

isEmpty();集合是否为空

toArray();把集合转换为数组Object[],如果后期集合规定了类型,转换的数组就是规范的类型

remove();删除集合中的元素

如果自定义对象重写equals()方法,改变了比较规则,在数组中比较的时候,是按照自定义equals()比较

package com.JavaSE.homework.Day16.DemoCollection;
​
import java.util.ArrayList;
import java.util.Collection;
​
public class Collection1 {
    public static void main(String[] args) {
        //使用Collection接口的方法
        Collection c1 = new ArrayList();//Arrary实现类是Collection子接口List的实现类
        boolean empty1 = c1.isEmpty();
        System.out.println(empty1);
        System.out.println("集合没放入元素前:" + c1.size());
        c1.add(10);
        c1.add("NBA");
        Student stu1 = new Student("0x111", "曹操", 78);
        c1.add(stu1);
        System.out.println("集合放入元素之后:" + c1.size());
        System.out.println(c1);
        System.out.println("----------------");
        Collection c2 = new ArrayList();
        c2.add(c1);//把c1 add
        System.out.println(c2);
        Collection c3 = new ArrayList();
        c3.addAll(c1);//把c1中All元素add
        System.out.println(c3);
        System.out.println("----------------------");
        c3.add("wowo");
        System.out.println(c3);
        c3.remove("wowo");
        System.out.println(c3);
        //转为数组时,要用Object接收返回值
        c3.toArray();
        System.out.println(c3);
        System.out.println("------------------------");
        Object[] obj = c3.toArray();
        for (Object i : obj) {//类似于for i in obj 只不过i要写类型 in换成了:
            System.out.println(i);
        }
    }
}

iterator();迭代器方法,遍历方式

package com.JavaSE.homework.Day16.DemoCollection;
​
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
​
public class Collection2 {
    public static void main(String[] args) {
        Collection c1 = new ArrayList();
        c1.add("曹休");
        c1.add("曹洪");
        c1.add("曹真");
        c1.add("曹爽");
        c1.add("曹熊");
        c1.add("曹宇");
        Object[] obj = c1.toArray();
        for (Object i : obj) {
            System.out.println(i);
        }
        System.out.println("-------------------------");
        Iterator iterator = c1.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
​
    }
}

迭代器源码分析:

int cursor;       // index of next element to return
public Object next(){
    //正序第一次要判断是否等于size
    //逆序第一次要判断是否等于0
    int i =cursor;//i是输出的索引,cursor每次都赋值完i都+1,curse相当于下一个输出的索引(行号)
    cursor =cursor+1;//还要判断是否超过size,
    return elementData[i];
}
package com.JavaSE.homework.Day15.comparatordemo;
​
import java.util.ArrayList;
import java.util.Collection;
​
public class Collection3 {
    public static void main(String[] args) {
        Collection c=new ArrayList();
        c.add("abc");
        Student stu1=new Student("0x115","张三",98);
        Student stu2=new Student("0x115","张三",98);
        c.add(stu1);
        c.remove("abc");
        c.remove(stu2);//这里面的equals是object里的,所以即使值一样,我们也不会删除stu1
        //但是如果我们在子类重写了equals就可以
        System.out.println(c);
​
    }
}

四、List接口

  • 索引

    • add(index,element) 指定位置添加元素

    • add(index,Collection)指定位置添加整个集合的元素

package com.JavaSE.homework.Day16.DemoList;
​
import java.util.ArrayList;
import java.util.List;
​
public class List1 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        l1.add(0, "理解");
        l1.add(1, "万岁");
        System.out.println(l1);
        l1.add(0, "**");//插队
        System.out.println(l1);
        List l2 = new ArrayList();
        l2.add(0, "人民");
        System.out.println("---------------------");
        System.out.println(l2);//[人民]
        l2.add(0, l1);
        System.out.println(l2);//[[**, 理解, 万岁], 人民]
        l2.addAll(0, l1);
        System.out.println(l2);//[**, 理解, 万岁, [**, 理解, 万岁], 人民]
        //index顺序不能乱必须依次增加或不变
    }
}

remove(index)根据索引删除

set(index,element)替换

get(index) 根据索引,得到这个位置的值

package com.JavaSE.homework.Day16.DemoList;
​
import java.util.ArrayList;
import java.util.List;
​
public class List1 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        l1.add(0, "理解");
        l1.add(1, "万岁");
        System.out.println(l1);
        l1.add(0, "**");//插队
        System.out.println(l1);
        List l2 = new ArrayList();
        l2.add(0, "人民");
        System.out.println("---------------------");
        System.out.println(l2);//[人民]
        l2.add(0, l1);
        System.out.println(l2);//[[**, 理解, 万岁], 人民]
        l2.addAll(0, l1);
        System.out.println(l2);//[**, 理解, 万岁, [**, 理解, 万岁], 人民]
        System.out.println("---------------------------");
        l2.remove(l1);
        System.out.println(l2);//[**, 理解, 万岁, 人民]
        l2.removeAll(l1);//会把l1里all元素挨个删除
        System.out.println(l2);//[人民]
        l2.remove("人民");
        System.out.println(l2);//[]
        l2.add("苦逼");//可以写也可以不写,Collection里不能写index
        l2.add(0,"苦逼");
        l2.remove("苦逼");//删除第一个匹配到的值
        System.out.println(l2);
        System.out.println("-----------------");
        l2.set(0, "快乐");
        System.out.println(l2);//[快乐]
        l2.add(1,"3w");
        System.out.println(l2.get(1));
​
    }
}

listIterator(); list接口独有的遍历

总结List接口遍历方式:

package com.JavaSE.homework.Day16.DemoList;
​
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.ListIterator;
​
public class List2 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        l1.add("曹休");
        l1.add("曹洪");
        l1.add("曹真");
        l1.add("曹爽");
        l1.add("曹熊");
        l1.add("曹宇");
        System.out.println(l1);
        //1.迭代器
        //2.转换成数组遍历
        //3.独有的ListIterator
        ListIterator listIt = l1.listIterator();
        while (listIt.hasNext()) {
            System.out.println(listIt.next());
        }//还可以逆序,必须共用一个迭代器
        System.out.println("-------------------------");
        while (listIt.hasPrevious()) {
            System.out.println(listIt.previous());
        }
        //4.for循环遍历
        System.out.println("-------------------------");
        for (int i = 0; i < l1.size(); i++) {
            System.out.println(l1.get(i));
        }
        //5.for增强
        System.out.println("-----------------------");
        for (Object obj : l1) {
            System.out.println(obj);
        }
​
    }
}

这就是逆序必须共用一个迭代器的原因,不共用上来curse=0,直接报错

  • 排序sort 1.8新特性

package com.JavaSE.homework.Day16.DemoList;
​
import com.JavaSE.homework.Day16.DemoCollection.Student;
​
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
​
public class List3 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        l1.add(30);
        l1.add(10);
        l1.add(20);
        l1.add(40);
        l1.add(60);
        System.out.println(l1);
        l1.sort(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                    int i=(Integer) o1;
                    int j=(Integer) o2;
                return i-j;
            }
        });
        System.out.println(l1);
        System.out.println("----------------");
        List l2 = new ArrayList();
        Student s1 = new Student("001", "秦始皇", 100);
        Student s2 = new Student("002", "汉武帝", 80);
        Student s3 = new Student("003", "唐太宗", 90);
        l2.add(s1);
        l2.add(s2);
        l2.add(s3);
        System.out.println(l2);
        l2.sort(new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getScore()-o2.getScore();
            }
        });
        System.out.println(l2);
    }
}
//根据我看源码,初步得出Comparator的compare方法是先选择把最值找出,然后用冒泡排序

总结:

Iterable接口 中 iterator()方法

Collection接口中 增删改查 add(Object obj) addAll(Collection coll) remove(Object obj) size() clear()

List接口(独有)

add(index,element) addAll(index,Collection coll) remove(index) get(index) set(index,element)

ListIterator listiter =listIterator(); 逆序

posted @ 2019-10-23 21:37  Wollf  阅读(90)  评论(0)    收藏  举报