集合进阶
集合是一种容器,用来装数据的,类似于数组,但集合的大小可变,开发中也非常常用
集合体系结构
集合主要分为两类,一个是单列集合(Collection),一个是双列集合(Map)
- Collection代表单列集合,每个元素(数据)只包含一个值
-Ensp;Map代表双列集合,每个元素包含两个值(键值对)
Collection集合特点
List系列集合: 添加的元素是有序、可重复、有索引的
ArrayList、LinkedList:有序、可重复、有索引
Set系列集合: 添加的元素是无序、不重复、无索引的
HashSet:无序、不重复、无索引
LinkedHashSet:有序、不重复、无索引
TreeSet:按照大小默认升序排序、不重复、无索引
public class CollectionTest1 {
public static void main(String[] args) {
//有序、可重复、有索引
ArrayList<String> list = new ArrayList<>();
list.add("java");
list.add("java");
list.add("java2");
list.add("java3");
//[java, java, java2, java3]
System.out.println(list);
System.out.println(list.get(0));
System.out.println("----------------");
//无序、不重复、无索引
HashSet<String> set = new HashSet<>();
set.add("java1");
set.add("java1");
set.add("java2");
set.add("java2");
set.add("java3");
//[java3, java2, java1]
System.out.println(set);
System.out.println("----------------");
//有序、不重复、无索引
LinkedHashSet<String> link = new LinkedHashSet<>();
link.add("java3");
link.add("java3");
link.add("java1");
link.add("java2");
link.add("java1");
//[java3, java1, java2]
System.out.println(link);
System.out.println("------------------");
//按照大小默认升序排序、不重复、无索引
TreeSet<String> TSet = new TreeSet<>();
TSet.add("python");
TSet.add("python");
TSet.add("python1");
TSet.add("python3");
TSet.add("python2");
TSet.add("python4");
//[python, python1, python2, python3, python4]
System.out.println(TSet);
}
}
Collection常用方法
方法名 | 说明 |
---|---|
public boolean add(E e) | 添加元素,添加成功返回true |
public void clear() | 清空集合的元素 |
public boolean isEmpty() | 判断集合是否为空,为空则返回true,否则返回false |
public int size() | 获取集合的大小 |
public boolean contains(Object obj) | 判断集合中是否包含某个元素 |
publi boolean remove(E e) | 删除某个元素:如果有多个重复元素则默认删除前面的第一个 |
public Object[] toArray() | 把集合转换成数组 |
案例演示
public class CollectionTest2 {
public static void main(String[] args) {
//多态
Collection<String> clt = new ArrayList<>();
//public boolean add(E e):添加元素,添加成功返回true
clt.add("Message");
clt.add("Message3");
clt.add("Message3");
clt.add("Message1");
clt.add("Message2");
//[Message, Message3, Message3, Message1, Message2]
System.out.println(clt);
//public void clear():清空集合的元素
// clt.clear();
//[]
// System.out.println(clt);
//public boolean isEmpty():判断集合是否为空,为空返回true,否则返回false
//false
System.out.println(clt.isEmpty());
//public int size():获取集合的大小
//5
System.out.println(clt.size());
//public boolean contains(Object obj):判断集合中是否包含某元素
//true
System.out.println(clt.contains("Message1"));
//public boolean remove(E e):删除某个元素,如果有多个重复元素则默认删除前面的第一个
clt.remove("Message3");
//[Message, Message3, Message1, Message2]
System.out.println(clt);
//public Object[] toArray():把集合转换成数组
//返回类型是Object
Object[] obj = clt.toArray();
//[Message, Message3, Message1, Message2]
System.out.println(Arrays.toString(obj));
}
}
迭代器
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器的代表是Iterator
Collection集合获取迭代器的方法
方法名 | 说明 |
---|---|
Iterator<E> iterator() | 返回集合中的迭代器对象,该迭代器对象默认指向当前集合的第一个元素 |
Iterator迭代器中的常用方法
方法名称 | 说明 |
---|---|
boolean hasNext() | 询问当前位置是否有元素存在,存在返回true,不存在返回false |
E next() | 获取当前位置的元素,并同时将迭代器对象指向下一个元素处 |
案例演示
public class CollectionTest3 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("贾宝玉");
c.add("林黛玉");
c.add("薛宝钗");
c.add("王熙凤");
//[贾宝玉, 林黛玉, 薛宝钗, 王熙凤]
System.out.println(c);
Iterator<String> it = c.iterator();
while (it.hasNext()) {
String str = it.next();
System.out.println(str);
}
}
}
增强for循环
for (元素数据类型 变量名 : 数组或集合) {
}
- 增强for循环可以用来遍历集合或数组
- 增强for循环遍历集合,本质上就是迭代器遍历集合的简化血法
增强for循环演示
public class CollectionTest3 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("贾宝玉");
c.add("林黛玉");
c.add("薛宝钗");
c.add("王熙凤");
//[贾宝玉, 林黛玉, 薛宝钗, 王熙凤]
System.out.println(c);
Iterator<String> it = c.iterator();
for (String str : c) {
System.out.println(str);
}
}
}
Lambda表达式遍历集合
得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的方式来遍历集合
需要使用Collection的如下方法来完成
方法名 | 说明 |
---|---|
default void forEach(Consumer<? super T> action) | 结合Lambda遍历集合) |
案例演示
public class CollectionTest3 {
public static void main(String[] args) {
Collection<String> c = new ArrayList<>();
c.add("贾宝玉");
c.add("林黛玉");
c.add("薛宝钗");
c.add("王熙凤");
//[贾宝玉, 林黛玉, 薛宝钗, 王熙凤]
System.out.println(c);
Iterator<String> it = c.iterator();
c.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
System.out.println("---------------");
c.forEach((String s) -> System.out.println(s));
System.out.println("---------------");
c.forEach(s -> System.out.println(s));
System.out.println("---------------");
c.forEach(System.out::println);
}
}