java 集合之初步了解

61 阅读3分钟

集合

集合是存储对象的数据集合容器

数组和集合的区别

数组只能存储同一种数据类型,集合可以存放多重数组类型
数组长度固定不利于未知类型和数据的解析,集合是不定长的

两个特殊集合

栈是Vector的一个子类,它实现了一个标准的后进先出的栈。
先进后出(FILO)

//集合是存储对象的数据集合容器
//数组是同一种类型数据集合

//栈 --> 集合一种存储方式
Stack a = new Stack();

//入栈
a.push("fd");
a.push(10);  //会自动装箱
a.push("hi的饿");
a.push('A');

//出栈
char c = (char)a.pop();
String d = (String)a.pop();
int e = (int)a.pop();

System.out.println(c);  //A
System.out.println(d);  //hi的饿
System.out.println(e);  //10
System.out.println(a.pop());    //fd
System.out.println("<---------->");

队列

队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作。 先进先出(FIFO)

//队列是一种特殊的线性表,它只允许在表的前端进行删除操作,而在表的后端进行插入操作
Queue q = new LinkedList();

//插入 offer
q.offer(10);
q.offer("fddf");
q.offer('d');

//删除 poll
System.out.println(q.poll());   //10
System.out.println(q.poll());   //fddf
System.out.println(q.poll());   //d
System.out.println(q.poll());   //null
System.out.println(q.poll());   //null

集合的分布

结构图:

image.png 思维导图: a17fed6b5aee8c2caf12ff7d8cf61082.jpeg

数组和链表的存储方式

数组:有索引和data两部分组成
链表:有data和指向下一个数据的指针地址两部分组成。

Vector、ArrayList都是以数组的形式存储在内存中,所以查询效率高,新增和删除效率不高,但是Vector内很多方法都加上了同步关键字synchronized,所以线程是安全的,ArrayList线程不安全。

LinkedList则是以链表的形式进行存储,所以查询效率低,新增和删除效率高,并且线程不安全。

Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素,Java不提供直接继承自Collection的类,只提供继承于的子接口(如ListSet

Collection的方法有: image.png

List系列

Arraylist数组实现,查找快,增删满

image.png

  //集合的顺序存储结构
        //面向接口
        List list = new ArrayList();
        ArrayList list2 = new ArrayList();

        //集合里面的内容称之为元素(element)
        list.add(10);
        list.add("a");
        list.add("dfd");

        list2.add("hhh");
        list2.add("a");
        list2.add("hhh");

        list.addAll(list2);

        list.remove("hhh"); //remove 只删除出现的第一个
        ArrayList list3 = new ArrayList();
        list3.add("a");
        list.removeAll(list3);  //removeAll对表集合元素去删除,将对应的集合所有出现该元素的内容全部清除。

//        list.clear();   //清空

        System.out.println(list.isEmpty());     //判断集合是否为空  false
        System.out.println(list.contains("dfd"));   //判断集合是否包含指定对象  true
        System.out.println(list.containsAll(list2));   //判断集合是否包含   false
        for (Object object : list) {
            System.out.print(object + "\t");        //10   dfd    hhh
        }

        System.out.println();
        System.out.println(list.size());    //返回集合容器的大小

        Object[] obj = list.toArray();      //集合转数组
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));    //返回此列表指定位置的元素
        }
        System.out.println("<----------->");

        //利用迭代器的方法
        Iterator it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }

Set系列

Set没有索引的方式去获取对应的元素
保证元素唯一性的方式依赖于:hashCode()与equals()方法。

        //Set   无序,不可重复
                //HashSet   支持null  内容无序
                //TreeSet 不支持nulll  按字典排序
                // LinkedHashSet    支持null  带存储顺序
//        Set没有索引的方式去获取对应的元素
//        保证元素唯一性的方式依赖于:hashCode()与equals()方法。
        Set st = new LinkedHashSet();

        st.add(10);
        st.add('d');
        st.add("A");
        st.add("地方");
        st.add("厄特特");
       st.add(null);
        st.add(null);
        st.add("A");
        st.add("dfd");

        //使用迭代器方式
        Iterator it = st.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
//        System.out.println(st.getClass().getName());    //java.util.HashSet
//        System.out.println(st.getClass().getName());    //java.util.TreeSet,TreeSet存放简单的同一类型的数据
//        System.out.println(st.getClass().getName());    //java.util.LinkedHashSet
//        for (Object o : st) {
//            System.out.println(o);
//        }

Map

键值对、键唯一、值不唯一

image.png

image.png

HashMap<String, String> a = new HashMap<>();
//存储值,值可以重复,键不可以重复,钥匙和门
a.put("1","A");
a.put("2","B");
a.put("3","J");
a.put("4","J");
a.put("5","df");
a.put(null,"ij");

//通过key键,获取值。
System.out.println(a.get("3")); //J
System.out.println(a.get("4")); //J

System.out.println(a.remove("2"));  //B
System.out.println(a.get("2")); //null
System.out.println("<---------->");

//遍历
//先获取map的key集合
Set<String> set = a.keySet();
for (String object : set ) {
    System.out.println(a.get(object));
}

集合工具类

Collections

        //集合的一系列方法
        public static void main(String[] args) {
            List<Integer> list = new ArrayList<Integer>();
            list.add(10);
            list.add(1);
            list.add(9);
            list.add(3);
            list.add(5);

            Collections.sort(list);
            System.out.println(list);       //[1, 3, 5, 9, 10]
            Collections.sort(list,new Comparator<Integer>(){
                @Override
                public int compare(Integer o1, Integer o2) {
//                    System.out.println(o1 + ":" + o2);
                    if(o1 <o2){
                        return 1;
                    }
//                    public int compare(String o1, String o2):比较其两个参数的顺序。
//
//                    两个对象比较的结果有三种:大于,等于,小于。
//
//                    如果要按照升序排序,
//                    则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数)
//                    如果要按照降序 排序
//                    则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)
                    return -1;
                }
            });
            System.out.println(list);   //[10, 9, 5, 3, 1]

            Collections.shuffle(list);      //打乱排序,变成随机
            System.out.println(list);

斗地主发牌,一次17张。

public static void main(String[] args) {
    String hua[] = {"♦","♣","♥","♠"};
    String shuzi[] = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
    List<String> list = new ArrayList<String>();

    //数组转集合
    List<String> hua_1 = new ArrayList<>();
    for (int i = 0; i < hua.length; i++) {
        hua_1.add(hua[i]);
    }
    List<String> shuzi_1 = new ArrayList<>();
    for (int i = 0; i < shuzi.length; i++) {
        shuzi_1.add(shuzi[i]);
    }

    for (int i = 0; i < hua.length; i++) {
        for (int j = 0; j < shuzi.length; j++) {
            list.add(hua[i] + shuzi[j]);
        }
    }

    list.add("大王");
    list.add("小王");
    Collections.shuffle(list);      //打乱

    List<String> list2 = new ArrayList<String>();
    for (int i = 0; i < 17; i++) {
        list2.add(list.remove(0));  //一次发牌17张
    }
    System.out.println(list2);

    Collections.sort(list2, new Comparator<String>() {      //对发好的牌进行排序
        @Override
        public int compare(String o1, String o2) {
            String o1_hua = o1.substring(0, 1);
            String o1_shuzi = o1.substring(1);
            String o2_hua = o2.substring(0, 1);
            String o2_shuzi = o2.substring(1);

            int index_j = shuzi_1.indexOf(o1_shuzi);
            int index_j_1 = shuzi_1.indexOf(o2_shuzi);

            if (index_j < index_j_1){    //  先判断数字
                return 1;
            }else if (index_j == index_j_1){
                int index_o = hua_1.indexOf(o1_hua);
                int index_o_1 = hua_1.indexOf(o2_hua);
                if (index_o <index_o_1){
                    return 1;
                }
            }
            return -1;
        }
    });

    //解决大小王排序的问题
    boolean s = list2.remove("小王");
    boolean s2 = list2.remove("大王");

    if (s){
        list2.add(0,"小王");
    }if (s2){
        list2.add(0,"大王");
    }
    System.out.println(list2);

}

集合运算

       //集合运算
        HashSet<String> st = new HashSet<String>();
        List<String> st2 = new ArrayList<String>();
        //学过化学
        st.add("张三");
        st.add("李四");
        st.add("王五");
        //学过物理
        st2.add("小米");
        st2.add("李华");
        st2.add("王五");
//        st.retainAll(st2);        //取交集
//        st.addAll(st2);     //取合集
        st.removeAll(st2);  //取差集
        System.out.println(st);