集合常用接口
接口意味着其实现类必须实现这些方法
1、collection接口
collection接口是List\Set\Queue接口的父接口
boolean add(Object o):增加一个元素
boolean addAll(Collection c):将集合c中的元素添加到指定的集合中
void clear():清空集合中的元素、长度变为0
boolean contains(Object o):是否包含指定元素
boolean containsAll(Collection c):是否包含集合c中的所有元素
Iterator iterator():返回Iterator对象,用于遍历集合中的元素
boolean remove(Object o):移除元素(只删除第1个)
boolean removeAll(Collection c):相当于减集合c
boolean removeIf(Predicate fliter)
boolean retainAll(Collection c):相当于求与c的交集
boolean isEmpty()
int hashCode()
int size():返回元素个数
Object[] toArray():把集合转换为一个数组
public static void main(String[] args){
Collection<String> c = new ArrayList<String>();
c.add("java讲义");
c.add("轻量级java EE 企业应用实战");
c.removeIf((obj)->obj.contains("讲义"));
System.out.println(c);
}
2、Iterable接口
Iterable接口是Collection接口的父接口,有一个forEach(Consumer action)方法
//forEach遍历集合
public static void main(String[] args){
Collection<String> list = new ArrayList<String>();
list.add("java讲义");
list.add("轻量级java EE 企业应用实战");
list.forEach((obj)->System.out.println(obj));
//Consumer<? super String> 接口,有一个void accept<? super string>的方法。
//该为函数式接口,因此可使用lambda表达式
//list.forEach(System.out::println);也可
}
3、Iterator接口
Iterator接口
Iterator<String> it =c.iterator();
it.forEachRemaining((obj)->System.out.println(obj));
Iterator接口及foreach循环迭代的主要功能都是访问集合元素。
对迭代变量的修改不会对实际的集合产生任何影响,且不能对实际集合进行修改
二、Set接口及实现类
Set接口及实现类的介绍
Set接口API
1、HashSet类的补充
继承的接口:Serializable, Cloneable, Iterable, Collection, Set
具有clone方法,返回该类的副本
重写equals及hashCode方法(里面的equals方法不用)
//常用的判断equals()方法写法
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj != null && obj.getClass() == R.class) {
R r = (R) obj;
// 一般为如果两者的实例变量相同即返回true
}
return false;
}
//重写hashCode()方法的注意事项
重写equals()时,必须要重写hashCode()方法。
重写hashCode()方法的基本准则:
保证程序在运行时,同一对象对此调用hashCode()方法应该返回相同的值
保证两个对象的equals()为true时,hashCode()的返回值也相等
对象中用于equals()方法比较的实例变量,都应该用于计算hashCode值
重写hashCode的一般步骤:
计算对象内每个实例变量的hashCode值:
实例变量类型 计算方式
boolean (f? 1:0)
byte\short\char\int (int) f
long (int) (f^(f>>>32))
float Float.floatToIntBits(f)
double Long l = Double.doubleToLongBits(f) 先转换为long再转换
引用 f.hashCode()
将第1步计算出来的该对象的多个hashCode值乘以一个质数后相加
2、TreeSet的补充
TreeSet的API文档
TreeSet 会调用compareTo方法比较元素大小,自然排序中的元素对象,都必须实现了Comparable接口。
BigDemical、BigInteger以及所有的数值型对应的包装类
Character
Boolean
String
Date、Time
//定制排序,关注TreeSet的构造器
public class R {
private Integer age;
R() {};
public String toString(){
return "R[age:"+age+"]";
}
public R(Integer age) {
this.age = age;
}
...getter/setter........
}
public class TreeSetTest {
public static void main(String[] args){
TreeSet<R> t = new TreeSet<R>((R r1,R r2)->r1.getAge().compareTo(r2.getAge()));
t.add(new R(15));
t.add(new R(20));
t.add(new R(18));
t.add(new R(15));
System.out.println(t);//[R[age:15], R[age:18], R[age:20]]
}
}
3、EnumSet类
EnumSet类API
EnumSet类的补充
4、各种Set实现类性能的补充
Set的实现类都是线程不安全的,必须在创建时,通过synchronizedSortedSet方法包装
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...))
三、List集合
1、List接口的补充
//replaceAll(UnaryOperator Operator)
public static void main(String[] args) {
List<String> books = new ArrayList<String>();
books.add("java讲义");
books.add("轻量级java EE 企业应用实战");
books.replaceAll(obj -> String.valueOf(obj.length()));
System.out.println(books);//[6, 17]
}
// ListIterator的add方法
Iterator只能在迭代集合进行删除操作,ListIterator可对迭代对象进行添加操作
2、ArrayList的补充
ensureCapacity的用法
如果往ArrayList中添加大量的元素,可以在创建的时候指定initialCapacity参数
void ensureCapacity(int minCapacity),先分配空间的大小,不够会自动扩展
void trimToSize(), 清理集合多占用的空间
注意:Arrays工具类中的ArrayList长度是不可变的
四、Queue集合
Queue集合及其实现类
Queue接口API
Deque接口
五、Map集合