• 《Java基础知识》Java集合(Collection)


    作为一个Developer,Java集合类是我们在工作中运用最多的、最频繁的类。相比于数组(Array)来说,集合类的长度可变,更加适合于现代开发需求;

    Java集合就像一个容器,可以存储任何类型的数据,也可以结合泛型来存储具体的类型对象。在程序运行时,Java集合可以动态的进行扩展,随着元素的增加而扩大。在Java中,集合类通常存在于java.util包中。

    Java集合主要由2大体系构成,分别是Collection体系和Map体系,其中Collection和Map分别是2大体系中的顶层接口。

    今天主要讲:Collection主要有三个子接口,分别为List(列表)、Set(集)、Queue(队列)。其中,List、Queue中的元素有序可重复,而Set中的元素无序不可重复;

    List中主要有ArrayList、LinkedList两个实现类;Set中则是有HashSet实现类;而Queue是在JDK1.5后才出现的新集合,主要以数组和链表两种形式存在。

    继承关系图:

    常用集合:ArrayList (数组)

    特点

    • 容量不固定,随着容量的增加而动态扩容(阈值基本不会达到)
    • 有序集合(插入的顺序==输出的顺序)
    • 插入的元素可以为null
    • 效率更高(相对于LinkedList来说)
    • 线程不安全

    list 常用方法

    import java.util.ArrayList;
    import java.util.List;
    
    public class var {
        public static void main(String[] args){
            List<String> list = new ArrayList();
            List<String> list1 = new ArrayList();
    
            //list添加数据
            list.add("张三");
            list.add("李四");
            list.add("王五");
            list.add("赵六");
            System.out.println("add:"+list);
    
            //list的长度
            System.out.println("size:"+list.size());
    
            //集合转数组
            Object[] arr = list.toArray();
            System.out.println("toArray:"+arr);
    
            //判断集合是否为空
            if(!list.isEmpty()){
                System.out.println("集合list 不为空。");
            }
    
            //判断集合中是否包含某个元素
            if(list.contains("张三")){
                System.out.println("list包含张三。");
            }
            if(list.contains("李三")){
                //
            }else{
                System.out.println("list不包含李三。");
            }
    
            //复制list
            list1.addAll(list);
            System.out.println("addAll:"+list1);
    
            //list 删除数据
            list.remove(0); //按照角标删除
            list.remove("王五"); //按照内容删除。
            System.out.println("remove:"+list);
    
            //获取第2个数据数据
            System.out.println("get:"+list.get(1));
    
            //清空元素
            list.clear();
            System.out.println("clear:"+list);
    
            //判断集合是否为空
            if(list.isEmpty()){
                System.out.println("集合list 为空。");
            }
        }
    }

    运行结果:

    list 中还有其他方法,见JDK的API。  补充一种集合新增,修改,删除有锁,查询不加锁CopyOnWriteArrayList,使用的是ReentrantLock锁。

    常用集合:LinkedList(链表)

    特点:插入,删除快。

    import java.util.Iterator;
    import java.util.LinkedList;
    import java.util.List;
    
    public class var {
        public static void main(String[] agrs){
            List<String> linkedList = new LinkedList<String>();
            System.out.println("LinkedList初始容量:"+linkedList.size());
    
            //添加功能:
            linkedList.add("my");
            linkedList.add("name");
            linkedList.add("is");
            linkedList.add("jiaboyan");
            System.out.println("LinkedList当前容量:"+ linkedList.size());
    
            //修改功能:
            linkedList.set(0,"hello");
            linkedList.set(1,"world");
            System.out.println("LinkedList当前内容:"+ linkedList.toString());
    
            //获取功能:
            String element = linkedList.get(0);
            System.out.println(element);
    
            //遍历集合:(LinkedList实际的跌倒器是ListItr对象)
            Iterator<String> iterator =  linkedList.iterator();
            while(iterator.hasNext()){
                String next = iterator.next();
                System.out.println(next);
            }
            //for循环迭代集合:
            for(String str:linkedList){
                System.out.println(str);
            }
    
            //判断功能:
            boolean isEmpty = linkedList.isEmpty();
            boolean isContains = linkedList.contains("jiaboyan");
    
            //长度功能:
            int size = linkedList.size();
    
            //删除功能:
            linkedList.remove(0);
            linkedList.remove("jiaboyan");
            linkedList.clear();
            System.out.println("LinkedList当前容量:" + linkedList.size());
        }
    }

    运行结果:

    ArrayList 和 LinkedList 对比

    1. 插入数据:差不多,不一定是谁快。

    2. 查询数据:ArrayList 效率非常高。

    3. 空间利用率 :LinkedList 高。

    不常用集合:Vector(队列)

    特点:线程安全

    import java.util.Arrays;
    import java.util.Vector;
    
    public class var {
        public static void main(String[] agrs){
            Vector vector = new Vector();
    
            //向该集合中添加元素
            vector.add("A");
            vector.add("B");
            vector.add("C");
            System.out.println(vector);
    
            //向指定的位置添加元素
            vector.add(1,"F");
            vector.add(3,"H");
            System.out.println(vector);
    
            //删除元素
            vector.remove("H");
            vector.remove(1);
            System.out.println(vector);
    
            //修改元素
            vector.set(1,"G");
            System.out.println(vector);
    
            //查询元素
            System.out.println("get: "+vector.get(1));
    
            //判断当前集合是否为空
            boolean b = vector.isEmpty();
            System.out.println(b);
    
            //返回集合vector中元素的个数
            int i = vector.size();
            System.out.println("size: "+i);
    
            //将集合对象转为Object的数组
            Object[] array = vector.toArray();
            System.out.println(Arrays.toString(array));
        }
    }

    运行结果:

    因为vector 线程安全,导致效率低,所以使用较少。

    不常用集合:Stack (堆栈)

    特点:先进后出

    import java.util.Stack;
    
    public class var {
        public static void main(String[] agrs){
            Stack stack = new Stack();
    
            //提供了push,写入元素
            stack.push("A");
            stack.push("B");
            stack.push("C");
    
            //提供了push,写入一个元素
            stack.push("D");
            System.out.println(stack);
    
            //pop 拉取一个元素,并移除
            System.out.println(stack.pop());
            System.out.println(stack);
    
            //拉取一个元素,不移除
            System.out.println(stack.peek());
            System.out.println(stack);
    
            // 查找search
            System.out.println(stack.search("B"));
        }
    }

    运行结果:

    常用集合:HashSet(哈希)

     特点:元素不会重复。

    import java.util.HashSet;
    import java.util.Set;
    
    public class var {
        public static void main(String[] agrs){
            Set set= new HashSet();
            set.add("1");
            set.add("1");
            set.add("2");
            set.add("3");
            set.add("4");
            set.add("5");
            set.add("5");
            System.out.println(set);
        }
    }

    运行结果:

    常用集合:TreeSet(红黑树)

    特点:TreeSet是用来排序的, 可以指定一个顺序, 对象存入之后会按照指定的顺序排列

    public class Person {
    
        public String name;    //姓名
        public Integer age;    //年龄
    
        public Person(String name,Integer age) {
            this.name=name;
            this.age=age;
        }
    }
    import demo.design.strategy.imp.Person;
    import java.util.TreeSet;
    
    public class var {
        public static void main(String[] agrs){
            TreeSet<Person> ts = new TreeSet<>();
            ts.add(new Person("张三", 23));
            ts.add(new Person("李四", 13));
            ts.add(new Person("周七", 13));
            ts.add(new Person("王五", 43));
            ts.add(new Person("赵六", 33));
            System.out.println(ts);
        }
    }

    运行结果:

    因为TreeSet需要排序,所以需要指定类的排序逻辑

    public class Person implements Comparable<Person>{
    
        public String name;    //姓名
        public Integer age;    //年龄
    
        public Person(String name,Integer age) {
            this.name=name;
            this.age=age;
        }
    
        /**
         * 加上比较方法,让TreeSet 可以根据这个排序
         * @param o
         * @return
         */
        public int compareTo(Person o){
            if(o.age > this.age){
                return 1;
            }else if(o.age > this.age){
                return -1;
            }else {
                return 0;
            }
        }
    }
    import java.util.Iterator;
    import java.util.TreeSet;
    
    public class var {
        public static void main(String[] agrs){
            TreeSet<Person> ts = new TreeSet<>();
            ts.add(new Person("张三", 23));
            ts.add(new Person("李四", 13));
            ts.add(new Person("周七", 13));
            ts.add(new Person("王五", 43));
            ts.add(new Person("赵六", 33));
    
            //使用迭代方式获取元素
            Iterator<Person> it = ts.iterator();
            while (it.hasNext()){
                Person person= it.next();
                System.out.println("姓名:"+person.name+"年龄:"+person.age);
            }
        }
    }

    运行结果:

    能够熟料掌握以上集合,在今后的工作中已经够用,需要继续了解,可以阅读JDK API文档。

    参考:https://www.jianshu.com/p/63b01b6379fb

               https://www.jianshu.com/p/a2236f562ead

               https://www.cnblogs.com/yzssoft/p/7127894.html

    This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
  • 相关阅读:
    C# 关于委托和事件的妙文:通过一个例子详细介绍委托和事件的作用;Observer模式简介
    Path.Combine (合并两个路径字符串)方法的一些使用细节
    taskkill /f /im的应用
    powersheel远程连接方法操作
    Centos 定时任务发送smtp邮件
    Centos 发送smtp邮件
    在 Windows 上安装Rabbit MQ 指南
    Quartz.NET总结(五)基于Quartz.net 的开源任务管理平台
    Quartz.NET总结(四)Quartz 远程调度
    Quartz.NET总结(三)Quartz 配置
  • 原文地址:https://www.cnblogs.com/jssj/p/11456257.html
Copyright © 2020-2023  润新知