一、ArrayList
1、关于ArrayList
<1>可以同时多线程访问,效率高但是容易出现并发错误(Vector只能单线程,效率低但是不会出现并发)
<2>基于数组实现,遍历的效率高,添加删除元素效率略低(LinkedList基于双向循环列表实现,对于增删改元素的效率较高,但是遍历时需要永远从下表0开始)
<3>有序的添加元素,元素不唯一,比如装入"Jim"的名字,可以有重名的人
2、创建new ArrayList
jdk5.0之前 ArrayList list = new ArrayList();
jdk5.0开始 ArrayList<泛型> list = new ArrayList<泛型>();
jdk7.0开始 ArrayList<泛型> list = new ArrayList<>();
3、关于ArrayList的方法
一次添加一个元素: list.add(元素)
一次添加多个元素: Collections.addAll(集合,元素,元素...);
往某个下标插入元素: list.add(下标,元素); //原来的元素和后面的一起往后移
得到某个下标对应的元素 xxx = list.get(下标);
修改某个下标对应的元素: list.set(下标,元素);
得到某个内容第一次出现的下标 int x = list.indexOf(元素)
得到某个内容最后一次出现的下标 int y = list.lastIndexOf(元素);
判断集合里面是否存在某个元素: boolean x = list.contains(元素)
将集合里面的数据装进数组里面 String[] data = list.toArray();
清空集合: list.clear();
判断集合是否为空 boolean x = list.isEmpty();
二、HashSet
1、关于HashSet
<1>无序、唯一。该集合是基于哈希表实现的,我们在往hashset中添加对象的时候,需要按顺序比较 hashcode->地址->equals。因此我们往往需要覆盖我们所创建对象的hashcode、equals方法此事在笔记1中亦有记载
@Override
public boolean equals(Object obj){
if(this == obj)return true;
}
@Override
public int hashCode(){
return score + name.hashCode();
}
//return Objects.hash(name);
2、创建new HashSet
3、关于HashSet的方法
4、说明
三、TreeSet
1、关于TreeSet
<1>有序、唯一。在使用TreeSet的时候,我们需要制定比较规则,通过覆盖compareTo方法来实现。
<2>该集合是基于二叉树实现的。
2、创建new TreeSet
3、关于TreeSet的方法
4、关于覆盖compareTo来制定比较规则
public int compareTo(参数 x){
if(this.属性 != x.属性)return...
if(!this.属性.equals(x.属性))return ...
...
return 1; //代表相同的对象也会被保留,如果相同的对象不需要保留,那么return 0;
}
四、Map【映射】集合
1、关于TreeSet
<1>有序、唯一。在使用TreeSet的时候,我们需要制定比较规则,通过覆盖compareTo方法来实现。
<2>该集合是基于二叉树实现的。
2、创建new TreeSet
3、关于TreeSet的方法
4、关于遍历键值对集合
<1>没有直接的办法遍历键值对集合,因此我们需要根据需求,选择性的遍历主键或者值,将他们的值传递到不同的集合中。
<2>由于主键具有唯一性,因此我们将主键放入Set集合中
Set<主键> set = map.keySet();
Collection<值> cs = map.values();
<3>Map.Entry
Set<Map.Entry<主键,值>> set = map.entrySet();
通过记录得到主键对象:x.getKey(key)
通过记录得到值对象:x.getValue(值)
通过记录修改值对象:x.setValue(值)
五、迭代器Iterator遍历
1、如果我们使用for循环遍历list.size(),当我们进行删除操作的时候,list的大小是动态的,因此我们会发现少循环几次,那么就需要我们掏出新的遍历模式,来进行删除操作。
for(Iterator<Integer> car = list.iterator(); car.hasNext(); ){
Integer x = car.next();//取出遍历的元素
car.remove();
/**
当我们使用迭代器在遍历集合的时候
不允许对集合的整体进行添加/删除操作,
否则出发CME异常,
因此我们不使用list.remove();
而是car.remove();
*/
}
六、比较器
1、任何一个引用数据类型如果想要装进TreeSet集合的话 都需要该类型有比较规则,一般情况我们会直接覆盖一个compareTo方法来制定比较规则,但是如果我们遇到了不能修改该类的情况,但是又想针对这个类的对象制定特定的规则进行排序,那么我们就可以创建一个比较器,让集合根据这个比较器的比较规则进行排序。
class BJQ implements Comparator<Object>{
@Override
public int compare(Object x,Object y){
return y.name.compareTo(x.name);//这里的x.name的情况仅作举例。具体规则根据自己情况制定。
}
}
2、我们的比较器一般情况下,只需要生成一次,然后每次需要使用直接调用这个比较器就行,这样可以节省我们的空间,因此我们将单例模式与比较器结合在一起写,就得到了以下代码
class BJQ implements Comparator<Teacher>{//Teacher类只是一个比喻,方便理解
private BJQ(){}
private static BJQ bb = new BJQ();
//让外部可以通过getOnlyBB()方法调用已经创建好的 比较器
public static BJQ getOnlyBB(){
return bb;
}
@Override//制定的比较规则
public int compare(Teacher t1,Teacher t2){
if(t1.getAge() != t2.getAge())return t1.getAge() - t2.getAge();
return 0;
}
}