zoukankan      html  css  js  c++  java
  • 关于java集合,你看这一篇就够了,由浅到深给你讲的明明白白!

    集合概述

    java集合就像一个容器,这些对象可以是任意的数据类型,且长度可变。集合按照其存储结构可以分为两大类,即单列集合Collection,和双列集合Map。
    这两种集合特点如下:
    (1)Collection:单列集合接口,用于存储一系列元素。
    Collection集合有两个重要的子接口,分别是List和Set。其中List集合的特点是元素有序,可重复;Set集合的特点是元素无序并且不可重复。List接口的主要实现类有ArrayList和ListedList;Set接口的主要实现类有HashSet和TreeSet。
    (2)Map:双列集合的根接口,用于存储具有键(Key),值(Value)映射关系的元素。
    Map集合中每个元素都包含一对键值,并且Key是唯一的,在使用Map集合时可以通过指的Key找到对应的Value。Map接口的主要实现类有HashMap和TreeMap。

    List接口

    List接口继承于Collection接口,在List集合中允许出现重复的元素,在程序中可以通过索引来访问集合中的指定元素,另外List集合还有一个特点就是存取有序。

    ArrayList集合

    ArrayList内部封装了一个长度可变的数组对象(初始容量为8,按1.5倍扩容),在ArrayList中进行增删改查效率会比较低,但是在遍历和查找元素时显得非常高效。
    LinkedList集合
    为了克服ArrayList增删效率低的问题,可以用LinkedList,该集合内有一个双向循环链表,增删效率较高。

    Collection集合遍历

    Iterator遍历集合

    Iterator对象被称为迭代器,用来访问Collection中的元素。在使用迭代器对集合元素迭代是,如果调用了remove的方法去删除元素,,会出现异常。原因是集合中删除元素会导致迭代器语气的迭代次数发生改变,导致迭代器的结果不准确。

    public class Test1 {
        public static void main(String[] args) {
    //        创建ArrayList对象
            ArrayList list = new ArrayList();
    //        添加元素
            list.add("data_1");
            list.add("data_2");
            list.add("data_3");
            Iterator iterator = list.iterator();
            while (iterator.hasNext()){
            //hasNext()判断集合中是否存在下一个元素
                Object object = iterator.next();
          	//如果存在,则调用next()将其取出,否则说明已经到达了集合末尾,停止遍历
                System.out.println(object);
            }
        }
    }
    //输出结果为
    data_1
    data_2
    data_3
    
    

    foreach遍历集合

    foreach是一种简介的for循环,也被称为增强for循环。foreach循环用于遍历数组或集合中的元素,具体语法格式如下

    for( 容器中的元素类型 临时变量 : 容器变量 ){
    //执行语句
    }
    public class Test1 {
        public static void main(String[] args) {
    //        创建ArrayList对象
            ArrayList list = new ArrayList();
    //        添加元素
            list.add("data_1");
            list.add("data_2");
            list.add("data_3");
            for (Object object : list) {
                System.out.println(object);
            }
        }
    }
    
    

    foreach也存在局限性,当时用foreach循环时,不能对集合中元素进行修改。

    JDK8的forEach遍历集合

    在JDK8中,根据Lambda表达式的特性还增加了一个forEach方法来遍历集合,演示如下

    public class Test1 {
        public static void main(String[] args) {
    //        创建ArrayList对象
            ArrayList list = new ArrayList();
    //        添加元素
            list.add("data_1");
            list.add("data_2");
            list.add("data_3");
            list.forEach(obj-> System.out.println("迭代器集合元素"+obj));
            }
        }
    //输出结果为
    迭代器集合元素data_1
    迭代器集合元素data_2
    迭代器集合元素data_3
    
    

    Set接口

    Set接口简介

    Set接口中的元素无序,并且保证存入的元素不会重复。Set接口主要有两个实现类,分别是HashSet和TreeSet,其中HashSet是根据对象的哈希值来确定元素集合中的存储位置,因此具有良好的存取和查找性能。TreeSet则以二叉树的方式来存储元素,它可以实现对集合中的元素排序。

    HashSet集合

    HashSet是set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当想HashSet集合中添加元素时,首先会调用hashcode方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素。

    public class Test1 {
        public static void main(String[] args) {
            HashSet hashSet = new HashSet();
            hashSet.add("Jack");
            hashSet.add("Rose");
            hashSet.add("Eve");
            hashSet.add("Rose");
            hashSet.forEach(obj-> System.out.println(obj));
            }
        }
        //输出结果为
        Eve
    	Rose
    	Jack
    
    

    向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象是,需要重写Object类中的hashCode()和equals()方法。上个例子将字符串存入HashSet时,String类已经默认重写了hashCode的方法,但是有时候传入自定义类型的对象存入HashSet,需要重写方法。

    package Demo01;
    
    import java.util.ArrayList;
    import java.util.*;
    
    /**
     * @author Dell
     */
    public class Test1 {
        public static void main(String[] args) {
            HashSet hashSet = new HashSet();
            hashSet.add(new Student("2","zhang"));
            hashSet.add(new Student("8","name"));
            hashSet.add(new Student("4","jack"));
            hashSet.add(new Student("6","row"));
            hashSet.forEach();
            }
        }
    class Student{
        String id;
        String name;
    
        public Student(String id, String name) {
            this.id = id;
            this.name = name;
    
        }
        @Override
        public String toString(){
            return id+" "+name;
        }
        @Override
        public int hashCode(){
            return id.hashCode();
        }
        @Override
        public boolean equals(Object object){
            if(this == object){		//判断是否是同一个对象
                return true;		//如果是,返回true
            }
            if(!(object instanceof Student)){		//判断对象是为Student类型
                return false;		//如果不是,返回false
            }
            Student student = (Student) object;			//将对象强转为Student类型
            boolean b = this.id.equals(student.id);		//判断id值是否相同
            return b;									//返回判断结果
        }
    }
    //输出结果为
    [2 zhang, 4 jack, 6 row, 8 name]
    
    
    

    TreeSet接口

    TreeSet采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,且可以排序。集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable定义的。在向TreeSet传入自定义数据时,没有实现Comparable接口。为了解决这个问题java提供了两种方法分别为自然排序和定制排序。

    //自然排序
    package Demo01;
    
    import java.util.ArrayList;
    import java.util.*;
    
    /**
     * @author Dell
     */
    public class Test1 {
        public static void main(String[] args) {
            TreeSet treeSet = new TreeSet();
            treeSet.add(new Teacher("jack",18));
            treeSet.add(new Teacher("rose",19));
            treeSet.add(new Teacher("tom",19));
            treeSet.add(new Teacher("rose",19));
            System.out.println(treeSet);
    
            }
        }
    //    定义Teacher类实现Comparable接口
    class Teacher implements Comparable{
        String name;
        int age;
    
        public Teacher(String name, int age) {
            this.name = name;
            this.age = age;
        }
        @Override
        public String toString(){
            return name +":"+age;
        }
    //    重写Comparable接口的compareTo()的方法
        @Override
        public int compareTo(Object obj){
            Teacher teacher = (Teacher) obj;
    //     定义比较方式,先比较年龄,再比较名称name
            if(this.age- teacher.age>0){
                return 1;
            }
            if(this.age- teacher.age==0){
                return this.name.compareTo(teacher.name);
            }
            return -1;
        }
    }
    //输出结果为
    [jack:18, rose:19, tom:19]
    
    

    Teacher类实现了Comparable接口,并重写compareTo()方法。在compareTo()方法中,首先针对age值进行修改,根据比较结果返回-1和1,当age相同时,再对name进行比较。教师Teacher对象首先按照年龄升序排序,年龄相同时会按照姓名进行升序排序,并且TreeSet集合会将重复的元素去掉。

    //定制排序
    package Demo01;
    
    import java.util.*;
    
    /**
     * @author Dell
     */
    public class Test1 {
        public static void main(String[] args) {
    //      1.创建集合时,传入Comparator接口实现定制排序规则
            TreeSet treeSet = new TreeSet(new MyComparator());
            treeSet.add("jack");
            treeSet.add("hello");
            treeSet.add("tom");
            System.out.println(treeSet);
    //      2.创建集合时,使用Lambda表达式定制排序规则
            TreeSet treeSet1 = new TreeSet((obj1,obj2)->{
                String s1 = (String) obj1;
                String s2 = (String) obj2;
                return s1.length() - s2.length();
            });
            treeSet1.add("jack");
            treeSet1.add("tom");
            treeSet1.add("hello");
            System.out.println(treeSet1);
            }
        }
    class MyComparator implements Comparator{
        @Override
        public int compare(Object obj1, Object obj2){ //定制排序方式
            String str1 = (String) obj1;
            String str2 = (String) obj2;
            int temp = str1.length()-str2.length();
            return temp;
        }
    }
    
    

    Map接口

    Map接口简介

    Map接口是一个双列集合,它的每个元素都包含一个键对象Key和值对象Value,键和值对象之间存在一种对应关系,称为映射。Map中key和value可以是任意数据类型,并且键对象Key不允许重复,在访问Map集合中的元素时,只要指定了Key,就能找到对应的Value。

    HashMap集合

    HashMap集合时Map接口的一个实现类,它用于存储键值映射关系,该集合的键和值允许为空,但键不能重复,且集合中的元素是无序的。

    Map集合遍历

    Iterator迭代器遍历Map集合

    使用Iterator遍历集合需要先将Map集合转换为Iterator接口对象,然后进行遍历。由于Map集合中元素是有键值对构成的,所以使用Iterator遍历,有两种方法,即keySet()和entrySet()
    keySet()方法需要将Map集合中所有的键对象转换为Set单列集合,接着将含键对象的Set集合转换为Iterator接口对象,然后遍历Map集合中所有的键,再根据键获取相应的值。

    //该方法是keySet()方法
    import java.util.*;
    
    /**
     * @author Dell
     */
    public class Test1 {
        public static void main(String[] args) {
            Map map = new HashMap();
            map.put("3", "Jack");
            map.put("1", "Rock");
            map.put("2", "Tom");
            Set keySet = map.keySet();//获取键的集合
            Iterator iterator = keySet.iterator();//迭代键的集合
            while (iterator.hasNext()) {
                Object key = map.keySet();
                Object value = map.get(key);//获取每个键所对应的值
                System.out.println(key + ":" + value);
            }
        }
    }
    
    
    

    entrySet()方法将原有的Map集合中的键值对作为一个整体返回Set集合,接着将包含键值对对象的Set集合转换为Iterator接口对象,然后获取集合中的所有键值对映射关系,在从映射关系中取出键和值。

    //该方法是entrySet()方法
    package Demo01;
    
    import java.util.*;
    
    /**
     * @author Dell
     */
    public class Test1 {
        public static void main(String[] args) {
            Map map = new HashMap();
            map.put("3", "Jack");
            map.put("1", "Rock");
            map.put("2", "Tom");
            Set entrySet = map.entrySet();
            Iterator iterator = entrySet.iterator();//获取Iterator对象
            while (iterator.hasNext()){
                Map.Entry entry = (Map.Entry)(iterator.next());//获取集合中键值对映射关系
                Object key = entry.getKey();//获取Entry中的键
                Object value = entry.getValue();//获取Entry中的值
                System.out.println(key + ":" + value);
            }
        }
    }
    
    
    

    使用forEach方法遍历Map集合

    public class Test1 {
        public static void main(String[] args) {
            Map map = new HashMap();
            map.put("3", "Jack");
            map.put("1", "Rock");
            map.put("2", "Tom");
            map.forEach((key, value) -> System.out.println(key + ":" + value));
        }
    }
    
    

    在map集合中还提供了一个values()的方法,通过这个方法,可以直接获取Map中存储所有值的Collection集合

    public class Test1 {
        public static void main(String[] args) {
            Map map = new HashMap();
            map.put("3", "Jack");
            map.put("1", "Rock");
            map.put("2", "Tom");
            Collection values = map.values();//获取map集合中values值集合对象
            values.forEach(v-> System.out.println(v));
        }
    }
    
    
    

    使用LinkedHashMap集合保证元素添加顺序

    创建LinkedHashMap集合,可保证存取顺序一致。

    Properties集合

    Properties集合是HashTable的子类,Properties主要用来存储字符串类型的键和值。
    在文件目录中添加配置文件 文件名为test.properties
    下面来展示如何对properties配置文件进行读取和写入操作

    Background = black
    name = zhang 
    age = 19
    
    
    package Demo01;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.util.Properties;
    
    public class Test1 {
        public static void main(String[] args) throws Exception {
    //        1.通过properties进行属性文件读取操作
            Properties pps = new Properties();
    //        加载要读取的文件test.properties
            pps.load(new FileInputStream("test.properties"));
    //        遍历test.properties键值对元素信息
            pps.forEach((k,v)-> System.out.println(k +":"+ v));
    //        2.通过properties进行属性文件写入操作
    //        指定要写入操作的文件名称和位置
            FileOutputStream out = new FileOutputStream("test.properties");
    //        向properties类文件进行希尔键值对信息
            pps.setProperty("charset","UTF-8");
    //        将此properties集合中新增的键值对信息写入配置文件中
            pps.store(out,"新增charset编码");
        }
    }
    //第一次输出结果为
    background:black
    name:zhang
    age:19
    //第二次输出结果为
    charset:UTF-8
    background:black
    name:zhang
    age:19
    
    
    

    最后

    在文章的最后作者为大家整理了很多资料!包括java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书等等!
    有需要的朋友关注公众号:前程有光,自行下载即可!

  • 相关阅读:
    firefox安装教程
    shell脚本介绍
    vue 图片引入
    vscode 常用插件
    vscode 打不开chrome浏览器解决方案
    win10 wifi 密码查看
    爽文 主角如 石昊 白小纯 方行 秦牧 楚风
    codepen, jsrun 使用iframe嵌入
    uniapp 自定义扫一扫页面
    数组(遍历删除多个元素)
  • 原文地址:https://www.cnblogs.com/lwh1019/p/14678793.html
Copyright © 2011-2022 走看看