一、单列集合:每次只能添加一个数据
双列集合:每次添加一对数据
Collection,List,Set都是接口,List和Set都继承自Collection;
Collection:单列集合的祖宗接口,是全部单列集合都可使用的
List下的类:ArrayList LinkedList
Set数据类型的特点:
无序:存和取的顺序有可能是不一样的
不重复:集合中不能存储重复的元素,可以进行数据的去重复
无索引:不能通过索引
Set下的类:HashSet,TreeSet
List:有序:存和取的顺序是一样的,只是存和取的顺序是一致的
,可重复:
,有索引:可以通过索引去获取集合中的每个元素
例子:Collection接口的方法之:add,clear,contains,remove
package com.1;
import java.util.Collection;
import java.util.ArrayList;
public class Colle{
public static void main(String []args){
Collection<String> coll = new ArrayList<>();
coll.add("aaa");
//Set系列的集合是不允许重复的
coll.add("bbb");
//clear完全清空
coll.clear();
//注意: 由于Collection里面定义的是共性的方法,所以只能指定对象去删除,因为set里面是没有索引的
coll.add("ddd");
coll.remove("ddd");
//remove()会有布尔类型的返回值,删除失败返回False,比如删除的元素不存在就会删除失败。
boolean result = coll.cotains("aaa");
System.out.printlin(result);
//此处的结果是False
coll.add("bbb");
//可以在IDE中右键然后goto implematation去看看源码,可以去看看ArrayList的contains方法,因为直接去看是Collection接口里面的抽象方法,没有具体的实现哦~
//contains方法的底层是依赖equals方法进行比较判断的,如果集合中存储的是自定义的对象,那么这样必须要重写equals方法!因为不重写就对比不成,对比的将会是地址!
System.out.printlin(coll);
}
}
二、Interator迭代器
通过iterator()方法来创建迭代对象,然后通过hasnext()来控制循环条件,用next()指向下一个元素,实现打印输出
import java.util.Collection
import java.util.ArrayList
public class Co{
public static void main(String[] args){
Collection<String> colle = new ArrayList<Stirng>;
colle.add("aaa");
colle.add("bbb");
Iterator<Stirng> iter = colle.iterator();
while(iter.hasnext()){
Stirng str = iter.next();
sout(str);
}
sout(it.next());
//这里会报错,会报没有元素异常!因为指针已经指向了没有元素的位置
//迭代器遍历完毕,指针不会复位的
sout(it.hasnext())
//这里会输出False
//如果要继续遍历集合需要获取一个新的集合
Iterator<String> it2 = colle.iterator();
while(it2.hasnext()){
Stirng str = it2.next();
sout(str);
}
}
}
注意迭代后指针不会复位的;如果要重新遍历集合需要重新再获取一个迭代器的对象
循环中只能使用一次next()方法
迭代器遍历时不能用集合的方法进行增加或者删除
循环中只能使用一次next()方法:
import java.util.Collection
import java.util.ArrayList
public class Co{
public static void main(String[] args){
Collection<String> colle = new ArrayList<Stirng>;
colle.add("aaa");
colle.add("bbb");
Iterator<Stirng> iter = colle.iterator();
while(iter.hasnext()){
Stirng str = iter.next();
sout(str);
}
三、增强for:
只有单列集合和数组才可以用;在以后的双列集合是不能用增强for来遍历的 ;
for(元素的数据类型 变量名:数组或者集合名 );它的底层就是一个迭代器。
import java.util.Collection
import java.util.ArrayList
public class Coll{
public static void main(String[] args){
Collection<Stirng> coll = new ArrayList<String>;
coll.add("zhangsan");
coll.add("lisi");
//这里的s其实就是一个第三方变量,在循环中一次表示集合中的每个数据;
for (Stirng s:coll){
//在循环中如果把s改变比如s = "qqq",
sout(s);}
//在IDE中直接用coll.for回车就可以生成
for(String s:coll){
s = "hhh";
}
sout(coll);
//这里面的coll还是原来的,因为s只是把原来的Stirng给复制了一份保存,不论怎么改变也无法影响集合原来的值。
//这里的s其实就是一个第三方变量,在循环中一次表示集合中的每个数据;
//如果在遍历的过程中改变了s的值,这里面的coll还是原来的因为s只是把原来的Stirng给复制了一份保存,不论怎么改变也无法影响集合原来的值。
for(Stirng s:coll){} //代码段A
for(int i = 0; i < myNumbers.size(); i++){
Stirng s = coll.get(i);
} //代码段B
上述代码中的代码段A和代码段B是等价的!注:其中的get(i)是ArrayList中通过索引值来访问元素的get方法。
快速生成方式:在IDE中可以直接写coll.for然后回车就可以了。
四,Collection系列集合的通用forEach:
import java.util.Collection
import java.util.ArrayList
public class Coll{
public static void main(String[] args){
Collection<Stirng> coll = new ArrayList<String>;
coll.forEach(new Consumer<String>(){
public void accept(String s){
sout(s);
}
});
}
}
依次遍历每一个元素,然后传递给accept方法。s依次表示集合中的每一个元素。
内部类知识补充:
在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。下面就先来了解一下这四种内部类的用法。
1.成员内部类可以无条件访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
2.虽然成员内部类可以无条件地访问外部类的成员,而外部类想访问成员内部类的成员却不是这么随心所欲了。在外部类中如果要访问成员内部类的成员,必须先创建一个成员内部类的对象,再通过指向这个对象的引用来访问
五、lambda表达式:
lambda表达式可以使得代码更加简洁,提供了一种把函数作为参数进行传递的方法:
其中主要的特点包括:
1.可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
2.可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号
3.可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
4.可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
菜鸟教程里的截图:
coll.forEach(s ->System.out.println(s));//遍历coll中的元素并输出打印
1.Collection是单列集合的顶层接口,所有的方法被List和Set系列集合共享
2.常见的方法:add,remove,contains,clear,isEmpty,size
3.三种通用的遍历方式:
迭代器:在遍历中需要删除元素,请使用迭代器
增强for,lambda遍历:仅仅想遍历。