泛型
泛型概念
- 泛型是一种未知的数据类型。
- 可以看作一个变量,用来接收数据类型。
泛型类
- 格式:如:public class Test{ }
- 创建对象时确定数据类型。
- 会把数据类型看作参数传递。
- 创建集合对象
- 不使用泛型的好处与坏处:
- 好处:集合不使用泛型,则默认是Object类型,可以存储任意数据类型。
- 坏处:不安全,会引起异常。如:当某个集合中既存储String用存储int数据时,当我们想调用String类型特有的方法时,必须将int型强制转化成String类型,但编译器不允许这样转化,会报ClassCastException错误。
- 使用泛型的好处与坏处:
- 避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型。
- 把运行期异常(代码运行之后才抛出的异常),提升到编译期(写代码时会报错)。
- 泛型是什么类型,就只能存储什么类型。
泛型接口
- 格式:如:public interface Test{ }
泛型方法
- 格式:如:public <T> void test (T s) { }
- 在静态方法中,不能使用类定义泛型,只能使用静态方法自己定义的类型。格式:public static <T> void test (T s) { }。
泛型通配符
public class Helloworld {
public static void main(String[] args) {
ArrayList<Integer> list01 = new ArrayList<>();
list01.add(1);
list01.add(2);
ArrayList<String> list02 = new ArrayList<>();
list02.add("a");
list02.add("b");
printArray(list01);
printArray(list02);
}
private static void printArray(ArrayList<?> list) {
Iterator<?> it = list.iterator();
while (it.hasNext()){
Object o = it.next();
System.out.println(o);
}
}
}
- 注意:
- 受限泛型
- 泛型的上限:
- 类型名称 < ? extends 类 > 对象名称
- 意义:只能接收该类型及其子类
- 泛型的下限:
- 类型名称 < ? super 类 > 对象名称
- 意义:只能接收该类型及其父类
- 继承关系:
- Integer extends Number extends Object
- String extends Object
多线程
线程同步解决安全问题
- 判断多线程程序是否会有数据安全问题的标准:
- 是否是多线程换环境
- 是否有共享数据
- 是否有多条语句操作共享数据
- 针对以上三点,在多线程程序中1、2点没办法改变;所以只能把多条语句执行共享数据的代码给锁起来,让任意时刻只能有一条线程执行即可。