java-泛型、set集合和map集合

泛型概述

泛型:是JDK5中引入的特性,它提供了编译时类型安全检测机制

泛型的好处: 把运行时期的问题提前到了编译期间 避免了强制类型转换

泛型可以使用的地方

类后面:泛型类

方法申明上:泛型方法

接口后面:泛型接口

泛型类的总结

如果一个类的后面有,表示这个类是一个泛型类。 创建泛型类的对象时,必须要给这个泛型确定具体的数据类型。

泛型的定义格式

<类型>:指定一种类型的格式。 尖括号里面可以任意书写,按照变量的定义规则即可。一般只写一个字母。 比如:<E>、<T>、<Q>、<M>

<类型1,类型2...>:指定多种类型的格式,多种类型之间用逗号隔开。 比如:<E,T>、<Q,M>、<K,V>

泛型类的定义格式:

泛型类

格式:修饰符 class 类名 { }

范例:public class Generic { },此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型

泛型方法

泛型方法的定义格式:

格式:修饰符 返回值类型 方法名(类型 变量名) { }

范例:public void show(T t) { }

泛型接口

泛型接口的使用方式:

实现类也不给泛型

实现类确定具体的数据类型

泛型接口的定义格式:

格式:修饰符 interface 接口名 { }

范例:public interface Generic { }

类型通配符

类型通配符:<?>

ArrayList<?>:表示元素类型未知的ArrayList,它的元素可以匹配任何的类型

但是并不能把元素添加到ArrayListList中了,获取出来的也是父类类型

类型通配符上限<? extends 类型>: 比如: ArrayListList<? extends Number>:它表示的类型是Number或者其子类型

类型通配符下限<? super 类型>: 比如: ArrayListList<? super Number>:它表示的类型是Number或者其父类型

Set

Set集合概述和特点

Set集合特点

可以去除重复

存取顺序不一致

没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素

public static void main(String[] args) {
        HashSet<String> hs = new HashSet<>();
        hs.add("a");
        hs.add("b");
        hs.add("c");
        hs.add("d");
        for(String s: hs){
            System.out.println(s);
        }
    }

TreeSet

TreeSet集合概述和特点

TreeSet集合特点

不包含重复元素的集合

没有带索引的方法

可以将元素按照规则进行排序

自然排序Comparable的使用

使用空参构造创建TreeSet集合

自定义的Student类实现Comparable接口

重写里面的compareTo​方法

public static void main(String[] args) {
        Student s1 = new Student("zhangsan",28);
        Student s2 = new Student("lisi",27);
        Student s3 = new Student("wangwu",29);
        Student s4 = new Student("zhaoliu",28);
        Student s5 = new Student("qianqi",30);

        TreeSet<Student> ts = new TreeSet<>();
        ts.add(s1);
        ts.add(s2);
        ts.add(s3);
        ts.add(s4);
        ts.add(s5);

        for (Student s : ts){
            System.out.println(s);
        }
    }
public class Student implements Comparable<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;
    }

/**
如果返回值为负数,表示当前存入的元素是较小值,存左边
如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存
如果返回值为正数,表示当前存入的元素是较大值,存右边
*/
    @Override
    public int compareTo(Student s) {
        int result = this.age - s.age;
        result = result == 0 ? this.name.compareTo(s.name) : result;
        return result;
    }

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

   }

比较器排序Comparator的使用

TreeSet的带参构造方法使用的是比较器排序对元素进行排序的

比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare​(T o1,T o2)方法

重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写

public static void main(String[] args) {
        TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
            @Override
            public int compare(Teacher t1, Teacher t2) {
                int result = t1.getAge() - t2 .getAge();
                result = result == 0 ? t1.getName().compareTo(t2.getName()) : result;
                return result;
            }
        });
        Teacher t1 = new Teacher("zhangsan",23);
        Teacher t2 = new Teacher("lisi",22);
        Teacher t3 = new Teacher("wangwu",24);
        Teacher t4 = new Teacher("zhaoliu",24);
        //把老师添加到集合
        ts.add(t1);
        ts.add(t2);
        ts.add(t3);
        ts.add(t4);
        //遍历集合
        for (Teacher teacher : ts) {
            System.out.println(teacher);
        }
    }
public class Teacher {
    private String name;
    private int age;

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

    public Teacher() {
    }

    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 "Teacher{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

两种比较方式小结

自然排序:自定义类实现Comparable接口,重写compareTo​方法,根据返回值进行排序。

比较器排序:创建TreeSet对象的时候传递Comparator的实现类对象,重写compare方法,根据返回值进行排序。

在使用的时候,默认使用自然排序,当自然排序不满足现在的需求时,使用比较器排序

两种方式中,关于返回值的规则:

如果返回值为负数,表示当前存入的元素是较小值,存左边

如果返回值为0,表示当前存入的元素跟集合中元素重复了,不存

如果返回值为正数,表示当前存入的元素是较大值,存右边

HashSet集合概述和特点

HashSet集合特点

底层数据结构是哈希表

对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致

没有带索引的方法,所以不能使用普通for循环遍历

由于是Set集合,所以元素唯一

public static void main(String[] args) {
        HashSet<String> hs = new HashSet<>();
        hs.add("a");
        hs.add("b");
        hs.add("c");
        hs.add("d");
        for(String s: hs){
            System.out.println(s);
        }
    }

Map

Map集合概述

Interface Map<K,V>     K:键的数据类型;V:值的数据类型

键不能重复,值可以重复

键和值是一一对应的,每一个键只能找到自己对应的值

(键 + 值) 这个整体 我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”。

Map集合的基本功能

方法名

说明

V put(K key,V value)

添加元素

V remove(Object key)

根据键删除键值对元素

void clear()

移除所有的键值对元素

boolean containsKey(Object key)

判断集合是否包含指定的键

boolean containsValue(Object value)

判断集合是否包含指定的值

boolean isEmpty()

判断集合是否为空

int size()

集合的长度,也就是集合中键值对的个数

Map集合的获取功能

方法名

说明

V get(Object key)

根据键获取值

Set<K> keySet()

获取所有键的集合

Map集合的获取功能

方法名

说明

Set<Map.Entry<K,V>> entrySet()

获取所有键值对对象的集合

K  getKey()

获得键

V  getValue()

获得值

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值