mysql5资源共享

 找回密码
 立即注册
查看: 36|回复: 1

[MS-SQL Server] 【基础】iterator接口/泛型/装箱与拆箱/List去重

[复制链接]

4

主题

4

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2019-7-18 19:52:51 | 显示全部楼层 |阅读模式
本章目标: 1.iterator接口 2.泛型 3.装箱、拆箱 4.List集合去重问题 =========================================== 1.Iterator接口 Iterator接口是Java集合框架的成员,主要用于遍历集合的元素(又叫迭代器)。 hasNext() 如果被迭代的集合元素还有没遍历,则返回true next() 返回集合里的下一个元素 remove() 删除集合里上一次next方法返回的元素 原理: 当使用Iterator对集合元素进行迭代时,Iterator并不是把集合元素传给了迭代变量,而是把集合元素的值传给了迭代变量,所以修改迭代变量的值对集合元素本事没有影响。 当使用Iterator来迭代访问Collection集合元素时,Collection集合里的元素不能被修改,只能通过remove方法删除上次next方法返回的集合元素才可以,否则报java.util.ConcurrentModificationException异常(并发修改异常)。 2.泛型 示例: Listlist=newArrayList(); //这是未引入参数化类型时的写法,list集合中可以存储不同类型的元素,如此便有了安全隐患,编译器不能保证你取值时的转型(拆箱)一定正确。 list.add("qqyumidi"); list.add("corn"); list.add(100); list.add(true); for(inti=0;i{ publicTexecute(); } 2.2.2未传入泛型实参时: //与泛型类的定义相同,在声明类的时候,需将泛型的声明也一起加到类中 publicclassUserActionimplementsAction{ @Override publicTexecute(){ returnnull; } } 如果不声明泛型,编译器会报"Unknownclass"异常。 publicclassUserActionimplementsAction[U]{ @Override publicUserexecute(){ returnnull; } } 2.2.2传入泛型实参时 定义一个类实现这个接口,虽然我们只创建了一个泛型接口Action 但是我们可以为T传入无数个实参,形成无数种类型的Action接口。 在实现类实现泛型接口时,如已将泛型类型传入实参类型,则所有使用泛型的地方都要替换成传入的实参类型 //传入泛型实参为String时 publicclassUserActionimplementsAction{ privateString[]strArr={"Apple","Banana","Pear"}; @Override publicStringexecute(){ Randomrand=newRandom(); returnstrArr[rand.nextInt(3)]; } } //传入泛型实参为Integer时 publicclassUserActionimplementsAction[I]{ privateint[]intArr={1,2,3,4,5,6}; @Override publicIntegerexecute(){ Randomrand=newRandom(); returnintArr[rand.nextInt(3)]; } } 2.3泛型类 class类名称{ private泛型标识/*(成员变量类型)*/var; ..... } 示例:创建时为类设置泛型,在实例化泛型类时,必须指定T的具体类型 publicclassAction{ privateTkey;//key的类型为T,而T的类型由外部指定 publicAction(Tkey){//构造方法key的类型也为T,T的类型由外部指定 this.key=key; } publicTgetKey(){///getKey()的返回值类型为T,T的类型由外部指定 returnkey; } } //泛型的类型参数只能是引用类型(包括自定义类),不能是值类型。 //传入的实参类型需与泛型的类型参数类型相同,即为Integer. Action[I]integerAction=newAction[I](123456); //传入的实参类型需与泛型的类型参数类型相同,即为String. ActionstringAction=newAction("key_vlaue"); System.out.println("泛型测试","keyis"+integerAction.getKey()); System.out.println("泛型测试","keyis"+stringAction.getKey()); 2.4泛型方法 //首先在public与返回值之间的必不可少,这表明这是一个泛型方法,并且声明了一个泛型T publicTshowKeyName(Actionaction){ System.out.println("Actionkey:"+action.getKey()); //当然这个例子举的不太合适,只是为了说明泛型方法的特性。 Ttest=action.getKey(); returntest; } 2.5泛型通配符? publicclassTest{ publicstaticvoidmain(String[]args){ Listname=newArrayList(); List[I]age=newArrayList[I](); Listnumber=newArrayList(); name.add("icon"); age.add(18); number.add(314); //这里传入的参数类型即有String、Int… getData(name); getData(age); getData(number); } //此处"?"是类型实参,而不是类型形参 //可以把"?"看成所有类型的父类。是一种真实的类型 publicstaticvoidgetData(Listdata){ System.out.println("data:"+data.get(0)); } } 2.6.总结 (1)泛型的默认值是Object。 (2)泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。 (3)泛型的好处: a.类型安全 b.消除强制类型转换 c.提高性能。 3.装箱与拆箱 值类型->引用类型=装箱 Integera=newInteger(1); 引用类型->值类型=拆箱 Integerb=a+10; jdk1.5之后引入了自动装箱及自动拆箱功能 4.List集合去重问题 4.1循环list中的所有元素然后删除重复 publicstaticListremoveDuplicate(Listlist){ for(inti=0;ii;j--){ if(list.get(j).equals(list.get(i))){ list.remove(j); } } } returnlist; } 4.2通过HashSet踢除重复元素 publicstaticListremoveDuplicate(Listlist){ HashSeth=newHashSet(list); list.clear(); list.addAll(h); returnlist; } 4.3把list里的对象遍历一遍,用list.contain(),如果不存在就放入到另外一个list集合中 publicstaticListremoveDuplicate(Listlist){ ListlistTemp=newArrayList(); for(inti=0;i
回复

使用道具 举报

37

主题

1740

帖子

3557

积分

论坛元老

Rank: 8Rank: 8

积分
3557
发表于 2019-7-18 21:28:58 | 显示全部楼层
建议发到博客,
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|mysql5.com Inc. ( 闽ICP备17002856号-1 )

GMT+8, 2019-12-7 03:15 , Processed in 0.080558 second(s), 18 queries .

Powered by MySQL5.com X3.4

© 2003-2019 MySQL5.com.

快速回复 返回顶部 返回列表