概述
集合类体系结构:
集合 | 接口 | |||||
Collection(单列) | Map(双列) | |||||
List(元素可重复) | Set(元素不可重复) | |||||
ArrayList | LinkedList | HashSet | TreeSet | HashMap | TreeMap | 实现类 |
Collection由List和Set继承,但由于三者都是接口,接口无法创建对象,所以必须使用多态,且符合多态前提条件
注意:不管是继承还是实现,左边的类中有什么方法,只能调用什么方法
public class M12 {
public static void main(String[] args) {
//不管是继承还是实现,左边有什么方法,只能调用什么方法
S s = new B();
s.s();
A a = new B();
a.a();
a.s();
C c =new B();
c.c();
D d =new B();
d.d();
d.c();
}
}
interface S {
void s();
}
interface A extends S {
void a();
}
class C {
void c(){
System.out.println("我是c");
}
}
class D extends C{
void d(){
System.out.println("我是d");
}
}
class B extends D implements A{
@Override
public void s() {
System.out.println("我是s的接口重写");
}
@Override
public void a() {
System.out.println("我是a的接口重写");
}
}
Collection成员方法:
boolean add(E e ) | 添加元素 |
boolean remove( Object o ) | 从集合中移除指定的元素 |
boolean removeif ( Object o ) | 根据条件进行删除(会进行遍历) |
void clear ( ) | 清空集合 |
boolean contains ( Object o ) | 判断集合中是否存在指定的元素 |
boolean isEmpty ( ) | 判断集合是否为空 |
int size ( ) | 集合长度,也就是集合中元素的个数 |
创建对象:Collection<String> s = new ArrayList();
调用方法:
s.removeif ( (String a) -> { return a.length() == 3 });
removeif底层会遍历集合,得到集合中的每一个元素
a依次表示集合中的每一个元素
就会把这每一个元素都到lambda表达式中去
如果返回的是true,则删除
如果返回的是false,则保留
Collection集合的遍历:
Iterator:迭代器,集合的专用遍历方式
Iterator<E> iterator() :返回集合中的迭代器对象,该迭代器对象默认指向当前集合的0索引
即哪个集合调用迭代器Iterator,该迭代器就会指向调用它的集合的0索引
成员方法:
boolean hasNext() | 判断当前位置是否有元素可以被取出 |
E next() | 获取当前位置元素, 并将迭代器对象移向下一个索引位置 |
注意事项:
public static void main(String[] args) { Collection<String> s = new ArrayList(); s.add("a"); s.add("b"); s.add("b"); s.add("b"); s.add("c"); s.add("d"); Iterator<String> it = s.iterator(); while (it.hasNext()) { String next = it.next(); /*if (next.equals("b")){ it.remove(); }*/ s.removeIf(n -> "b".equals(n)); } System.out.println(s); } }
此处报错:ConcurrentModificationException
原因:
s是集合对象,调用Iterator,生成it,it也是一个集合,但在被next()调用的过程中,it的元素和位置不能有变动,若有变动会抛ConcurrentModificationException
此处原因为 hasNext()和 next()配合本身就是遍历了,removeIf()本身也是遍历,且还包含删除,修改了s,因此报错
另外一个需要注意的异常是,NoSuchElementException,这个是超出索引范围,若next()的指针指完了所有的索引,下一个就是空了,此时必然报错,即报NoSuchElementException。所以由此可知为什么需要用hasNext()去配合使用了,当有元素的时候hasNext()会返回true,反之返回false,就可以使用while进行判断使用。
ConcurrentModificationException异常来自于ArrayList中(查api)
NoSuchElementException异常来自于Next()这个方法底层中(查api)
什么是ConcurrentModificationException?在哪些场景下会报该异常?http://t.csdn.cn/T1NRY
注意:Iterator和Iterable 是不一样的!!!!一个是子类一个是接口,ator是able的子类
增强for循环:
作用:简化数组和Collection集合的遍历
使用前提:
1.他是JDK5之后出现的,其内部原理是一个Iterator迭代器
2.实现Iterable接口的类才可以使用迭代器和增强for
public interface Collection<E> extends Iterable<E>
Collection继承了Iterable接口,可以使用增强for
public interface Map<K,V>
而Map没有继承Iterable,无法使用增强for
格式:
for(String s :list){
sout(s);
}
String为元素类型,s为每一个变量,list为数组或集合,代码块内可以对变量s进行使用
注意:
增强for修改集合的元素是修改不了的 例:{s = "q";}
原因:
for(String s :list){}-----------String中的s,是第三方变量,即新开辟的空间,指针原理和iterator一样,默认指向0索引,当0索引有值,就返回元素,元素被赋值给第三方s,然后指针指向下一个索引,此时第三方s,被代码块内的"q"赋值,此时修改的只是第三方变量,并未修改集合里的变量(元素)。若在for内打印s输出的都会是q,for外输出list集合,集合内容是不变的
快捷键:集合或数组名.for
总结:
在此之前一共学习了3种遍历方式:普通for、迭代器Iterator、增强for
1.如果需要操作索引,使用普通for循环
2.如果在遍历的过程中需要删除元素,请使用迭代器
3.如果仅仅想遍历,那么使用增强for
最后
以上就是健壮机器猫为你收集整理的集合的进阶,Collection、Iterator迭代器、增强for的全部内容,希望文章能够帮你解决集合的进阶,Collection、Iterator迭代器、增强for所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复