Java集合体系总结

由于不同的数据结构(数据的组织,存储方式),所以Java为我们提供了不同的集合。

集合体系形成的原因,是由于各类集合的功能都是类似的,不断的向上提取,抽取共性,形成集合体系。

有这样一个特点,最顶层包括有所有集合的共性,而最底层有最具体的实现

而根据它们不同的特点,大致可以分为两类:

  • 有序(存储和读取的顺序是一致的),允许重复,有整数索引。如:Collection,List,ArrayList,LinkedList(链表集合)遍历方法有四种:

1.for循环,通过整数索引遍历

public static void findAllStudent(ArrayList<Student> arr){//查看所有学生信息
        if (arr.size() == 0){
            System.out.println("目前没有数据,请重新选择操作");
            return;
        }
        System.out.println("学号\t\t姓名\t年龄\t居住地");
        for (int i=0;i<arr.size();i++){
            Student s = arr.get(i);
            System.out.println(s.getId() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
        }
    }

2.通过 Iterator 迭代器对象(相当于创建一个对象的副本)遍历;PS:此方法需要注意并发修改异常,即不能直接修改原集合对象的元素,而是通过修改 Iterator 迭代器对象的元素来改变原集合对象元素。

Collection c1 = new ArrayList();
        c.add("hello");
        c.add("world");
        Iterator it1  = c.iterator();

        while (it1.hasNext()){//通过迭代器循环遍历集合
            System.out.println(it1.next());
        }

3.通过toArray()方法,将集合转化为数组遍历

Collection<String> c = new ArrayList<String>();
        c.add("hello");
        c.add("world");
        Object[] obj = c.toArray();

        for (int i = 0; i < obj.length; i++) {
            System.out.println(obj[i]);
        }

4.通过foreach加强循环遍历

private static void method() {
        HashSet<Student> hs = new HashSet<Student>();
        //创建元素对象
        Student s = new Student("aa","12");
        Student s1 = new Student("bb","13");
        //添加元素对象
        hs.add(s);
        hs.add(s1);

        //遍历集合对象
        for (Student s2:hs
             ) {
            System.out.println(s2);
        }
    }
  • 无序(存储和读取的顺序有可能不一样),不允许重复(普通元素通过 equals 和 hashcode 方法判断,引用类型元素需自行重写hashcode 和 equals 方法),无索引,可添加Null元素(只允许有一个)。如:Set,HashSet,Map(双列集合),HashMap <Key,Value>(键值映射关系对象,key不允许重复)

由于没有索引,所以无序集合无法使用for循环方法遍历,故只有之上的2,3,4,三种遍历方法。

PS:HashSet的add()方法查找不能去重的原因在于,对于自定义的引用对象,无法对其成员变量进行逻辑的比对,所以需自行在类中重写其中的Hashcode和equals方法,同时可根据自身具体要求,重写tostring方法,使其打印输出简洁化。如:

class Student {
    private String name;
    private String 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  name.equals(student.name)&&age.equals(student.age);//成员变量比较
    }

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值