超牛牪犇Java之泛型

泛型:

标识着集合中保存的元素是什么类型

写法:<泛型(类型)>

ArrayList<String>

好处:

1.操作数据更加安全(规范集合中 能保存的数据)

2.可以避免向下转型(强转类型)的麻烦

3.将运行时的错误 转到编译时报错

example:

泛型写的时候 前后类型要一致

ArrayList<String> list  = new ArrayList<String>();

(JDK1.7之后有菱形泛型 后面的类型可以省去)

ArrayList<String> list  = new ArrayList<>();

遍历集合

ListIterator<String> listIterator = list.listIterator();

正向遍历:

while (listIterator.hasNext()) {
	//获取集合中的元素
	String string = listIterator.next();
	System.out.println(string);
}

逆向遍历:

//判断前一个是否有元素
while (listIterator.hasPrevious()) {
	String preivous = listIterator.previous();
	System.out.println(preivous);
}

注意:当只进行逆向遍历时 会无法打印内容 因为默认有个指针在最前面的位置 逆向遍历是从后面开始指针无法移动

不加泛型 在集合中保存三个学生:

ArrayList list = new ArrayList();
list.add(new Student("张三",11));
list.add(new Student("李四",12));
list.add(new Student("王五",13));

从集合中取出一个元素 强转成工人类型, 并调用工人的工作方法:

Object object2 = list.get(1);
Worker worker = (Worker)object2;
worker.work();

编译不会报错,但此时运行会报错:


不加泛型 获取到集合中的匀速 元素类型可以随便强转 没有约束 编译都会通过

加上泛型 在编译时就会有错误提示 可以让集合中保存的元素 更加安全


example:

int[] array = {1,2,3,4,5};
List<int[]> list = Arrays.asList(array);
System.out.println(list);

结果:

原因 直接传入int[] 系统不会帮你进行自动装箱 ,这个集合中的每一个元素都是数组

Integer[] newArray = {1,2,3,4,5};
//直接把数组中的元素 放入了集合中
List<Integer> newList = Arrays.asList(newArray);
System.out.println(newList);

结果:

第二种泛型:

写法:

? extends E

问号是子类 E是父类

只能使用父类的子类 或 本类(也叫向下限定)

example:

//创建一个person集合 保存两个person 
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("wang1",1));
list1.add(new Person("wang2",2));
//创建一个student集合 保存两个student
ArrayList<Student> list2 = new ArrayList<>();
list2.add(new Student("peng1",1));
list2.add(new Student("peng2",2));
//addAll(Collection<Student extends Person> c) 
list1.addAll(list2);
System.out.println(list1);

循环删除:

//创建一个集合保存abcd
//如果有b就把b删了(使用循环)
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("d");
for (int i = 0; i < list.size(); i++) {
	if (list.get(i).equals("b")) {
        //因为删除之后长度会减少 后面的会向前补位 
	//所以删除后要退回下标 不然会跳过下一个
	list.remove(i--);
	}
}
System.out.println(list);
迭代器遍历时 要用迭代器类中的删除方法(避免出现并发修改异常)

多参数的参数:

int .. num 这个参数 可以看成是一个数组

可以当做数组来遍历

使用方式有两个:

1.直接传一个数组

2.可以传多个数 用逗号分开

注意:多个参数时 最好把多参数放到最后

public static void fun4(int a ,int ... num) {
	for (int i = 0; i < num.length; i++) {
		System.out.println(num[i]);
	}
}

添加一个元素

UnsupportedOperationException

不支持的操作异常

使用asList方法 将数组转化成集合

注意:不能对集合的长度发生改变(不能增删)

转化成集合后 可以调用集合中其他方法






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值