Java的学习日志(八)——集合

使用集合的步骤

  1. 创建集合对象

  2. 创建元素对象

  3. 将元素对象添加到集合对象中

  4. 遍历集合

List集合

List接口中的成员方法

  • public boolean add(E , e);
    将数据添加到集合的末尾,这里的E是泛型的意思
  • public E get (int index);
    根据索引,获取其对应的元素
  • public int size();
    获取集合的长度

List集合实例

测试类:

package Demo1;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        List list = new ArrayList();
        //2.创建元素对象
        Student s1 = new Student(41,"乔峰");
        Student s2 = new Student(41,"乔峰");
        Student s3 = new Student(38,"虚竹");
        Student s4 = new Student(26,"段誉");
        //3.将元素对象添加到集合对象中
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);

        //获取索引为2的元素
        Object obj = list.get(2);
        System.out.println("索引为2的元素是:" + obj);
        //获取集合的元素个数
        System.out.println("集合的长度为:" + list.size());
        System.out.println("---------------------");
        //4.遍历集合
        for (int i = 0; i < list.size() ; i++) {
            Object obj2 = list.get(i);
            System.out.println("索引为" + i + "的元素是:" + obj2);
        }
    }
}

package Demo1;

public class Student {
    private int age;
    private String name;

    public Student() {
    }

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

运行结果:

索引为2的元素是:Student{age=38, name='虚竹'}
集合的长度为:4
---------------------
索引为0的元素是:Student{age=41, name='乔峰'}
索引为1的元素是:Student{age=41, name='乔峰'}
索引为2的元素是:Student{age=38, name='虚竹'}
索引为3的元素是:Student{age=26, name='段誉'}

Set

特点:
不可重复,无序
Set集合保证元素的唯一性依赖:equals()和hashCode()两个方法
如果未在类中重置这两个方法,默认调用的是Object类中的这两个方法
而Object类中equals()方法默认比较的是地址值是否相同

格式:Set<T> set = new HahSet<>();

测试类:

package Set;


import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        Set<Student> set = new HashSet<>();
        //2.创建元素对象
        Student s1 = new Student("小一",11);
        Student s2 = new Student("小尔",12);
        Student s3 = new Student("小散",13);
        Student s4 = new Student("小思",14);
        Student s5 = new Student("小悟",15);

        //3.将集合对象添加到元素对象中
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        set.add(s5);
        //4.遍历集合
        System.out.println(set);
        System.out.println("-----------------------");

        System.out.println("通过迭代器实现");
        //通过迭代器遍历Set集合
        //A.通过集合对象获取其对应
        Iterator<Student> it = set.iterator();
        //B.判断迭代器中是否元素
        while(it.hasNext()){
            //C.如果有,就获取元素
            Student s = it.next();
            System.out.println(s);
        }
        System.out.println("-----------------------");

        
        //通过增强for遍历Set集合
        System.out.println("通过增强for遍历Set集合:");
        for (Student student : set) {
            System.out.println(student);
        }
    }
}

学生类:

package Set;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Student() {
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

运行结果:


[Student{name='小思', age=14}, Student{name='小悟', age=15}, Student{name='小一', age=11}, Student{name='小尔', age=12}, Student{name='小散', age=13}]
-----------------------
通过迭代器实现
Student{name='小思', age=14}
Student{name='小悟', age=15}
Student{name='小一', age=11}
Student{name='小尔', age=12}
Student{name='小散', age=13}
-----------------------
通过增强for遍历Set集合:
Student{name='小思', age=14}
Student{name='小悟', age=15}
Student{name='小一', age=11}
Student{name='小尔', age=12}
Student{name='小散', age=13}

Map

特点:
双列集合,元素由键值对(Entry)构成:key - - value
key不可重复,value可以重复

应用:Map<T1,T2> map = new HahMap<>();

成员方法:

  • V put(K key,V value); 添加元素(键值对的形式,元素第一次添加,返回null,重复添加,会用新值覆盖旧值,并返回旧值
  • V get(Object key); 根据键获取其对应的值
  • Set<K> keySet(); 获取所有键的集合

遍历步骤:

  1. 获取所有键的集合 keySet()
  2. 遍历所有的键,获取到每一个键 迭代器,增强for
  3. 根据键,获取指定的值 get()

测试类:

package Map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        //键:学生的编号,值:具体的学生对象
        Map<Integer,Student> map = new HashMap<>();
        //2.创建元素对象
        Student s1 = new Student("小一",11);
        Student s2 = new Student("小尔",12);
        Student s3 = new Student("小散",13);
        //3.将元素对象添加到集合中
/*        Student stu1 = map.put(1,s1);
        System.out.println("stu1:" + stu1);
        Student stu2 = map.put(1,s2);
        System.out.println("stu2:" + stu2);*/
        map.put(1,s1);
        map.put(2,s2);
        map.put(3,s3);

        //根据键,获取值
        Student stu3 = map.get(2);
        System.out.println("key:" + 2 + ", value:" + stu3);

        //打印集合
        System.out.println(map);
        System.out.println("-----------------------");

        //4.遍历集合
/*        //迭代器实现
        //获取所有键的集合
        Set<Integer> keys = map.keySet();
        //遍历所有的键,获取带每一个键
        //获取迭代器对象
        Iterator<Integer> it = keys.iterator();
        while(it.hasNext()){
            //如果迭代器中有数据,就获取
            Integer key = it.next();
            //根据键,获取值
            Student value = map.get(key);
            System.out.println("key:" + key + "……value:" + value);
        }*/

        //通过增强for实现
        Set<Integer> keys = map.keySet();
        for (Integer key : keys) {
            //key就是双列集合中的每一个键
            Student value = map.get(key);
            System.out.println("key:" + key + "……value:" + value);
            
        }
        
    }
}

学生类:

package Map;

import java.util.Objects;

public class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

运行结果:

key:2, value:Student{name='小尔', age=12}
{1=Student{name='小一', age=11}, 2=Student{name='小尔', age=12}, 3=Student{name='小散', age=13}}
-----------------------
key:1……value:Student{name='小一', age=11}
key:2……value:Student{name='小尔', age=12}
key:3……value:Student{name='小散', age=13}

增强For循环

格式:

for(元素的数据类型 变量名 : 要遍历的数组或者集合对象){
	//循环体,变量也就是元素
}

快捷方式:iter-->回车

增强for的底层依赖的是迭代器(iterator)

测试类:

package 增强for循环;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        List list = new ArrayList();
        //2.创建元素对象
        //3.将元素对象添加到集合对象中
        list.add(10);
        list.add(10);
        list.add(20);
        list.add(30);
        //4.遍历集合
        for (Object obj : list) {
            //obj是集合中的元素,其本身应该是Integer类型的数据
            Integer ii = (Integer)obj;
            System.out.println(ii);
        }
    }
}

Collections工具类

针对集合进行操作的工具类

  • sort(List <T>) 根据元素的自然顺序,将指定列表按升序排序
  • max(Collection<T>) 返回集合的最大元素
  • reverse(List <T>) 反转List集合元素
  • shuffle(List<T>) 使用默认的随机源置换指定的列表

实例:

package Collections工具类;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();

        list.add(1);
        list.add(3);
        list.add(5);
        list.add(2);
        list.add(4);
        list.add(6);

        System.out.println("没有操作集合前:" + list);
        System.out.println("--------------------------");

        //获取集合中的最大元素
        Integer max =  Collections.max(list);
        System.out.println("集合中的最大元素为:" + max);
        System.out.println("--------------------------");

    /*    //对集合进行升序排序
        Collections.sort(list);
        System.out.println("升序排序后的集合为:" + list);
        System.out.println("--------------------------");

        //对集合中的数据进行反转
        Collections.reverse(list);
        System.out.println("反转后的集合为:" + list);
        System.out.println("--------------------------");*/

        //对集合中的数据进行降序排序
        Collections.sort(list);
        Collections.reverse(list);
        System.out.println("对集合进行降序排序后:" + list);
        System.out.println("--------------------------");

        //随机置换,相当于洗牌
        Collections.shuffle(list);
        System.out.println("随机置换后的集合:" + list);
    }
}

运行结果:

没有操作集合前:[1, 3, 5, 2, 4, 6]
--------------------------
集合中的最大元素为:6
--------------------------
对集合进行降序排序后:[6, 5, 4, 3, 2, 1]
--------------------------
随机置换后的集合:[5, 6, 3, 4, 2, 1]

迭代器

对过程的重复,称为迭代。
迭代器是遍历collection集合的通用方式,可以在对集合遍历的同时进行添加,删除等操作。
列表迭代器是List体系独有的遍历方法,可以在集合遍历的同时进行添加,删除等操作,但是必须通过调用列表迭代器的方法来实现

常用方法:

  • next():返回迭代的下一个元素对象
  • hasNext():如果仍有元素可以迭代,则返回true

实例:

  1. 普通迭代器
package 迭代器;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
   public static void main(String[] args) {
       //需求:通过迭代器遍历List集合
       //1.创建集合对象
       List list = new ArrayList();
       //2.创建元素对象
       //3.将元素对象添加到集合对象中
       list.add("a");
       list.add("b");
       list.add("c");
       //4.遍历集合
       //迭代器的用法
/*        //1、根据集合对象获取其对象的迭代器对象
       Iterator it = list.iterator();
       //2、判断迭代器中是否有元素
       while (it.hasNext()){//如果迭代器中有元素,就一直迭代
           //3、如果有就获取元素
           String s = (String)it.next();
           System.out.println(s);
       }*/
       System.out.println("-----------------------");
       //需求:判断集合中如果有字符串“b”,就在其后面添加一个字符串“java”
       //1、根据集合对象获取其对象的迭代器对象
       Iterator it = list.iterator();
       //2、判断迭代器中是否有元素
       while (it.hasNext()){//如果迭代器中有元素,就一直迭代
           //3、如果有就获取元素
           String s = (String)it.next();
           if ("b".equals(s)) { //这样写可以避免空指针异常
               //能走到这里,说明集合中有元素b
               list.add("java");//ConcurrentModificationException错误
           }
           System.out.println(s);
       }
   }
  1. 列表迭代器
package 迭代器;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class Test1 {
    public static void main(String[] args) {
        //需求:通过迭代器遍历List集合
        //1.创建集合对象
        List list = new ArrayList();
        //2.创建元素对象
        //3.将元素对象添加到集合对象中
        list.add("a");
        list.add("b");
        list.add("c");
        //需求:判断集合中如果有字符串“b”,就在其后面添加一个字符串“java”
        //1、根据集合对象获取其对象的迭代器对象
        ListIterator lit = list.listIterator();;
        //2、判断迭代器中是否有元素
        while (lit.hasNext()) {
            //3、如果有就获取元素
            String s = (String)lit.next();
            if ("b".equals(s)) { //这样写可以避免空指针异常
                //能走到这里,说明集合中有元素b
                lit.add("java");
            }
            System.out.println(s);
        }
        System.out.println("-----------------");
        //打印新的集合中的值
        System.out.println(list);
    }
}

运行结果:

a
b
c
-----------------
[a, b, java, c]

总结:
普通的迭代器在遍历的过程中不能添加或删除元素,否则会报:并发修改异常;
列表迭代器在遍历的过程中可以修改集合中的元素(添加或删除等),但必须使用列表迭代器的方法

泛式

格式:List<数据类型> list = new ArrayList<数据类型>();
实例:

package 泛型;

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        //1.创建集合对象
        List list1 = new ArrayList();
        //2.创建元素对象
        //3.将元素对象添加到集合对象中
        list1.add("a");
        list1.add("b");
        list1.add("c");
        //4.遍历集合
        for (Object obj : list1) {
            String s = (String)obj;
            System.out.println(s);
        }
        System.out.println("----------------");
        
        //演示泛式
        //1.创建集合对象
        List<String> list2 = new ArrayList<String>(); //在JDK5以后后面的String可省略
        //2.创建元素对象
        //3.将元素对象添加到集合对象中
        list2.add("abc");
        list2.add("bcd");
        list2.add("cde");
        //4.遍历集合
        for (Object obj : list2) {
            System.out.println(obj);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFFPAG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值