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>
表示的是类型的上界(包含自身),因此通配的参数化类型可能是T
或T
的子类。
下界通配符:<? 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