一.集合
1.什么是集合?
Collection,用来存放对象的数据结构,集合与数组一样,可以保存一组元素,并且提供了操作元 素的相关方法,使用更方便.
Collection是所有集合的顶级接口
Collections是集合的工具类,里面定义了很多静态方法用于操作集合.
集合只能存放引用类型元素,并且存放的是元素的引用(地址)
Collection下面有两个常见的子接口:
- java.util.List:线性表.是可重复集合,并且有序.
- java.util.Set:不可重复的集合,大部分实现类是无序的.
可重复指的是集合中的元素是否可以重复,而判定重复元素的标准是依靠元素自身equals比较的结果.为true就认为是重复元素.
代码的侵入性:当我们调用某个API功能时,其要求我们为其修改其他额外的代码,这个现象就是侵入性.侵入性越强的API越不利于程序的后期可维护性.应当尽量避免.
2.集合的方法
1)equals()判断元素内容是否相等
2)add()集合赋值
Collection c = new HashSet();
c.add("1");
addAll(Collection c) 返回值boolean
将给定集合中的所有元素添加到当前集合中。当前集合若发生了改变则返回true
boolean aall = c.addAll(c2);//c2集合
3) size() 返回值int 返回当前集合的元素个数
int size = c.size();
4) isEmpty() 返回值boolean 判断当前集合是否为空集(不含有任何元素)
boolean isEmpty = c.isEmpty();
5)clear() 清空集合
c.clear();
6)contains() 判断当前集合是否包含给定元素
boolean contains = c.contains(Object o);
containsAll(Collection c) 返回值boolean 判断当前集合是否包含给定集合中的所有元素
boolean contains = c.containsAll(c2);
7)remove() 用来从集合中删除给定元素,删除的也是与集合中equals比较结果为true的元素。 注意,对于可以存放重复元素的集合而言,只删除一次。
c.remove(o);
removeAll(Collection c) 返回值boolean 删除当前集合中与给定集合中的共有元素
c.removeAll(c32);
8) 集合遍历:迭代器
Iterator iterator() 该方法会获取一个用于遍历当前集合元素的迭代器. (java.util.Iterator接口)
不同的集合都实现了一个用于遍历自身元素的迭代器实现类,无需记住名字,用多态的角度把他们看做为Iterator即可.
迭代器遍历集合遵循的步骤为:问->取->删. 其中删除元素不是必要操作
Collection c = new ArrayList();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
c.add("five");
System.out.println(c);
//获取迭代器
Iterator it = c.iterator();
/*
迭代器提供的相关方法:
boolean hasNext()
判断集合是否还有元素可以遍历E next()
获取集合下一个元素(第一次调用时就是获取第一个元素,以此类推)
*/
while(it.hasNext()){
String str = (String)it.next();
System.out.println(str);it.remove(str);
}
System.out.println(c);
hasNext() 判断集合是否还有下一个元素可以遍历 返回值是boolean
next() 获取集合下一元素
remove() 迭代器的remove方法可以将通过next方法获取的元素从集合中删除。
注意:代器要求遍历的过程中不得通过集合的方法增删元素否则会抛出异常:ConcurrentModificationException
9)toArray() 可以将当前集合转换为一个数组
Object[] array = list.toArray();
重载的toArray
重载的toArray方法要求传入一个数组,内部会将集合所有元素存入该数组
后将其返回(前提是该数组长度>=集合的size)。如果给定的数组长度不足,
则方法内部会自行根据给定数组类型创建一个与集合size一致长度的数组并
将集合元素存入后返回。
String[] array = list.toArray(new String[list.size()]);
3.List集合
java.util.List接口,继承自Collection.
List集合是可重复集,并且有序,提供了一套可以通过下标操作元素的方法
常用实现类:
-
java.util.ArrayList:内部使用数组实现,查询性能更好.
-
java.util.LinkedList:内部使用链表实现,首尾增删元素性能更好.
List集合常见方法
1)get()与set()
get(int index) 获取指定下标对应的元素
String e = list.get(2);
set(int index,E e)将给定元素设置到指定位置,返回值为该位置原有的元素。
String o = list.set(1,"1");System.out.println("被替换的元素是:"+o);
2)List集合提供了一对重载的add,remove方法
add(int index,E e) void 将给定元素插入到指定位置
list.add(2,"one");
remove(int index) 删除并返回指定位置上的元素
String e = list.remove(1);
System.out.println("被删除的元素:"+e);
3) subList(int start,int end)
获取当前集合中指定范围内的子集。两个参数为开始与结束的下标(含头不含尾)
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
for(int i=0;i<10;i++){
list.add(i);
}
System.out.println(list);
//获取3-7这部分
List<Integer> subList = list.subList(3,8);
System.out.println(subList);
//将子集每个元素扩大10倍
for(int i=0;i<subList.size();i++){
subList.set(i,subList.get(i) * 10);
}
//[30,40,50,60,70]
System.out.println(subList);
/*
对子集元素的操作就是对原集合对应元素的操作
*/
System.out.println(list);//删除list集合中的2-8
list.subList(2,9).clear();
System.out.println(list);}
4)数组转List集合
数组的工具类Arrays提供了一个静态方法asList(),可以将一个数组转换为一个List集合
String[] array = {"one","two","three","four","five"};
List<String> list = Arrays.asList(array)
注意:对数组转换的集合进行元素操作就是对原数组对应的操作
由于数组是定长的,因此对该集合进行增删元素的操作是不支持的,会抛出
异常:java.lang.UnsupportedOperationException
若希望对集合进行增删操作,则需要自行创建一个集合,然后将该集合元素导入
List<String> list2 = new ArrayList<>();
list2.addAll(list);
4.Collections中的方法
1)sort(List list) 可以对List集合进行自然排序(从小到大)
Collections.sort(list);
重载的sort(List list,Comparator c)//c 是比较器
Collections.sort(List list,Comparator c)
----------------------------------------------------------------
/**
* compare方法用来定义两个参数o1,o2的大小关系
* 返回值用来表示o1与o2的大小关系
* 当返回值>0时,应当表示的含义是o1>o2
* 当返回值<0时,表示o1<o2
* 当返回值=0时,表示o1与o2相等
*/Collections.sort(list,new Comparator<Point>() {
public int compare(Point o1, Point o2) {
int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
return olen1-olen2;
}
});
注意o1-o2顺序是从小到大 o2-o1是从大到小
适用于Lambda表达式