文章目录
一、集合的设计背景
在没有集合之前,java中有一种方法可以存储对象(对象的引用)或者基本数据类型,那就是数组。但是数组有缺点,数组一旦初始化,长度是固定的,且只能存放相同数据类型的数据; 数组中提供的方法十分有限,对于添加,删除,插入数据等操作时非常不便,同时效率不高 ;数组 有序、可重复。对于无序、不可重复的需求,不能满足 。
基于以上必须解决的问题,java提供了对象(对象的引用)的保存方式,除了数组外,其余就被称为集合类。
二、集合的概念
为了使程序方便存储和操作数据不固定的一组数据,JDK提供了Java集合类,所有集合类放在Java.util
包中 。
集合的特点:
- 不能存储基本数据类型,但是可以存储引用类型和包装类型,并以相同的方式工作。
- 对于动态数组,链接表,树和散列表 的实现是高效的,有一套成熟的API了。
- 容易扩展,增强代码的复用性。例如泛型。
三、集合的分类
Java集合类可以分为两大类:一类是实现Collection接口;一类是实现Map接口。
Collection接口:基本的接口,有两个重要的子接口List接口和Set接口。可以容纳一组集合元素(Element
)。
Map接口:与Collection接口并列关系,Map提供键值对的映射。
如下图: 虚框的是抽象类,实框是实现类。虚线是继承,实线是实现。
Collection接口、List接口、Set接口以及相关类的关系 :
Map接口与Collection接口不同 :
四、List、Set、Map的区别?
比较 | List | Set | Map |
---|---|---|---|
继承接口 | Collection | Collection | |
常见实现类 | ArrayList、LinkedLisk、Vector | HashSet、LinkedHashSet、TreeSet | HashMap、HashTable、ConcurrentHashMap |
常用方法 | add()、remove()、get()、size()、contains() | add()、remove()、size() | put()、get()|、remove()、keySet()、entrySet() |
元素 | 可重复 | 不可重复(equaks()判断) | 不可重复 |
顺序 | 有序 | 无序(由hashcode决定) | |
存储空值 | vector、arraylist、linkedlist可以存储多个null | hashset、linkedset可以存储一个null. treeset不能存储null. | hashmap 、linkedhashmap key与value均可以为null. treemap key不可以为null,value可以为null. hashtable、concurrenthashmap key与value均不能为null. |
线程安全 | vector线程安全 | concurrenthashmap、hashtable线程安全 |
五、遍历集合
5.1 list集合遍历
1.for-each循环遍历集合
public class DemoTest {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("哈哈哈哈");
//第一种遍历方法使用 For-Each 遍历 List
for (String str : list) {
System.out.println(str);
}
}
}
结果:
Hello
World
哈哈哈哈
2.for遍历集合
public class DemoTest {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("哈哈哈哈");
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
}
结果:
Hello
World
哈哈哈哈
3.迭代器遍历结合
public class DemoTest {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("Hello");
list.add("World");
list.add("哈哈哈哈");
Iterator<String> ite=list.iterator();
while(ite.hasNext())//判断下一个元素之后有值
{
System.out.println(ite.next());
}
}
}
结果:
Hello
World
哈哈哈哈
5.2 map集合遍历
import java.util.*;
public class Test{
public static void main(String[] args) {
Map<String, String> map = new HashMap<String, String>();
map.put("1", "value1");
map.put("2", "value2");
map.put("3", "value3");
//第一种:普遍使用,二次取值
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐,尤其是容量大时
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}
}
}