java集合的简要体系结构

Iterator
    --ListIterator
ListIterator列表迭代器的由来:
当我想在迭代器迭代时添加元素,如果使用集合类对象的add方法就会出现并发修改异常 ConcurrentModificationException
而继承Iterator的ListIterator就有增删改查的功能

Collection
    --List
        ----ArraryList 数组列表(查询快,修改慢)
        ----LinkedList链接列表(查询慢,修改快)
        ----Vector 底层是数组被ArrayList替代了
    --Set
        --HashSet 
        --LinkedHashSet
        --SortedSet
          --TreeSet 



Map
    --HashMap哈希映射
    --TreeMap树映射
工具类
Collections 是操作Collection类和子类的工具类,提供了很多封装好的函数
Arrays  Array类及子类的工具类
比较类
Comparable  使类的不同实例之间具有可比性
Comparator 比较器,定义类比较的规则




List是列表,有索引,所以list集合中的元素是可以重复的,而且顺序存储,也就是说迭代的顺序和元素插入集合的顺序是一致的。

Set类似于数学中的集合,具有互异性,确定性,无序性。如果你想要集合中的元素具有唯一性,那么Set是不二选择。那么Set如何保证元素的唯一性的呢?
当集合中保存的是自定义类型时,调用对象的hashCode()方法得出对象的hash码,如果两个对象的hash码相同,就会调用对象的equals()方法
如果再相同就不会把对象插入集合容器。
那么问题来了
如果两个对象的内容是相同的,那么hash码肯定是相同的,这时就会调用equals()方法,然而Object对象的equals()是比较引用,也就是说类的实例只和自身相等。equals()肯定会返回false,这时内容相同的两个对象就会插入集合容器

解决方案
重写equals()方法

package cn.com.oracle;

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 + "]";
    }

    /**
     * 可以看到hash码值和对象的内容有关,内容相同的对象,hash值肯定相同
     */
    @Override
    public int hashCode() {
        System.out.println("调用了hashCode()");
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        System.out.println("调用了equals()");
        if (this == obj)//如果内存地址相等,肯定相等
            return true;
        if (obj == null)//null不与任何对象相等
            return false;
        if (getClass() != obj.getClass())//如果类型不同,肯定不同
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }




}
package cn.com.oracle;

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

/**
 * 
 * @author 格拉.香农
 *
 */
public class SetTest {

    public static void main(String[] args) {
        Set<Student> set=new HashSet<Student>();
        set.add(new Student("wangwu",20));
        set.add(new Student("lisi",19));
        set.add(new Student("zhangsan",23));
        set.add(new Student("zhangsan",23));

        for(Student stu:set)//使用for each代替迭代器,代码更简洁
        {
            System.out.println(stu);//打印一个对象,会调用这个对象的toString()方法
        }
    }

}

这里写图片描述

TreeSet类会强制对容器中的对象排序但需要对象所属的类实现Compareable接口,重写compareTo方法给出排序的方式,往容器中存储对象时编译器会自动调用compareTo方法。比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
( a)元素具备比较性 b)定义比较器,传给Set的构造函数)

这里写图片描述

Comparator比较器
这里写图片描述

Map集合
遍历key
遍历value
遍历k/v

package cn.com.oracle;

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

public class MapTest {

    public static void main(String[] args) {

        Map<String, Integer> map = new HashMap<String, Integer>();
        map.put("哇哈哈", 3);
        map.put("健力宝", 4);
        map.put("东方树叶", 5);

        // 遍历key
        Set<String> keySet = map.keySet();
        for (String str : keySet)
            System.out.println(str);

        // 遍历value
        Collection<Integer> values = map.values();
        for (Integer str : values)
            System.out.println(str);

        // 遍历key/value
        Set<Entry<String, Integer>> entrySet = map.entrySet();
        for (Entry<String, Integer> str : entrySet)
            System.out.println(str);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值