Java集合框架概述(二)——泛型集合与Collections工具类

java集合框架概述(一)——List接口的那些事

前景回顾

 这是一个关于ArrayList的类,不难发现,集合里面存储了五种不同的类型,显然这是没有任何的规范,导致集合里可以添加任意类型的对象。所以,在打印doublr类型的时候会报错。显示,这就是类型不安全的例子。

public class TestArrayList {
    public static void main(String[] args){
        ArrayList list = new ArrayList();
        list.add(10);
        list.add(10.0);
        list.add("Hello");
        list.add('A');
        list.add(true);

        double sum = 0;
        for (int i = 0; i < list.size(); i++) {
            sum += (double)list.get(i);
        }
    }
}

Exception in thread “main” java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Doubleat list.TestArrayList.main(TestArrayList.java:16)

因此,为了更好的规范数组,引入了泛型


泛型集合

概念:参数化类型、类型安全的集合,强制集合元素类型必须一致。
特点:

  • 编译时即可检查,而非运行时抛出异常
  • 访问时。不必类型转换(拆箱)
  • 不同泛型之间引用不能互相赋值,泛型不存在多态

基本泛型

ArrayList<Double> list = new ArrayList<Double>();
在这里插入图片描述
其他的List接口或者实现List的各类也是类似定义泛型的。

高级泛型

1.实例泛型

  • 类中的泛型:在new对象的时候定义泛型的数据类型
public class AdvancedGeneric {
    public static void main(String[] args){
        //在new对象的时候定义泛型的数据类型
        MyClass<Integer> myClass = new MyClass<Integer>();
        myClass.classMethod(12);
    }
}
//类中的泛型
class MyClass<E>{
    public void classMethod(E e){

    }
}

2.接口泛型

  • 接口中的泛型:实现类定义泛型的数据类型
public class AdvancedGeneric {
    public static void main(String[] args){
        //泛型接口
        MyImplClass myImplClass = new MyImplClass();
        myImplClass.interfaceMethod(true);
    }
}
//接口中的泛型
interface MyInterface<T>{
    void interfaceMethod(T t);
}
//实现接口的类 此处定义泛型的数据类型
class MyImplClass implements MyInterface<Boolean>{

    @Override
    public void interfaceMethod(Boolean b) {
    }
}

3.静态泛型

  • 静态类中的泛型:在静态方法中定义泛型的数据类型
public class AdvancedGeneric {
    public static void main(String[] args){
       //调用静态类
        MyStaticClass myStaticClass  = new MyStaticClass();
        myStaticClass.method(123);
        myStaticClass.method(true);
    }
//静态类:在静态方法中定义泛型的数据类型
class MyStaticClass {
    public static<T> void method(T t){

    }
}

但是似乎Static中的泛型就是object没有对数据类型进行限制,如果我们需要传入number数据类型的值该怎么做呢?

public class AdvancedGeneric {
    public static void main(String[] args){
       //调用静态类
        MyStaticClass myStaticClass  = new MyStaticClass();
        myStaticClass.method(123);
      //  myStaticClass.method(true); //类型错误
    }
//静态类
class MyStaticClass {
    public static<T extends Number> void method(T t){
        System.out.println(t);
    }
}

上界通配符:<? extends T>表示的是类型的上界(包含自身),因此通配的参数化类型可能是TT的子类。
下界通配符:<? super T>表示的是参数化类型是T的超类型(包含自身),层层至上,直至Object

Collections工具类

  • 集合工具类:定义了除了存取以外的集合常用的方法
方法 描述
public static void reverse(List<?> list) 反转集合中元素的顺序
public static void shuffle(List<?> list) 随机重置集合元素中的顺序
public static void sort(List<?> list) 升序排序(元素必须实现Comparable接口)
  • sort方法里的参数T必须实现Comparable接口
//使用sort方法必须实现Comparable接口
  public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
    } 

使用举例:

public class testCollections {
    public static void main(String[] args){
        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(3);
        list.add(5);
        list.add(7);
        list.add(9);
       // Collections.reverse(list);
        //Collections.shuffle(list);
        Collections.sort(list);
        for(Integer integer : list){
            System.out.println("运行结果:"+integer);
        }
    }
}
----sort------------  -------reverse----------------shuffle----------
运行结果:1             	运行结果:9				运行结果:7
运行结果:3				运行结果:7				运行结果:9
运行结果:5				运行结果:5				运行结果:1
运行结果:7				运行结果:3				运行结果:5
运行结果:9				运行结果:1				运行结果:3

发布了82 篇原创文章 · 获赞 124 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_44717317/article/details/104640253