集合类相关

目录

一、集合类作用:

二、集合相关的类:

三、Collection接口:

1、Interator迭代器

2、Set:

3、Queue

01、Queue实现类

02、数组 于 链表 对比

4、List :

01、ArrayList

02、Vector

3、 Arrays.ArrayList-----List Arrays.asList(object 1 ....)

 四、Map实现类

 1、HashMap

2、LinkedHashMap

 3、HashTable

 4、Propertie

  5、SortedMap

 6、TreeMap


一、集合类作用:

用于存放数量不等的对象,容器类。

二、集合相关的类:

集合相关的类都是由Collection和map接口派生而来

1、set----代表无序,不可重复的集合

2、List----代表有序,可以重复的集合

3、Queue---用于模拟队列这种数据结构

4、Map-----代表着具有映射关系的集合(map相关的明日更新)

三、Collection接口:

定义了set、list、queue通用方法,添加元素、删除元素、返回元素个数、遍历元素,判断包含某个元素等。

1、Interator迭代器

Interator(迭代器)是一个接口,用于遍历Collection中的元素

* boolean hasNext()  判断集合是否集合完,集合完之后返回false
* Object next()     返回集合中的下一个元素
* void remove       删除集合里边上一次next方法返回的元素
        ArrayList c = new ArrayList();
        c.add("1");
        c.add("2");
        c.add("3");
        c.add("4");
        //遍历集合
        for (Object obj : c){//循环遍历
            System.out.println(obj);
//            if (obj.equals("4")){//循环时候不能改变值,
//                c.remove(obj);
//            }
        }
        Iterator iterator = c.iterator();
        while (iterator.hasNext()){
            Object obj = iterator.next();
            System.out.println(obj);
            if(obj.equals("2")){
//                c.remove("2");//报错
                iterator.remove();//使用迭代器删除
            }
        }
        System.out.println(c);

2、Set:

* HashSet :元素不可重复
        * 不能保证元素的排列顺序
        * 集合元素的值可以为null
        * 是非线性安全的,在多线程下使用JUC来保证同步
* LinkedHashSet     (HashSet的子类)
        * 采用链表维护元素插入顺序

* TreeSet :支持两种排序方式,以保证元素的顺序、比HashSet多了一些方法
        * 返回集合中的第一个(最后一个)元素
        * 放回集合中位于指定元素之前(之后)的元素
        * 放回集合中某个限定范围内的元素组成的子集

        TreeSet ss = new TreeSet();//自动排序,
        ss.add(78);
        ss.add(72);
        ss.add(88);
        ss.add(98);
        ss.add(70);
        System.out.println(ss);//基于自然排序方法
        System.out.println(ss.first() + "-" + ss.last());//获取第一个元素和最后一个元素
        System.out.println(ss.lower(70) + "-" + ss.higher(78));//传出比lower小的值和比higher的一个值
        System.out.println(ss.headSet(72));//获取比72小的值构成的子集
        System.out.println(ss.tailSet(72));//获取大于等于72的子集
采用红黑树的数据结构存储元素,支持自然排序和定制排序两种排序
        * 自然排序:
            * 1、添加时,调用元素的compareTo方法比较元素的大小,并按照升序排列元素
            * 2、添加到TreeSet中的对象必须实现Compareable接口,该接口定义了compareTo
            * 3、Java提供的很多数据均已经实现了Comparable接口,例如String、Data等
        * 定制排序:

        //自然排序
        TreeSet name = new TreeSet();
        name.add("z");
        name.add("b");
        name.add("c");
        name.add("r");
        name.add("f");
        System.out.println(name);

        //定制排序
        TreeSet nums = new TreeSet(new Comparator() {//从大到小
            @Override
            public int compare(Object o1, Object o2) {
                Number n1 = (Number) o1;
                Number n2 = (Number) o2;
                if (n1 ==null && n2 == null){
                    return 0;
                }
                else if (n1 == null){//如果n1=null、n2不是,则认为n1大于n2
                    return -1;
                }else if (n2 == null){
                    return 1;//此时认为N1更小
                }else if (n1.doubleValue() > n2.doubleValue()){//将n1\n2转换为double
                    return 1;//此时认为N1更小
                }else if (n1.doubleValue() < n2.doubleValue()){//将n1\n2转换为double
                    return -1;//此时认为N1更小
                }else {
                    return 0;
                }
            }
        });
        nums.add(null);
        nums.add(78);
        nums.add(72);
        nums.add(88.5);
        nums.add(98);
        nums.add(70);
        System.out.println(nums);

3、Queue

用于模拟队列,是一种先进先出的容器
            * boolean add(Object e) 将元素加入到队列尾部
            * Object element() 获取队列头部的元素,但不删除元素
            * boolean offer(Object e)将元素加入队列尾部,当使用有容量限制的队列时,此方法更好
            * Object peek()获取队列头部的元素,但不删除元素,当队列为空时候返回null
            * Object poll()获取队列头部元素,并删除该元素,当队列为空时候返回null
            * Object remove()获取队列头部元素,并删除该元素

        /**
         *  Queue
         */
        Queue queue = new ArrayDeque();
        //入队
        queue.offer("Lucy");
        queue.offer("Jon");
        queue.offer("Mary");
        queue.offer("Lily");
        System.out.println(queue);

        //返回队头
        System.out.println(queue.peek());
        System.out.println(queue);

        //返回头部删除
        while (queue.size()>0){
            System.out.println(queue.poll());
        }
        System.out.println(queue);

01、Queue实现类

* Deque接口代表双端队列,允许从队列头/尾的任何一端,来进行入队/出队的操作,甚至还支持入栈/出栈的操作,Deque在Queue基础上增加两种方法:
                    * boolean offerFirst(Object e)
                    * boolean offerlast(Object e)

   //双端队列
        Deque queue1 = new ArrayDeque();
        queue1.offer("Lucy");
        queue1.offer("Jon");
        queue1.offer("Mary");
        queue1.offer("Lily");
        System.out.println(queue1);
        queue1.offerFirst("Fan");//头部插入
        System.out.println(queue1);
        queue1.offerLast("Zhang");//尾部插入
        System.out.println(queue1);

        System.out.println(queue1.peekFirst());//获取头
        System.out.println(queue1.peekLast());//获取尾巴

        while (queue1.size()>0){//队尾出队
            System.out.println(queue1.pollLast());

        }
        while (queue1.size()>0){//队头出队
            System.out.println(queue1.pollFirst());
        }
   //栈.
        Deque stack = new ArrayDeque();
        stack.push("张三");
        stack.push("李四");
        stack.push("王五");
        stack.push("老六");
        System.out.println(stack);
        //栈先入后出
        while (stack.size()>0){
            System.out.println(stack.pop());
        }
        System.out.println(stack);

    * ArrayDeque、LinkedList是Deque接口的实现类,前者采用数组实现双端队列,而后者采用链表结构实现双端队列
            * LinkedList
                    * 有序集合
                        * LinkedList采用链表结构实现有序集合
                        * ArrayList采用数组实现(初始长度为10)
                    * 双端队列
                        * LinkedList采用链表结构实现双端队列
                        * ArrayDeque采用数组实现(初始长度为16)

02、数组 于 链表 对比

     * 数组需要占用连续的存储空间,访问效率高,增删效率低
     * 链表不占连续空间,增删效率高,访问效率低,是以指针方式维护元素的顺序,即上一个元素会指向下一个元素。

4、List :

代表有序的集合,提供根据索引来访问集合的方法
        * 将元素插入到集合中指定的索引处,
        * 将指定索引处的元素从集合中删除
        * 从集合中返回指定索引处的元素
        * 返回某个元素在集合中的索引值
        * 从集合中、返回起始索引和结束索引之间的元素组成的子集

        List list1 = new ArrayList();
        list1.add("Tom");
        list1.add("Tony");
        list1.add("Lisa");
        list1.add("Jon");
        list1.add("Tony");//添加一个重复元素
        System.out.println(list1);//打印顺序为添加元素顺序,说明有序可重复的集合

        list1.add(1,"Lucy");//在1位置添加一个元素
        System.out.println(list1);

        list1.remove(1);//删除位置1的元素
        System.out.println(list1);

        //指定索引获取元素
        for (int i = 0;i<list1.size();i++){
            System.out.println((i+1) + ": " + list1.get(i));
        }

        System.out.println(list1.subList(1,3));//获取子集,1<=<list<3
        System.out.println(list1.indexOf("Tony") + ", " + list1.lastIndexOf("Tony"));

        ListIterator iterator = list1.listIterator();
        while (iterator.hasNext()){//从前往后遍历
            System.out.println(iterator.next() + " ");
        }
        System.out.println();

        while (iterator.hasPrevious()){//从后往前遍历
            System.out.println(iterator.previous() + " ");
        }
        System.out.println();

        //由小到大排序
        list1.sort(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {

                String s1 = (String) o1;
                String s2 = (String) o2;
                if (s1 ==null && s2 == null){
                    return 0;
                }else if (s1 == null){//如果n1=null、n2不是,则认为n1大于n2
                    return -1;
                }else if (s2 == null){
                    return 1;//此时认为N1更小
                }else {
                    return s1.compareTo(s2);
                }
            }
        });
        System.out.println(list1);

        ArrayList names = new ArrayList();
      //  names.add("Lily");
//        int[] nums = {10,20,30,40,50};//int数组不可以自动装箱成为Integer数组
        Integer[] nums = {10,20,30,40,50};

        List numList = Arrays.asList(nums);//里面需要一个对象一个对象数组,当传入int后,认为是一个数组,而不是对象数组
        System.out.println(numList);

     * List提供了listIterator()方法,以返回一个ListIterator对象
     * ListIterator接口继承于Iterator,该接口增加了如下的方法
        * boolean hasPrevious() 判断迭代器指向元素是否有上一个元素
        * Object previous() 返回迭代器所指向的元素的上一个元素
        * void add(Object0)  在迭代器所指向的元素位置插入一个元素
 


01、ArrayList

   * ArrayList是基于数组实现的List接口
    * ArrayList内部封装了一个长度可变的Object[]数组
    * 默认该数组的初始长度为10,也可以通过构造器参数显示指定其初始长度
    * 每当添加元素的个数超出了数组的长度,AeeayList会自动对长度进行扩展

02、Vector

    *  Vector是基于数组实现,用法与ArrayList用法相同
    *  Vector是线程安全的,ArrayList是非线程安全的
    *  Vector有保证线程安全的开销,所以性能低
    *  Vector的子类Stack,用于模拟栈这种数据结构


3、 Arrays.ArrayList-----List Arrays.asList(object 1 ....)

   * 该方法可以把多个对象或一个对象变成一个List集合,
    * 实际返回类型是Arrays的内部类,名字也叫ArrayList
    * Arrays.ArrayList是一个固定的长度的集合,可以遍历,但不能增加、和删除

4、Map:存放成对数据的
        * 1、Map用于保存具有映射关系的数据(Key -Value)
        * 2、key和value之间存在单向一对一的关系,通过制定的key,总能找到确定的value
        * 3、Map的key不允许重复,同一个Map的任何两个key通过equals比较总返回false

       /**
         * Map
         */
        Map map = new HashMap();//不保证数据的顺序
        map.put("Jon",65);
        map.put("Lily",75);
        map.put("Ton",85);
        System.out.println(map);
        //key不重复,但是Value可以重复
        map.put("Mar",85);
        System.out.println(map);
        //Key重复之后会覆盖
        map.put("Mar",80);
        System.out.println(map);

        //从map中获取数据
        System.out.println(map.get("Mar"));
        //判断map中存不存在某个key
        System.out.println(map.containsKey("Mar"));
        //判断是否存在某个值
        System.out.println(map.containsValue("85"));
        //删除数据根据Key
        map.remove("Mar");
        System.out.println(map);
        //获取所有的数据
        //底层Entry封装一对数据,调用entrySet方法获取到所有的数据
        //entrySet()遍历所有的Map
        for (Object entry : map.entrySet()){//遍历
            Map.Entry e = (Map.Entry) entry;//强转
            System.out.println(e.getKey()+ ": " + e.getValue());
        }
        //keySet遍历所有的Key
        for (Object key : map.keySet()){//遍历转
            System.out.println(key+ ": " + map.get(key));
        }
        //values遍历所有的Value
        for (Object value : map.values()){
            System.out.println(value);
        }

 四、Map实现类


 1、HashMap

HashMap是Map接口的典型实现(线程不安全,性能高)
              * HashMap非线程安全,性能高于HashTable
              * HashMap允许null作为key/value,而HashTable不允许null

        /**
         * HashMap
         */
        Map map1 = null;
        map = new Hashtable();
//        map.put("Tony",null);//报错
//        map.put(null,null);//报错
        map1 = new HashMap();
        map1.put("Tony",null);
        map1.put(null,null);
        System.out.println(map1);
        for (Object key : map1.keySet()){
            System.out.println(key+ ": " + map1.get(key));

        }

2、LinkedHashMap

采用链表维护键值对的顺序
        * LinkedHashMap采用双向链表维护键值对的顺序
        * 相对于HashMap,LinkedHashMap在迭代时性能高,在插入时候性能低

 /**
         * LinkedHashMap----有序
         */
        map1 =new LinkedHashMap();
        map1.put("语文",50);
        map1.put("数学",60);
        map1.put("英语",53);
        map1.put("历史",40);
        System.out.println(map1);
        for (Object key : map1.keySet()){
            System.out.println(key+ ": " + map1.get(key));

        }

 3、HashTable

     HashTable 是古老的Map(线程安全,性能低)

 4、Propertie

常用用于处理属性文件;(线程安全,性能低)
         * 属性文件:存储属性名与属性值的文件,例如“.ini、.properties文件”
         *Properties:
               * 擅长处理属性文件,可以很方便的实现对属性文件的读写操作。
               * 提供load()方法加载属性文件、store()方法保存属性文件。
               * 提供getProperty()方法读取某个属性、setProperty()方法修改某个属性的值。

  5、SortedMap

 SortedMap是Map的子接口(两种排序方式)

 6、TreeMap

         *采用红黑树结构实现了SortedMap。在存储键值对时候,按照key键值对排序
              * 自然排序
                    * 对key进行比较,根据key按照从小到大的顺序排序
                    * 对所有的key应该是同一个类型,请必须实现Comparable接口

        TreeMap map = null;
        //自然排序方式
        map = new TreeMap();
        map.put("Lily",80);
        map.put("Mary",90);
        map.put("Join",70);
        map.put("Job",75);
        //对key进行比较,根据key按照从小到大的顺序排序
        System.out.println(map);
        //获取第一个和最后一个key
        System.out.println(map.firstKey() + ", " + map.lastKey());
        //指定某一个key,要他前面或者后面的key
        System.out.println(map.lowerKey("Mary") + ", " + map.higherKey("Join"));
        //返回Map的子集
        System.out.println(map.headMap("Join"));//返回指定的Key前面的值
        System.out.println(map.tailMap("Join"));//返回指定的key后面的值
//        System.out.println(map.subMap("Mary","Join"));//返回大于等于Mary,小于Job的子集

        //定制排序算法
        map = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                String s1 = (String) o1;
                String s2 = (String) o2;
                if(s1 == null && s2 == null){
                    return 0;
                }else if (s1 == null){
                    return 1;
                }else if (s2 == null){
                    return -1;
                }else {
                    return s1.compareTo(s2) * (-1);
                }
            }
        });
        map.put("Lily",80);
        map.put("Mary",90);
        map.put("Join",70);
        map.put("Job",75);
        System.out.println(map);
              * 定制排序
                    * 创建TreeMap时,传入一个Comparator类型的对象
                    * 该对象负责对所有的key进行比较,此时不要求Key实现Comparator接口
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值