day07迭代器增强for泛型.docx
《day07迭代器增强for泛型.docx》由会员分享,可在线阅读,更多相关《day07迭代器增强for泛型.docx(13页珍藏版)》请在冰豆网上搜索。
day07迭代器增强for泛型
反馈:
***讲下split
publicString[]split("符号");//
如果符号比较特殊,用到了正则表达式中特殊含义的符号需要转译在Java中使用\\.
比如:
\\.+一个以上连续任意个.都会被匹配到
第7天_面向对象(集合)
1.集合的介绍
一个变量只能存储一个值,当出现大量的变量用来存储数据的时候
这时候我们想到数组,但是数组有问题?
数组的定长的!
!
!
!
所以我们用到了集合,而集合是变长
a.集合的特点和作用
集合最大的特点:
长度随着元素个数的增加而增加(javascript中数组是可变)
作用:
存储大量的对象
b.集合框架的由来
集合框架的根接口是Collection接口
2.集合框架**********
a.集合框架体系(见图)
3.Collection接口中定义的方法*********
记住:
只要是容器,他的方法增删改查
增加:
publicbooleanadd(Ee);返回值表示是否添加成功
删除:
publicbooleanremove(Objectobj);返回值表示是否删除成功
修改:
没有
获取:
publicintsize();长度
其他方法:
publicvoidclear();//清空集合,把集合中元素全删除,但是集合还是存在的
把集合置为null;//把整个集合丢了
publicbooleancontains(Objecto);//判断集合中是否包含某个元素
publicObject[]toArray();//把集合转成数组
publicbooleanisEmpty();//判断集合是否为空,底层size()==0
4.迭代器
迭代器属于什么类型?
Iterator类型
迭代器Iterator中常用的两个方法
PublicbooleanhashNext();//判断集合还有没有元素
Public类型Next();//读取这个元素
获取集合的迭代器对象:
Iterator<和集合一样的类型>it=集合.iterator();
遍历集合步骤:
1.创建对象集合对象(自带了一个Iterator对象)
2.获取到Iterator对象
Iteratorit=c.iterator();//面向接口编程
3.遍历集合方法:
方法一:
while(it.hashNext()){
和集合一样的类型变量名=it.next();
syso(变量名)
}
并发修改异常:
不能在迭代器遍历集合的过程中添加或者删除元素(不能做对集合长度有影响的操作)
方法二:
foreach,然后快捷键alt+/
遍历集合:
while(it.hashNext()){
和集合一样的类型变量名=it.next();
syso(变量名)
}
并发修改异常:
不能在迭代器遍历集合的过程中添加或者删除元素(不能做对集合长度有影响的操作)
例如:
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//1.创建对象集合对象(自带了一个Iterator对象)
//用多态接收
Collectionc=newArrayList();
//添加几个数据
c.add("itcast");
c.add("alibaba");
c.add("tencent");
c.add("sohu");
c.add("netease");
//2.获取到Iterator对象
Iteratorit=c.iterator();//面向接口编程
//3.a.问有没有下一个元素
while(it.hasNext()){
Strings=it.next();
System.out.println(s);
}
//4.但是如果it的hasNext返回值是false
//Stringnext=it.next();不能再取,因为集合中没有下一个元素了
}
5.并发修改异常;
/**
*使用Iterator对象遍历集合,
*如果出现”itcast”字符串,
*那么向集合中添加一个大写的”ITCAST”字符串
*
*这时候出现了一个异常:
Concurrent(并发)Modification(修改)Exception(异常)
*
*解释这个异常出现的原因:
Java规定集合在用迭代器遍历的过程中,不能添加/删除元素(不能修改和长度有关)
*
*原因:
迭代器中”记忆”的集合长度与集合中实际长度不同,而导致出现索引与实际元素不符甚至无限循环的情况发生。
*/
例如:
publicclassConcurrentModificationExceptionDemo{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//1.创建集合并且添加数据
Collectionc=newArrayList();
c.add("baidu");
c.add("itcast");
c.add("tencent");
c.add("sohu");
c.add("google");
//2.遍历集合(用迭代器)
Iteratorit=c.iterator();//迭代器就会记住集合的长度是5
while(it.hasNext()){
Stringnext=it.next();
//3.判断是不是"itcast"
if("itcast".equals(next)){
//4.向集合中添加一个"ITCAST"
c.add("ITCAST");//实际长度变了变成6了
}
}
}
5.增强for循环
增强for循环是JDK1.5出现的新特性:
作用:
专门用来快速遍历数组或者集合
格式:
for(数据类型变量:
数组/集合){
每一次循环自动从数组或者集合中取出一个元素,保存到变量中
我们只要操作这个变量即可
}
原理:
增强for循环底层的原理是迭代器,同样不能在使用增强for循环遍历过程中添加或者删除元素
缺点:
使用增强for循环是不能知道是第几个元素
增强for循环什么时候用合适:
只操作元素内容,不关心元素下标的时候
例如:
/*
*使用增强for循环遍历数组和集合
*
*for(数据类型变量:
数组/集合){
*每一次循环自动从数组或者集合中取出一个元素,保存到变量中
*我们只要操作这个变量即可
*}
*
*
*/
publicclassStrongForDemo{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
//1.遍历数组
int[]nums={1,2,34,5,6};
//2.用增强for循环遍历数组
for(intnum:
nums){
//每次循环都会从数组中取出一个元素,保存到num中
System.out.println(num);
}
//3.遍历集合
Collectionc=newArrayList();
c.add
(1);
c.add
(2);
c.add(3);
c.add(4);
//4.遍历
for(inti:
c){//自动拆装箱
//System.out.println(i);
if(i==2){
c.add(200);
}
}
//JDK1.8中一句话,lambda表达式
}
}
6.泛型的介绍
0.泛型的介绍:
什么是泛型:
泛泛的类型,是一种不确定的类型
泛型的格式:
,,,
比如;ArrayList
1.泛型的好处:
提高安全性
将运行时期的ClassCastException,转移到了编译时期变成了编译失败。
避免了类型强转的麻烦
例如:
/**
*泛型的好处:
*1.不使用泛型
*
*2.使用泛型
*
*@authoryingpeng
*
*/
publicclassGenericDemo{
publicstaticvoidmain(String[]args){
//TODOAuto-generatedmethodstub
generic();
}
//不使用泛型
publicstaticvoidnoGeneric(){
//什么叫不使用泛型,就是不写
ArrayListarr=newArrayList();
//不写泛型那么arr中可以存任何的引用类型
arr.add
(1);
arr.add("java");
arr.add(true);
arr.add(1.5F);
arr.add(1.5);
//遍历
//这时候程序就出现了安全问题
for(Objectobj:
arr){
Stringi=(String)obj;
System.out.println(i);
}
}
//使用泛型
publicstaticvoidgeneric(){
//使用泛型指的是写上<数据类型>
ArrayListarr=newArrayList();
//添加数据
arr.add("1");
arr.add("java");
arr.add("3.14");
arr.add("true");
//遍历
for(Strings:
arr){
System.out.println(s);
}
}
}
2.泛型的定义[了解]
探究:
泛型中的的含义,代表不确定的类型
泛型的本质:
它是一个变量,可以接收一种数据类型
泛型用法比较广,可以用在类上,方法上,接口上
a.泛型类:
是指泛型用在类上,比如ArrayList
泛型类上的泛型什么时候确定?
创建该类对象的时候,我们可以确定
b.泛型方法:
是指泛型用在方法上
泛型方法上的泛型什么时候确定?
调用该方法并且传入参数的时候我们可以确定
c.泛型接口:
是指泛型用在接口上,比如:
Collection
3.泛型接口上的泛型什么时候确定?
1.在实