一、集合的由来
通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。为了满足这些常规的编程需要,我们要求能在任何时候,任何地点创建任意数量的对象,而这些对象用什么来容纳呢?我们首先想到了数组,但是!数组只能存放同一类型的数据,而且其长度是固定的,那怎么办了?集合便应运而生了。
二、集合是什么?
Java集合类存放在java.util包中,是一个用来存放对象的容器。
注意:
- 集合只能存放对象。比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。
- 集合存放的都是对象的引用,而非对象本身。所以我们称集合中的对象就是集合中对象的引用。对象本身还是放在堆内存中。
- 集合可以存放不同类型,不限数量的数据类型。
三、数组和集合的比较
数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合。如下:
- 数组能存放基本数据类型和对象,而集合类存放的都是对象,集合类不能存放基本数据类型。数组和集合存放的对象皆为对象的引用地址
- 数组容易固定无法动态改变,集合类容量动态改变。
- 数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数
- 集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
- 集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率
四、java集合
Collection和Map,是集合框架的根接口。
Collection的子接口:
Set:接口 ---实现类: HashSet、LinkedHashSet
Set的子接口SortedSet接口---实现类:TreeSet
List:接口---实现类: LinkedList,Vector,ArrayList
List集合
有序列表,允许存放重复的元素;
实现类:
- ArrayList:数组实现,查询快,增删慢,轻量级
- LinkedList:双向链表实现,增删快,查询慢
- Vector:数组实现,重量级 (使用少)
ArrayList:
底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。
import java.util.ArrayList;
import java.util.List;
public class Demo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("小明");
list.add(22);
list.add("张三");
list.add("洛克");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
输出结果:
小明
22
张三
洛克
ArrayList常用方法:
void add(int index, Object element) :添加对象element到位置index上
boolean addAll(int index, Collection collection) :在index位置后添加容器collection中所有的元素
Object get(int index) :取出下标为index的位置的元素
int indexOf(Object element) :查找对象element 在List中第一次出现的位置
int lastIndexOf(Object element) :查找对象element 在List中最后出现的位置
Object remove(int index) :删除index位置上的元素
ListIterator listIterator(int startIndex) :返回一个ListIterator 跌代器,开始位置为startIndex
Set集合
无序集合,不允许存放重复的元素;允许使用null元素
对 add()、equals() 和 hashCode() 方法添加了限制
HashSet和TreeSet是Set的实现、
HashSet
HashSet类直接实现了Set接口,其底层其实是包装了一个HashMap去实现的。HashSet采用 HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能。
HashSet的特征:
- 不仅不能保证元素插入的顺序,而且在元素在以后的顺序中也可能变化
- HashSet元素值可以为NULL
import java.util.HashSet;
import java.util.Set;
public class Demo01 {
public static void main(String[] args) {
Set set = new HashSet();
set.add("小小");
set.add("莉莉");
set.add("张三");
set.add(55);
System.out.println(set);
}
}
运行结果:
[莉莉, 张三, 55, 小小]
Map集合
集合框架的第二类接口树。
它提供了一组键值的映射。其中存储的每个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。
关键字应该是唯一的,每个key 只能映射一个value。
实现类:
HashMap、TreeMap、LinkedHashMap、Hashtable等
- HashMap:键值对,key不能重复,但是value可以重复;key的实现就是HashSet;value对应着放;允许null的键或值;
- Hashtable:线程安全的,不允许null的键或值;
- Properties::key和value都是String类型,用来读配置文件;
- TreeMap:对key排好序的Map; key 就是TreeSet, value对应每个key; key要实现Comparable接口或TreeMap有自己的构造器;
- LinkedHashMap: 此实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。存储的数据是有序的。
HashMap:
- Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许重复,但允许值重复。
- HashMap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。
- HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;
- HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
import java.util.HashMap;
import java.util.Map;
public class Demo01 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("张三",12);
map.put("李四",13);
map.put("王五",18);
map.put("可可",17);
System.out.println(map);
}
}
运行结果:
{李四=13, 张三=12, 王五=18, 可可=17}
Map常用方法:
- Object put(Object key,Object value):用来存放一个键-值对Map中
- Object remove(Object key):根据key(键),移除键-值对,并将值返回
- void putAll(Map mapping) :将另外一个Map中的元素存入当前的Map中
- void clear() :清空当前Map中的元素
- Object get(Object key) :根据key(键)取得对应的值
- boolean containsKey(Object key) :判断Map中是否存在某键(key)
- boolean containsValue(Object value):判断Map中是否存在某值(value)
- public Set keySet() :返回所有的键(key),并使用Set容器存放
- public Collection values() :返回所有的值(Value),并使用Collection存放
- public Set entrySet() :返回一个实现 Map.Entry 接口的元素 Set
总结