码迷,mamicode.com
首页 > 编程语言 > 详细

Java容器

时间:2019-08-18 15:26:05      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:obj   rgs   源码   asn   java   min   prime   static   final   

一,list集合排序

对于自定义数据类型,排序可以用Collections集合工具类中的sort()方法,

而要想使用sort()方法则必须实现Comparable接口然后重写里面的compareTo方法或单独一个类实现Comparactor接口重写里面的compare方法

String类型已经实现了Comparable接口

1,实现Comparable接口

public class Teacher implements Comparable<Teacher> {
    String name;
    int age;

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

    @Override
    public String toString() {
        return "Teacher [name=" + name + ", age=" + age + "]";
    }

    @Override
    public int compareTo(Teacher t) {
        if (age > t.age) {
            return 1;
        }
        if (age < t.age) {
            return -1;
        }
        if (age == t.age) {
            return name.compareTo(t.name);// 如果age相等则用name排序
        }
        return age;
    }

}

 

2,实现Comparactor接口

 

public class Teacher2{
    String name;
    int age;

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

    @Override
    public String toString() {
        return "Teacher [name=" + name + ", age=" + age + "]";
    }    
}

 

public class AgeAndNameSort implements Comparator<Teacher2>{

    @Override
    public int compare(Teacher2 t1, Teacher2 t2) {
        if (t1.age > t2.age) {
            return 1;
        }
        if (t1.age < t2.age) {
            return -1;
        }
        if (t1.age == t2.age) {
            return t1.name.compareTo(t2.name);// 如果age相等则用name排序
        }
        return t1.age;
    }
}

测试方法

void test6(){
        Teacher teacher1 = new Teacher("jack", 23);
        Teacher teacher2 = new Teacher("mary", 25);
        Teacher teacher3 = new Teacher("Tom", 25);
        Teacher teacher4 = new Teacher("Alice", 13);
        List<Teacher> list = new ArrayList<>();
        list.add(teacher1);
        list.add(teacher2);
        list.add(teacher3);
        list.add(teacher4);
        list.add(teacher2);
        Collections.sort(list);
        for (Teacher teacher : list) {
            System.out.println(teacher);
        }
    }
    
    void test7(){
        Teacher2 teacher1 = new Teacher2("jack", 23);
        Teacher2 teacher2 = new Teacher2("mary", 25);
        Teacher2 teacher3 = new Teacher2("Tom", 25);
        Teacher2 teacher4 = new Teacher2("Alice", 13);
        AgeAndNameSort ageAndNameSort = new AgeAndNameSort();
        List<Teacher2> list = new ArrayList<>();
        list.add(teacher1);
        list.add(teacher2);
        list.add(teacher3);
        list.add(teacher4);
        list.add(teacher2);
        Collections.sort(list, ageAndNameSort);
        for (Teacher2 teacher : list) {
            System.out.println(teacher);
        }
    }

测试结果

Teacher [name=Alice, age=13]
Teacher [name=jack, age=23]
Teacher [name=Tom, age=25]
Teacher [name=mary, age=25]
Teacher [name=mary, age=25]

 

3,使用细节

void test3(){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(11);
        list.add(111);
        
        //列表转换为数组
        Integer[] ls1 = list.toArray(new Integer[2]);
        //Integer[] ls2 = (Integer[]) list.toArray();//cannot be cast to [Ljava.lang.Integer;
        Object[] ls3 = list.toArray();
        
        System.out.println(ls1);
        //System.out.println(ls4);
        System.out.println(ls3);
    }
    
    void test4(){
        Integer[] in = {33, 44, 55};
        //array 转换为list
        List<Integer> list = Arrays.asList(in);//先转换为list 这个list为只读 没有add方法
        List<Integer> arrayList = new ArrayList<>();
        arrayList.addAll(list);
    }
    
    void test5(){
        //并发修改异常 迭代器相当于集合的副本,当迭代器和集合不一样时(元素个数不同等等)就会报错
        //at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
        List<String> lt = new ArrayList<String>();
        
        lt.add("java");
        lt.add("python");
        lt.add("php");
        
//        Iterator<String> it = lt.iterator();
//        while(it.hasNext()){
//            if(it.next().equals("java")){
//                lt.add("C++");
//            }
//            System.out.println(it.next());//报错Exception in thread "main" java.util.NoSuchElementException
//        }

 

 

二,set集合

HashSet集合可以去重,但对于自定义数据类型必须重写equals方法和hashCode方法

当你把对象加入到HashSet时,它会使用对象的hashCode值判断对象加入的位置。但是同时也会与其他已经加入的对象的hashCode做对比,如果没有相符的hashCode,HashSet就会假设新对象没有重复。也就是说,如果hashcode时相异的,则HashSet会假设对象不可能是相同的。但有相同hashCode()的对象也不一定相等,所以如果HashCode()找到相同hashcode的两个对象:金加入的对象本来就存在的,它会调用其中一个的equals()来检查hashcode相等的对象是否真的相等。

TreeSet不仅可以去重还可以排序,但排序条件和list集合一样,必须实现Comparable接口或Comparactor接口

1,HashSet重写equals方法和hashCode方法

public class Student {
    String name;
    int age;

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

    public void method1() {

    }

    @Override
    public int 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) {
        if (this == obj)
            return true;
        if (obj == 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;
    }

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

}

 

测试类

public class HashSetTest {

    public static void main(String[] args) {
        //创建set集合
        Set<Student> s1 = new HashSet<>();
        
        //创建学生对象
        Student t1 = new Student("xiaoming", 21);
        Student t2 = new Student("xiaojun", 20);
        Student t3 = new Student("xiaoming",21);
        
        //添加学生对象
        s1.add(t1);
        s1.add(t2);
        s1.add(t3);
        
        //遍历学生对象
        for (Student student : s1) {
            System.out.println(student);
        }
        
        /*
         * 未实现重写hashCode和equals方法前
         * Student [name=xiaoming, age=21]
         * Student [name=xiaoming, age=21]
         * Student [name=xiaojun, age=20]
         * 有重复,默认的hashCode(哈希值返回每个对对象的地址值)比较结果不同, 被认为是不同对象,所以添加成功
         * 
         * 
         * 总结:
         * 对于自定义类型使用HashSet必须正确重写hashCode和equals方法
         */
        
        System.out.println("--------使用方法-------");
        new HashSetTest().method1();
    }

    
    public void method1(){
        //创建set对象
        Set<Integer> s1 = new HashSet<>();
        
        //添加元素
        s1.add(11);
        s1.add(12);
        s1.add(11);
        s1.add(14);
        
        System.out.println(s1);//[11, 12, 14]  基本引用类型自动去重
    }

}

测试结果

Student [name=xiaoming, age=21]
Student [name=xiaojun, age=20]
--------使用方法-------
[11, 12, 14]

 

2,TreeSet集合

public class Teacher{
    String name;
    int age;

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

    @Override
    public String toString() {
        return "Teacher [name=" + name + ", age=" + age + "]";
    }    
}

 

 

/*
 * 它实现了SortedSet这个接口,所以它有序
 * 排序必定要实现comparable接口,目的是保持元素有序
 * 可以保持集合有序状态,默认按自然顺序递增排序,也可以按照指定的比较器递增排序
 * 
 * 用没有参数的构造函数意味着以对象的comparaTo方法进行排序
 * 
 * 不需要覆写hashCode和equals的原因:
 *         TreeSet是红黑树结构,其主要使用的是在插入的时候根据你提供的比较规则插入, 二叉树
 */
public class TreeSetTest {
    public static void main(String[] args) {
        TreeSet<Teacher> t = new TreeSet<>();
        
        Teacher t1 = new Teacher("Jack", 43);
        Teacher t2 = new Teacher("Mary", 39);
        Teacher t3 = new Teacher("Jack", 43);
        Teacher t4 = new Teacher("John", 23);
        Teacher t5 = new Teacher("Cal", 23);
        Teacher t6 = new Teacher("Lory", 99);
        
        t.add(t1);
        t.add(t2);
        t.add(t3);
        t.add(t4);
        t.add(t5);
        t.add(t6);
        t.add(t6);
        
        /*
         * 直接进行输出报错:
         *         Teacher cannot be cast to java.lang.Comparable
         * 
         * 原因:
         *         用TreeSet存储对象时必须实现Comparable接口,它是一个有序的列表
         * 
         * 疑问:
         *         为何它不用重写hashCode和equals方法????
         */
        for (Teacher teacher : t) {
            System.out.println(teacher);
        }
        
        
        //建立一个自己的nameComparactor
        class nameCompare implements Comparator<Teacher>{

            @Override
            public int compare(Teacher g0, Teacher g1) {
                // TODO Auto-generated method stub
                return g0.name.compareTo(g1.name);
            }
        }

 

三,Map基本使用

//注意事项:使用自定义对象作为key时也要重写hashCode和equals方法

public class MapTest {
    
    public static void main(String[] args) {
        new MapTest().test1();
    }
    
    void test1(){
        //创建map对象
        Map<String , String> m1 = new HashMap<>();
        
        //添加元素  映射功能 键如果不存在返回null 如果存在则返回该值进行了修改
        m1.put("006", "yuan");
        m1.put("002", "dai");
        m1.put("005", null);
        m1.put("0019", "YY");
        m1.put("001", "jj");
        System.out.println(m1.put("004", "jack"));
        System.out.println(m1.put("001", "maryan"));
        
//        Map.Entry<String, String> ey = (Entry<String, String>) m1.entrySet();
        Set<Map.Entry<String, String>> entry1 = m1.entrySet();
        //用Map.Entry<>遍历map的键,值
        for(Map.Entry<String, String> entry: m1.entrySet()){
            String k = entry.getKey();
            String v = entry.getValue();
        }
        
        //获取key生成的集合
        Set<String> s1 = m1.keySet();
        System.out.println(s1);
        
        //获取value生成的集合
        Collection<String>  c1 = m1.values();
//        List<String> l1 = (List<String>) m1.values();//查看源码可知:不能强制转换为list,它不为list 没有索引
        System.out.println(c1);
//        System.out.println(l1);
        
        //生成新的集合,TreeMap
        Map<String, String> m2 = new TreeMap<>();
        m2.putAll(m1);
        System.out.println(m1);// 有序字典
        System.out.println(m2);//无序字典
    }

 

Java容器

标签:obj   rgs   源码   asn   java   min   prime   static   final   

原文地址:https://www.cnblogs.com/noperx/p/11372342.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!