底层接口Collection
上图中红色是接口,蓝色是实现类。
List系列集合:添加的元素是有序(存和取的顺序一样),可重复(集合中所存的元素可以重复),有索引(可以通过索引找集合中的元素)。
Set系列集合:添加的元素是无序,不重复,无索引。
Collection是单列集合的祖宗接口,它的功能的全部单列集合都可以继承使用的。
Collection是一个接口,我们不能直接创建他的对象。所以,我们只能创建他实现类的对象。
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("aaa");
coll.add("bbb");//添加
//如果我们要往List系列集合中添加数据,那么方法永远返回true,因为其允许元素重复
//如果往Set系列集合中添加数据,若当前添加元素不存在,返回true,表示添加成功
//若添加元素已经有了,返回false,表示添加失败。因其不允许元素重复
System.out.println(coll);
coll.remove("aaa");//删除元素“aaa”
System.out.println(coll);
coll.clear();//清空
//因为Collection里面定义的是共性的方法,所以此时不能通过索引来删除。只能通过元素的对象来删除
//方法会有一个布尔类型的返回值,删除成功返回true,否则返回false
//如果要删除的元素不存在,就会删除失败
System.out.println(coll);
boolean result = coll.contains("bbb");//判断元素bbb是否存在与coll集合中
//底层是依赖equals方法进行判断是否存在的
//如果集合中存储的是自定义的对象,也想通过contains方法判断,那么在Javabean类中一定要重写equals方法
System.out.println(result);
boolean result2=coll.isEmpty();//判断是否为空
System.out.println(result2);
int size=coll.size();//获取集合长度
System.out.println(size);
}
运行后:
Collection的遍历方法
一、迭代器遍历
迭代器遍历集合时不依赖索引。
迭代器在Java中的类是lterator,迭代器是集合专用的遍历方式。
获取迭代器:Iterator<E> iterator( ) 返回迭代器对象,默认指向当前集合的0索引
Iterator中常用的方法:boolean hasNext()判断当前位置是否有元素,有返回true,没有返回false。E next()获取当前位置元素,并将迭代器对象移向下一个位置。
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//获取迭代器对象
Iterator<String> it=coll.iterator();
while(it.hasNext()){
//next方法的两件事情:获取元素和移动指针
String str=it.next();//不依赖索引
System.out.println(str);
}
}
注意细节:
1.报错NoSuchElementException(当前位置没有元素了)
2.迭代器遍历完毕,指针不会复位
3.循环中只能用一次next方法(多次使用可先用一个变量存储,之后用变量表示元素)
4.迭代器遍历时,不能用集合的方法进行增强或者删除
关于细节第三点:
当输入为元素为偶数个时,不会报错,但为奇数个时,会报NoSuchElementException的错误。
偶数个元素:
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
//获取迭代器对象
Iterator<String> it=coll.iterator();
while(it.hasNext()){
System.out.println(it.next());
System.out.println(it.next());
}
}
奇数个元素:
public static void main(String[] args) {
Collection<String> coll=new ArrayList<>();
coll.add("aaa");
coll.add("bbb");
coll.add("ccc");
coll.add("ddd");
coll.add("eee");
//获取迭代器对象
Iterator<String> it=coll.iterator();
while(it.hasNext()){
System.out.println(it.next());//这个读取的元素有:aaa,ccc,eee
System.out.println(it.next());//这个读取的元素有:bbb,ddd
//执行最后一行代码时,指针会指向最后一个元素的下一位,其位置没有元素,所有返回NoSuchElementException错误
}
}
二、增强for遍历
增强for遍历的底层就是迭代器,为了简化迭代器的代码书写的
所有的单列集合和数组才能用增强for进行遍历
格式:
for(元素的数据类型 变量名:数组或集合){
}
public static void main(String[] args) {
//创建集合并添加元素
Collection<String> coll=new ArrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//利用增强for进行遍历
//注意:s就是一个第三方变量,在循环的过程中依次表示集合中的一个数据
for (String s : coll) {
System.out.println(s);
}//快捷键:输入coll.for后按回车
}
三、Lambda表达式遍历
public static void main(String[] args) {
//创建集合并添加元素
Collection<String> coll=new ArrayList<>();
coll.add("zhangsan");
coll.add("lisi");
coll.add("wangwu");
//利用匿名内部类的形式
//底层原理:也会自己遍历集合,依次得到每一个元素
//把得到的每一个元素传递给下面的accept方法
coll.forEach(new Consumer<String>() {
@Override
//s依次表示集合中的每一个数据
public void accept(String s) {
System.out.println(s);
}
});
System.out.println(" ");
//lambda表达式
coll.forEach(s-> System.out.println(s));
}
List集合
Collection的方法List都继承了
List集合因为有索引,所有多了很多索引操作的方法
public static void main(String[] args) {
//创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
//在指定位置插入指定元素,原来索引上的元素会依次往后移
// list.add(1,"qqq");
// System.out.println(list);//[aaa,qqq,bbb,ccc]
//删除指定索引处的元素,返回被删除元素
// String remove=list.remove(0);
// System.out.println(remove);//aaa
// System.out.println(list);//[bbb,ccc]
//修改指定索引处的元素,返回被修改的元素
// String res=list.set(0,"yyy");
// System.out.println(res);//aaa
// System.out.println(list);//[yyy,bbb,ccc]
//返回索引处的元素
String s=list.get(0);
System.out.println(s);//aaa
}
遍历方式(五种)
1.迭代器遍历:在遍历过程中需要删除元素,请使用迭代器
2.增强for
3.Lambda表达式
以上三种遍历方式和Collection的用法相同。
4.普通for循环:需要有索引
public static void main(String[] args) {
//创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for(int i=0;i<list.size();i++){
String s=list.get(i);
System.out.println(s);
}
}
5.列表迭代器:List集合中独有的。在遍历过程中需要添加元素,使用列表迭代器
public static void main(String[] args) {
//创建集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
ListIterator<String> it=list.listIterator();
while(it.hasNext()){
String s=it.next();
System.out.println(s);
}
}