JAVA初学-集合总结
集合(用于存放引用类型的数据,可变长的数组)
由图可见集合分为2大类型,单列集合(collection)与双列集合(Map)
其中单列集合又可分为2大类,既list和Set
其中list属于可重复集合,而且有索引,可以根据集合的下标去获取当前位置的元素
(使用时需要保证该下标的存在否则会报错)
java.lang.IndexOutOfBoundsException 下标越界异常 ----属于运行时异常
list集合
list集合的特点
- 可重复
- 有序(添加顺序和取出顺序相同)
- 可索引
list又细分为ArrayLiSt和LinkedList
ArrayList底层为数组结构 查询快、增删慢
LinkedList 底层是链表结构 查询慢、增删快
list中的主要方法
add(要添加的元素);
add(int index,要添加的元素) 在指定位置,添加元素
addAll(Collection<?>()) 将collection集合的元素全部添加
remove(int index) 删除指定位置的元素
remove(Object o) 删除指定的元素
removeAll(Collection<?> c) 删除列表中的指定集合
contains(Object o) 判断集合中是否包含元素o
size() 返回集合的大小
4种list集合的遍历
1.创建集合
list<String> a=new ArrayList<>();
-
集合中添加元素
a.add("dada");
a.add("ggg");
a.add("tt");
for循环遍历
for (int i = 0; i <a.size(); i++) {
System.out.println(a.get(i));
}
增强for循环遍历
for (String str:a) {
System.out.println(str);
}
迭代器遍历
Iterator it=a.iterator();
while (it.hasNext()){
Object next = it.next();
System.out.println(next);
}
列表迭代器(在迭代器遍历的同时允许对迭代器进行操作)
ListIterator<String> it =s.listIterator();
while(it.hasNext()){
String next = it.next();
System.out.println(next);
if(next.equals("tt")){
a.add("qq");
//此处未迭代器修改,不是集合修改 }
}
System.out.println(s);
}
LinkedList特有的方法:
public void addFirst(E e) 在该列表开头插入指定的元素
public void addLast(E e) 将指定的元素追加到此列表的末尾
public E getFirst() 返回此列表中的第一个元素
public E getLast() 返回此列表中的最后一个元素
public E removeFirst() 从此列表中删除并返回第一个元素
public E removeLast() 从此列表中删除并返回最后一个元素
Set集合
Set集合的特点
- 元素存取无序
- 没有索引
- 不能存储重复元素
Set中的主要方法
add(要添加的元素);
add(int index,要添加的元素) 在指定位置,添加元素
addAll(Collection<?>()) 将collection集合的元素全部添加
remove(int index) 删除指定位置的元素
remove(Object o) 删除指定的元素
removeAll(Collection<?> c) 删除列表中的指定集合
contains(Object o) 判断集合中是否包含元素o
size() 返回集合的大小
2种Set集合的遍历
Set<String> s =new HashSet<>();
s.add("String");
s.add("aaa");
s.add("bbb");
//遍历1
for (String d: s) {
System.out.print(d);
}
System.out.println("-------------------");
//遍历2
Iterator it =s.iterator();
while (it.hasNext()){
System.out.print(it.next());
}
HashSet集合的特点
1.底层是哈希表结构
2.元素存取无序
3.没有索引
4.不能存储重复元素
HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。
如果为true,那么视为相同元素,不存。如果为false,那么存储。
如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
LinkedHashSet集合的概述和特点
1.LinkedHashSet集合是HashSet集合的子类
2.LinkedHashSet集合不能存储重复元素
3.LinkedHashSet集合可以保证元素存取有序
TreeSet集合的特点
1.元素有序。元素可以按照一定规则进行排序。具体要取决于构造方法
TreeSet():根据元素的自然顺序进行排序
TreeSet(Comparator c):根据指定的比较器进行排序
2.TreeSet集合没有索引。只能通过迭代器、增强for循环进行遍历
3.TreeSet集合不能存储重复元素
TreeSet:
用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
如果元素不具备比较性,在运行时会发生ClassCastException异常。
所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。
TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0,如果return 0,视为两个对象重复,不存。
注意:在进行比较时,如果判断元素不唯一,比如,同姓名,同年龄,才视为同一个人。
在判断时,需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,按照次要条件排序。
TreeSet集合排序有两种方式,Comparable和Comparator区别:
1:让元素自身具备比较性,需要元素对象实现Comparable接口,覆盖compareTo方法。
2:让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象作为实际参数传递给TreeSet集合的构造函数。
第二种方式较为灵活。
Map集合
Map集合的特点
- Map是双列数据存储的集合
- map<k,v> 键值对存储,成对的存储
- map中的键是唯一的,不可重复的
Map中的主要方法
put<k,v> 添加
remove() 删除
get(Object key) 获取对应键的值
isEmpty() 判断集合是否为空
size()返回集合的大小
containsKey(Object key) 是否包含key键
containsValue(Object value) 是否包含value值
2种Map集合的遍历
使用增强for循环
Map<k,v> s =new HashMap<>();
Set<String > s1=s.keySet(); 获取集合S中的键
for(String st :s1){//对集合s1进行遍历,获取集合M中的所有键
s.get(s1);//获取对应的键所对应的值
sout();
}
使用Map中自带的遍历
for (Map.Entry<String,Student> m11:m.entrySet()
) {
String key = m11.getKey();
Student value = m11.getValue();
System.out.println("学号"+key+"姓名"+value.getName()+"年龄"+value.getAge());
}
Collections 工具类(只适应于list集合)
3种方法
Collections.sort(list); 排序
Collections.resverse(list); 反转
Collections.shuffle(list); 打乱
集合的使用技巧
看到Array就是数组结构,有角标,查询速度很快。
看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
看到tree就是二叉树,就要想到排序,就想要用到比较。
比较的两种方式:
一个是Comparable:覆盖compareTo方法;
一个是Comparator:覆盖compare方法。
LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。
集合什么时候用?
当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。
保证唯一,就用Set。不保证唯一,就用List。