当前位置: 首页 > 后端技术 > Java

Java泛型与迭代器

时间:2023-04-01 22:38:34 Java

泛型1.为什么要用泛型?在泛型诞生之前,我们经常会遇到这样的问题,如下代码所示:ArrayListarrayList=newArrayList();arrayList.add("Java");arrayList.add(24);for(inti=0;iarrayList=newArrayList();arrayList.add("Java");此时如果向arrayList中添加非String类型的元素,编译器会报错,提醒开发人员Person插入相同类型的元素。报错信息如下图所示:这样一开始的例子就可以避免在程序运行过程中类型不一致导致报错的问题。3、泛型的优势泛型的优势主要体现在以下三个方面。安全性:不用担心程序运行过程中的类型转换错误。避免类型转换:如果是非泛型,获取的元素是Object类型,需要进行类型转换。高可读性:在编码阶段就清楚知道集合中元素的类型。迭代器(Iterator)1.为什么要使用迭代器?我们回想一下,在迭代器(Iterator)没有出现之前,如果要遍历数组和集合,就需要使用方法。数组遍历,代码如下:String[]arr=newString[]{"Java","Java虚拟机","Java中文社区"};for(inti=0;ilist=newArrayList(){{add("Java");add("Java虚拟机");add("Java中文社区");}};for(inti=0;ilist=newArrayList(){{add("Java");add("Java虚拟机");add("Java中文社区");}};Iteratoriterator=list.iterator();//遍历while(iterator.hasNext()){Stringstr=(String)iterator.next();if(str.equals("Java中文社区")){iterator.remove();}}System.out.println(列表);程序执行结果:[Java,Java虚拟机]forEachRemaining使用如下:Listlist=newArrayList(){{add("Java");add("Java虚拟机");add("Java中文社区");}};//forEachRemaining使用list.iterator().forEachRemaining(item->System.out.println(item));相关采访问题1.为什么迭代器的next()返回的是Object类型?答:因为迭代器不需要关注容器的内部细节,next()通过返回Object类型可以接收任何类型的对象。2、HashMap有几种遍历方法?答:HashMap的遍历分为以下四种方式。方法一:entrySet遍历方法二:迭代器遍历方法三:遍历所有key和value方法四:通过key值遍历上述方法代码实现如下:MaphashMap=newHashMap();hashMap.put("name","subsistent");hashMap.put("sex","guess");//方法一:遍历entrySetfor(Map.Entryitem:hashMap.entrySet()){System.out.println(item.getKey()+":"+item.getValue());}//方法二:迭代器遍历Iterator>iterator=hashMap.entrySet().iterator();while(iterator.hasNext()){Map.Entryentry=iterator.next();System.out.println(entry.getKey()+":"+entry.getValue());}//方法三:遍历所有key和valuefor(Objectk:hashMap.keySet()){//循环所有keySystem.out.println(k);}for(Objectv:hashMap.values()){//循环所有的值System.out.println(v);}//方法四:遍历key值for(Objectk:hashMap.keySet()){System.out.println(k+":"+hashMap.get(k));}3.以下关于泛型的说法错误的是?A:泛型可以修改类B:泛型可以修改方法C:泛型不能修改接口D:以上说法都不对答案:选择C、泛型可以修饰类、方法、接口和变量。例如:`publicinterfaceIterable{}`4.下面程序执行的结果是什么?Listlist=newArrayList<>();Listlist2=newArrayList<>();System.out.println(list.getClass()==list2.getClass());答:程序执行结果为真。题目分析:Java中泛型会在编译时进行类型擦除,所以Listlist和Listlist2经过类型擦除后的结果都是java.util.ArrayLis,然后是list.getClass()==list2.getClass()的结果也必须为真。5.List和List有什么区别?答:List可以容纳任何类型,但是List赋值后,不允许进行添加和修改操作;List和List的区别在于赋值后可以修改Add和modify操作,如下图:6.List可以赋值给List吗?答:不会,编译器会报错,如下图:7.List和List有什么区别?答:List和List都可以存储任何类型的数据,但是List和List的唯一区别是List不会触发编译器的类型安全检查,比如将List赋值给List.有问题,但是给List赋值不行,如下图:8.下面程序执行的结果是什么?Listlist=newArrayList<>();list.add("Java");list.add("Java虚拟机");list.add("Java中文社区");Iteratoriterator=list.iterator();while(iterator.hasNext()){Stringstr=(String)iterator.next();if(str.equals("Java中文社区")){iterator.remove();}}while(iterator.hasNext()){System.out.println(iterator.next());}System.out.println("Over");答:程序打印结果Over。题目分析:因为第一次while循环后,iterator.hasNext()的返回值为false,所以不会进入第二次循环,然后打印最后的Over。9、泛型的工作原理是什么?为什么会有类型擦除?答:泛型是通过类型擦除实现的。类型擦除是指编译器在编译时会擦除所有与类型相关的信息。比如List编译后会变成List类型。这样做的目的是确保与Java5之前的版本(二进制类库)的兼容性。总结通过这篇文章,我们知道了泛型的优点:安全、避免类型转换、提高代码的可读性。泛型的本质是类型参数化,但是在编译之后会进行类型擦除,这样可以兼容Java5之前的二进制类库。本文也介绍了迭代器的使用。使用迭代器的好处是不需要关注容器内部的细节,用同样的方式遍历不同类型的容器。