一、泛型的基本介绍
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不一样。将类型参数化以达到代码复用提高软件开发工作效率的一种数据类型。泛型类是引用类型,是堆对象,主要是引入了类型参数这个概念。
二、list的非泛型操作(没有指定类型的list)(不常用)
在没有指定类型的情况下,list默认的类型为Object类型
首先,我们看下下面这段简短的代码:
public class GenericTest {
public static void main(String[] args) {
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
for (int i = 0; i < list.size(); i++) {
String name = (String) list.get(i); // 1
System.out.println("name:" + name);
}
}
}
定义了一个List类型的集合,先向其中加入了两个字符串类型的值,随后加入一个Integer类型的值。在之后的循环中,由于忘记了之前在list中也加入了Integer类型的值或其他编码原因,很容易出现类似于//1中的错误。因为编译阶段正常,而运行时会出现“java.lang.ClassCastException”异常。因此,导致此类错误编码过程中不易发现。
在如上的编码过程中,我们发现主要存在两个问题:
1.当我们将一个对象放入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,改对象的编译类型变成了Object类型,但其运行时类型任然为其本身类型。
2.因此,//1处取出集合元素时需要人为的强制类型转化到具体的目标类型,且很容易出现“java.lang.ClassCastException”异常。
那么有没有什么办法可以使集合能够记住集合内元素各类型,且能够达到只要编译时不出现问题,运行时就不会出现“java.lang.ClassCastException”异常呢?答案就是使用我们接下来要讲的list泛型操作,这也是最常用的操作。
三、list的泛型操作(重点常用)
1. list泛型的基本理解
与上述非泛型对比采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。
public class GenericTest {
public static void main(String[] args) {
/*
List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
*/
List<String> list = new ArrayList<String>();
list.add("qqyumidi");
list.add("corn");
//list.add(100); // 1 提示编译错误
for (int i = 0; i < list.size(); i++) {
String name = list.get(i); // 2
System.out.println("name:" + name);
}
}
}
2 list泛型的具体操作
(1).list中添加,获取,删除元素;
添加方法是:.add(e); 获取方法是:.get(index); 删除方法是:.remove(index); 按照索引删除; .remove(Object o); 按照元素内容删除;
List<String> person=new ArrayList<>();
person.add("jackie");
person.add("peter");
person.add("annie");
person.add("martin");
person.add("marry");
person.remove(3); //.remove(index)
person.remove("marry"); //.remove(Object o)
String per="";
per=person.get(1);
System.out.println(per);
for (int i = 0; i < person.size(); i++) {
System.out.println(person.get(i));
}
(2).list中根据索引将元素数值改变(替换);
注意 .set(index, element); 和 .add(index, element); 的不同;
String a="白龙马", b="沙和尚", c="八戒", d="唐僧", e="悟空";
List<String> people=new ArrayList<>();
people.add(a);
people.add(b);
people.add(c);
people.set(0,d); //.set(index,element);
people.add(1,e); //.add(index,element)
//增强for循环遍历list
for(String str:people){
System.out.println(str);
}
(3).判断list是否为空;
//空则返回true,非空则返回false
if (person.isEmpty()) {
System.out.println("空的");
}else {
System.out.println("不是空的");
}
3 遍历List集合的三种方法
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
(1)超级for循环遍历
for(String attribute : list) {
System.out.println(attribute);
}
(2)对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
for(int i = 0 ; i < list.size() ; i++) {
system.out.println(list.get(i));
}
(3)集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代
Iterator it = list.iterator();
while(it.hasNext()) {
System.ou.println(it.next);
}
四、java中List集合使用泛型与不使用泛型有什么区别?
例如:List lists=new ArrayList();和List lists=new ArrayList();他们两者有什么样区别?
从list中取出的值不一样,第一种的话取出来是object类型的,需要强制类型转换,而第二个不用,取出来之后直接就是string类型的
以上就是list的具体操作,下一篇文章会给你讲list的练习题
(你的每个点赞和评论,都将是博主前进的动力)
参考文章:
https://www.cnblogs.com/lwbqqyumidi/p/3837629.html
https://www.cnblogs.com/duzhuo/p/5648026.html
https://www.cnblogs.com/lzq198754/p/5774593.html