Collection接口
Collection 表示一组对象,它是集中、收集的意思。collection包含Set、List、Queue。
- List:list接口包含ArrayList,Vector,LinkedList。
- Set包含HashSet,TreeSet,EnumSet。
- Queueu包含LinkedList,PriorityQueue
Collection接口的常用方法
方法 | 说明 |
---|---|
boolean add(E e) | 向集合中添加一个元素 |
boolean addAll(Collection c) | 向集合中添加集合c中的所有元素 |
void clear() | 清除集合中的所有元素 |
boolean contains(Object o) | 判断集合中是否存在指定元素 |
boolean containsAll(Collection c) | 判断集合中是否包含集合c中的所有元素 |
boolean isEmpty() | 判断集合是否为空 |
Iterator<E>iterator() | 返回一个 Iterator 对象,用于遍历集合中的元素 |
boolean remove(Object o) | 从集合中删除一个指定元素 |
boolean removeAll(Collection c) | 从集合中删除所有在集合c中出现的元素 |
boolean retainAll(Collection c) | 从集合中删除集合c里不包含的元素 |
int size() | 返回集合中元素的个数 |
Object[] toArray() | 把集合转换为一个数组,所有的集合元素变成对应的数组元素 |
由于List、Set是Collection的子接口,意味着所有List、Set的实现类都有上面的方法。
List接口
List是有序、可重复的容器。
有序:List中每个元素都有索引标记。可以根据元素的索引标记(在List中的位置)访问元素,从而精确控制这些元素。
可重复:List允许加入重复的元素。更确切地讲,List通常允许满足 e1.equals(e2) 的元素重复加入容器。
List接口中新增方法
方法 | 说明 |
---|---|
void add(int index, Object element) | 在指定位置插入元素 |
Object set(int index, Object element) | 修改指定位置的元素 |
Object get(int index) | 返回指定位置的元素 |
Object remove(int index) | 删除指定位置元素,后年后面元素全部前移一位 |
int indexOf(Object o) | 返回第一个匹配元素的索引,如果没有该元素返回-1 |
int lastIndexOf(Object o) | 返回最后一个匹配元素的索引,如果没有该元素返回-1 |
List接口常用的实现类有3个:ArrayList、LinkedList和Vector。
- ArrayList:底层实现的数据结构是数组,查询快,增删慢。线程不安全,效率高
- LinkedList:底层实现的数据结构是链表,查询慢,增删块。线程不安全,效率高
- Vector:底层实现的数据结构是数组,查绚块,增删慢。线程安全,效率低
Set接口
Set容器特点:无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。
Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。
- HashSet:底层数据结构是哈希表(无序,唯一)。保证元素唯一性依赖于两个方法:hashCode()和equals()
- LinkedHashSet:底层数据结构是链表和哈希表。(FIFO,有序,唯一)。通过链表保证有序性, 通过哈希表保证唯一性。
- TreeSet:底层数据结构是红黑树。(唯一,有序)
HashSet的使用
public class Test {
public static void main(String[] args) {
Set<String> s = new HashSet<String>();
s.add("hello");
s.add("world");
System.out.println(s);
s.add("hello"); //相同的元素不会被加入
System.out.println(s);
s.add(null);
System.out.println(s);
s.add(null);
System.out.println(s);
}
}
//执行结果
//[world, hello]
//[world, hello]
//[null, world, hello]
//[null, world, hello]
TreeSet内部需要对存储的元素进行排序,因此,我们对应的类需要实现Comparable接口。
这样,才能根据compareTo()方法比较对象之间的大小,才能进行内部排序。
-
由于是二叉树,需要对元素做内部排序。 如果要放入TreeSet中的类没有实现Comparable接口,则会抛出异常:java.lang.ClassCastException。
-
TreeSet中不能放入null元素。
TreeSet的使用
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
public class TestCollection {
public static void main(String[] args) {
User u1 = new User(1001, "vinsomke", 18);
User u2 = new User(2001, "zoro", 5);
Set<User> set = new TreeSet<User>();
set.add(u1);
set.add(u2);
//TreeSet类中跟HashSet类一样也没有get()方法来获取列表中的元素,所以也只能通过迭代器方法来获取。
Iterator<User> it =set.iterator();
while(it.hasNext()){
System.out.println(it.next().id);
}
}
}
class User implements Comparable<User> {
int id;
String uname;
int age;
public User(int id, String uname, int age) {
this.id = id;
this.uname = uname;
this.age = age;
}
/**
* 返回0 表示 this == obj 返回正数表示 this > obj 返回负数表示 this < obj
*/
@Override
public int compareTo(User o) {
if (this.id > o.id) {
return 1;
} else if (this.id < o.id) {
return -1;
} else {
return 0;
}
}
}
Map接口
Map是一种储存键值对 (key-value)对像的collection,在key-value的结果储存中,key不能重复,value可以重复。
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
Map接口的常用方法
方法 | 说明 |
---|---|
Object put(Object key,Object value) | 存放键值对 |
Object get(Object key) | 通过键对象查找得到值对象 |
Object remove(Object key) | 删除键对象对应的键值对 |
boolean containsKey(Object key) | Map容器中是否包含键对象对应的键值对 |
boolean containsValue(Object value) | Map容器中是否包含值对象对应的键值对 |
int size() | 键值对的数量 |
bollean isEmpty | Map是否为空 |
void putAll(Map t) | 将t的所有键值对存放到本Map对象 |
void clear() | 清空本Map对象的所有键值对 |
HashMap和HashTable
HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。
- HashMap: 线程不安全,效率高。允许key或value为null。
- HashTable: 线程安全,效率低。不允许key或value为null。
HashMap的使用
import java.util.HashMap;
import java.util.Map;
public class TestMap {
public static void main(String[] args) {
Map<Integer, String> m1 = new HashMap<Integer, String>();
Map<Integer, String> m2 = new HashMap<Integer, String>();
m1.put(1, "one");
m1.put(2, "two");
m1.put(3, "three");
m2.put(1, "一");
m2.put(2, "二");
System.out.println(m1.size());
System.out.println(m1.containsKey(1));
System.out.println(m2.containsValue("two"));
m1.put(3, "third"); //键重复了,则会替换旧的键值对
Map<Integer, String> m3 = new HashMap<Integer, String>();
m3.putAll(m1);
m3.putAll(m2);
System.out.println("m1:" + m1);
System.out.println("m2:" + m2);
System.out.println("m3:" + m3);
}
}
Iterator迭代器
所有实现了 Collection 接口的容器类都有一个 iterator() 方法,用来返回一个实现了 Iterator 接口的对象
遍历List方法一:普通for循环
for(int i=0;i<list.size();i++){//list为集合的对象名
String temp = (String)list.get(i);
System.out.println(temp);
}
遍历List方法二:增强for循环(使用泛型!)
for (String temp : list) {
System.out.println(temp);
}
遍历List方法三:使用Iterator迭代器(1)
for(Iterator iter= list.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
遍历List方法四:使用Iterator迭代器(2)
Iterator iter =list.iterator();
while(iter.hasNext()){
Object obj = iter.next();
iter.remove();//如果要遍历时,删除集合中的元素,建议使用这种方式!
System.out.println(obj);
}
遍历Set方法一:增强for循环
for(String temp:set){
System.out.println(temp);
}
遍历Set方法二:使用Iterator迭代器
for(Iterator iter = set.iterator();iter.hasNext();){
String temp = (String)iter.next();
System.out.println(temp);
}
遍历Map方法一:根据key获取value
Map<Integer, Man> maps = new HashMap<Integer, Man>();
Set<Integer> keySet = maps.keySet();
for(Integer id : keySet){
System.out.println(maps.get(id).name);
}
遍历Map方法二:使用entrySet
Set<Entry<Integer, Man>> ss = maps.entrySet();
for (Iterator iterator = ss.iterator(); iterator.hasNext();) {
Entry e = (Entry) iterator.next();
System.out.println(e.getKey()+"--"+e.getValue());