集合
集合的概念:
集合和数组类似,是一个数组容器,用来存储引用数据类型的数据,在Java中,集合不是泛指某一个类,而是若干个类组成的数据结构的实现
Java的集合类是Java.util包中的重要内容,它允许以各种方式将元素进行分组,并定义了各种使这些元素更容易操作的方法
Java集合类是Java将一些基本的和使用频率极高的基础类进行封装和增强后再以一个类的形式提供使用
java集合类是可以往里面保存多个对象的类,存放的是对象,不同的集合类有不同的功能和特点,适用不同的场合,用来解决一些实际的问题
集合的特点:
1.集合类这种框架是高性能的,对基本类集(动态数组,链接表,树和散列)的实现是高效率的
2.集合类允许不同类型的集合以相同的方式和高度互操作方式工作
3.集合类容易扩展和修改,程序员可以很容易的稍加更改就能满足自己的数据结构需求
集合与数组的区别:
1.存储的数据类型:
1.1数组可以存储基本数据类型的数据,也可以存储引用数据类型的数据
1.2集合中只能存储引用数据类型的数据,基本数据类型的数据需要进行装箱处理。才能存入到集合中
2.长度:
2.1数组是定长的容器,一旦实例化完成,数组的长度不能发生改变,即数组不能动态的添加,删除元素
2.2集合是变长的容器,长度可以发生改变,即集合中可以随时添加,删除元素
3.元素操作
3.1数组只能通过下标进行元素的访问,如果需要其他的操作,例如排序,需要自己写算法实现
3.2集合中封装了若干对元素进行操作的方法,直接使用集合,比较方便
使用集合的好处:
1.降低编程的难度
2.提供程序的运行速度和质量
3.无需学习新的API
4.增加代码的重用性
Java中的集合框架图
Java中的集合大体分为两类,分别是Collection集合和Map集合
其中,Collection是单列集合的顶级接口,Map接口是双列集合的顶级接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rqYwINun-1622257558896)(C:\Users\16326\Desktop\dayHomework\数据结构\QQ截图20210528174524.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pec3ZkJ0-1622257558897)(C:\Users\16326\Desktop\dayHomework\数据结构\QQ截图20210528174536.png)]
Collection集合
存储特点:
Collection接口是单列集合的顶级接口,在这种集合中存储的数据只占一列,所有的元素,直接存储于各种数据结构中
Collection集合中没有下标的概念
Collection API
接口方法:
由于这个接口是单列集合的顶级接口,在这里定义的所有方法,在所有的实现类中都是可以使用的
修饰 | 方法 | 描述 |
---|---|---|
Boolean | add(E element) | 将一个指定类型的元素放到集合的末尾 |
Boolean | addAll(Collection coll) | 批量添加,将一个集合中的所有元素添加到当前集合的末尾 |
boolean | remove(E element) | 删除集合中指定的元素 |
boolean | removeAll(Collection coll) | 删除集合中所有的在参数集合中存在的交集 |
void | clear() | 清空集合中的所有的数据 |
boolean | removeIf(Predicate predlicat e) | 删除集合中满足指定条件的数据 |
boolean | contains(E element) | 判断集合中,是否包含指定的元素 |
boolean | containsAll(Collection coll) | 判断参数集合中,是否包含所有的元素都包含在当前的集合中 |
int | size() | 获取集合中元素的数量,类似于数组length |
boolean | isEmpty() | 判断一个集合是不是空集合 |
Object[] | toArray() | 将集合中的元素转成Object数组 |
T[] | toArray(T[] array) | 将集合中的元素转成指定类型的数组 |
collection集合遍历
迭代器(iterator)
工作原理:
1.使用集合的iterator()方法,获取到了一个迭代器对象
原因:迭代器在对集合进行遍历时,要与对应的集合产生关系,通过集合的一个方法获取迭代器对象,可以在方法内部创建迭代器对象,同时自动与当前集合产生关系,对于使用者而言,简化了代码
2.这个迭代器对象,内部维护了一个引用,指向集合中的某一个元素,默认指向-1位
3.使用next()方法,向后移动一位元素指向,并返回新的指向的元素
4.如果使用next()方法,会向后移动一位元素指向的时候,已经超过了集合的范围,指向了一个不存在的元素,会抛出NOSuchElementException
5.一般情况下,配合hasNext()方法一起使用
package bk.javase.p528;
import java.util.Collection;
import java.util.Iterator;
public class demo10 {
public static void main(String[] args){
}
private static void enumunation2(Collection<String> collection){
//1.创建一个迭代器对象
Iterator<String> iterator = collection.iterator();
//2.通过hasNext判断是否还有下一个元素
while(iterator.hasNext()){
//3.向后指向,并返回这个新的指向的元素
String element = iterator.next();
System.out.println(element);
}
//遍历取值,通过hasNext()判断是否还有下一个元素
while(iterator.hasNext()){
Object o = iterator.next();
//注意点:当集合中同时存在不同的类型的数据时,需要进行容错处理和向下转型
//容错处理
if (!(o instanceof String )){
throw new ClassCastException("类型错误");
}
//向下转型
String s = (String)o;
System.out.println(s.length());
}
//再继续遍历
//注意点:直接再次使用第一次的iterator进行遍历,遍历失败,因为当前的指针已经指向了集合的最后
//再次使用hasNext()会返回false,所以如果想再次遍历,需要重新获取迭代器对象
while(iterator.hasNext()){
}
}
}
增强for循环
//遍历参数集合中的元素
public static void enumration(Collection<String> collection){
//增强for循环
for(String str : collection){
System.out.println(str);
}
}
注意事项:
在使用增强for循环进行元素的遍历的过程中,不要修改集合中的内容!!!否则会出现ConcurrenModificationException
原因:增强for循环内部实际是一个迭代器
foreach:java8之后在Collection集合中添加了一个新的方法
list集合
存储特点:
1.list集合是单列集合,是Collection接口的子接口。Collection接口中的所有方法这里都有,同时这个集合比Collection集合多若干的方法
2.在list接口中,是有下标的概念的,多出来的这些方法,基本上也都是围绕着下标进行操作的
list和set对比:
1.list:存储的数据是有序的(元素的存储顺序与添加元素的顺序是一致的),可以重复
2.set:存储的数据是无序的,不可以重复
LIst API
返回值 | 方法 | 描述 |
---|---|---|
void | add(int index,E element) | 向集合中的指定的下标位插入一个新的元素 |
void | addAll(int index,Collection coll) | 在集合中指定的下标插入另外一个集合中所有的的数据 |
E | remove(int index) | 删除集合中指定下标为的元素 |
E | set(int index,E element) | 修改指定下标为的值 |
E | get(int index) | 获取指定下标为的元素 |
int | indexOf(E element) | 获取集合指定元素第一次出现的下标 |
int | lastIndexOf(E element) | 获取集合指定元素最后一次出现的下标 |
List | subList(int form,int to) | 从一个集合中截取一部分作为子集合[from,to) |
void | sort(Comparator comparator) | 将数组元素升序排序 |
package bk.javase.p528;
import java.util.ArrayList;
import java.util.List;
public class demo11 {
public static void main(String[] args){
//1.实例化一个ArrayList对象,向上转型为接口类型
List<String> list = new ArrayList<>();
//2.新增元素
list.add("hello");
list.add("world");
list.add("hi");
list.add("everyone");
//3.在集合中指定下标添加元素
list.add(2,"chenheng");
//4.在集合中指定的下标位插入一个另一个集合中的所有数据
list.addAll(2,list);
//5.删除集合中指定下标位的元素
//返回值:这个被删除的元素
System.out.println(list.remove(2));
//6.修改指定下标的值
//返回值被覆盖的值
System.out.println(list.set(2,"tianli"));
//7.获取指定下标位的元素
System.out.println(list.get(2));
//8.获取集合中,某一元素第一次出现的下标
System.out.println(list.indexOf("hello"));
//9.获取集合中某一元素最后一次出现的下标
System.out.println(list.lastIndexOf("world"));
//10.从一个集合中截取一部分,作为子集合
List<String> sub = list.subList(2,60);
System.out.println(list);
System.out.println(sub);
}
}
List集合排序
在List接口中,提供了一个排序方法sort
方法逻辑:
这是一个系统封装好的一个专门用来排序的方法。由于集合中只能存储引用数据类型的数据,因此,需要明确两个元素的大小关系,参数Comparator是一个对象大小比较的接口。在这个接口的方法中,有两个参数,分别表示参与比较的对象,返回值是int类型的,不看具体的值,只看正负
/*
>0 : o1 > o2
<0 : o1 < o2
=0 : o1 = o2
*/
int compare(T t1,T t2)
List集合遍历:
由于List接口继承自Collection接口,因此在Collection部分的三种遍历方式,都可以用来遍历List集合,同时,在List集合中,还添加了两种用来遍历集合的其他方式。
下标遍历法:
package bk.javase.p528;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class demo12 {
public static void main(String[] args){
//1.实例化一个List集合,存储若干数据
List<Integer> list = new ArrayList<>();
Collections.addAll(list,10,20,30,40,50);
//2.遍历
index(list);
}
//下标遍历法
private static void index(List<Integer> list){
for (int i = 0;i < list.size();i++){
System.out.println(list.get(i));
}
}
}
();
Collections.addAll(list,10,20,30,40,50);
//2.遍历
index(list);
}
//下标遍历法
private static void index(List<Integer> list){
for (int i = 0;i < list.size();i++){
System.out.println(list.get(i));
}
}
}