泛型、静态导入、可变参数、增强for()循环、自动拆装箱
一、泛型
1、概述:将原来具体的类型参数化,将数据类型(只能是引用数据类型)作为一种参数传递,提高代码的安全性;
2、格式:<数据类型>
3、位置: 1)数组、集合在创建对象的时候
ArrayList<String> al = new ArrayList<String>(); //后面的String叫作泛型推断
ArrayList集合使用泛型<String>限定后则该集合就只能存储String类型的元素,否则就会报错
2)泛型定义在类、接口上
public class ObjectDemo<T>{ //在类中就可以把T 当做Ojbect类型来使用
private T t;
public T get(){
return t;
}
}
3)泛型定义在方法上
public <T> void show(T t){ //相当与需要传入的参数是Object类型的
System.out.println(t);
}
4、通配符
<?> 代表任意数据类型:可以是Object类型以及Java类
<? extends E> 向下限定,要么跟当前类型一样,要么是它的子类
<? super E> 向上限定,保持当前类型一致,或者是他的父类
一般用在方法的参数中:
5、作用
1)将运行时期的异常提前到了编译期间
2)不用再强制类型转换
3)解决了一个黄色警告线的问题
egg:
二、增强for()循环 ———— 用于遍历数组、集合
1、格式
for(数据类型 名称 :需要遍历的集合或者数组名){
System.out.println(名称); //相当于循环了 集合.size() 多次,每次打印一个元素
}
2、注意事项
增强for()循环如同集合的迭代器遍历方法,不能在循环内用集合的方法修改集合内的元素,否则就会报java.util.ConcurrentModificationException异常
egg: //集合内如有bb就给集合添加元素dd
public class ForDemo {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("aa");
al.add("bb");
al.add("cc");
for(String s : al){
if(s.equals("bb")){
al.add("dd"); //错误的写法
}
}
}
}
3、嵌套遍历
格式: ArrayList<ArrayList<String>> al = new ArrayList<ArrayList<String>>();
for(ArrayList arr : al){
for(String s : arr){
}
}
egg:
三、自动拆装箱
1、概述:基本数据类型与其包装类之间的自动相互转换,无需强制转型;
装箱:就是自动将原始类型值转换成对应的对象;
拆箱:将基本数据类型的对象自转换成基本数据类型;
2、基本数据类型与其对应的包装类
byte--------->Byte
short------->Short
int--------->Integer
long-------->Long
float------->Float
double------>Double
boolean----->Boolean
char-------->Character
3、优缺点
优点:降低代码量,方便使用
弊端:有可能会影响程序的性能
egg: Integer num = 0;
for(int i = 0;i < 1000;i++){
num += i;
}
在这里,num每次循环进去时候是Integer类型,num += i;时候自动拆箱成int类型,出循环再自动装箱成Integer类型,在庞大的循环中会大大的降低程序的性能,生成无用对象增加GC压力;
所以,在使用中尽量避免。
四、静态导入
1、概述一个类中只要有静态方法就能使用静态导入,使其静态方法在本类中直接可见
2、格式:import static java.包名.类名.方法;
egg: import static java.lang.Math.random; //静态导入Math类中的random()方法;
import static java.lang.Math.*; //静态导入Math类中的所有静态方法;
3、使用:直接使用方法名调用
egg: import static java.lang.Math.*;
public class MathDemo {
public static void main(String[] args) {
random();
abs(-1);
pow(3, 2);
sqrt(4);
}
}
4、注意事项:
1)如果要使用静态导入,为了防止在一个类中出现同名的方法,那么调用的时候需要前缀来区别开来;
2)过度的使用静态导入会使代码的可读性降低。
五、可变参数
1、概述:参数类型相同,个数不确定时,将其看作一个数组处理————可变参数
2、格式:修饰符 返回值类型 方法名(参数类型...变量名){}
egg: public static int add(int ... x){ //这里的 int...x 相当与一个暂时不知道长度的数组 int[]x;
int num = 0; //在使用add()方法时候,添加几个参数,数组长度就是多少;
for(int i = 0; i < x.length;i++){
num += x[i];
}
return num;
}
3、特点
1)如果方法中有多个参数,那么可变参数必须在最后一个;
2)可变参数在实际传参的时候就知道到底有多少个了;
3)在使用时,相当与创建了一个数组,可使用循环遍历,如上egg。