当需要在Java程序中记录多个 类型不同的对象数据时,则准备一个集合
集合的框架结构
- java.util.Collection集合存取元素的基本单位是:单个元素
- java.util.Map集合存取元素的基本单位是:单对元素
Collection集合
常用方法
-
boolean add(E e)
- 向集合中添加对象(若有多个对象,则看为一个整体)
- 打印集合中的所有元素时,本质上就是打印集合中的每个对象,也就是让每个对象调用对应类的toString方法
-
boolean addAll(Collection c)
-
用于将参数指定集合c中的所有元素一个一个地添加到当前集合中
import java.util.Collection; public class CollectionTest { public static void main(String[] args) { // 1.准备一个Collection集合并打印 //Collection c1 = new Collection(); // 接口不能实例化,也就是不能创建对象 // 接口类型的引用指向实现类的对象,形成了多态 Collection c1 = new ArrayList(); // 自动调用toString方法,调用ArrayList类中的toString方法,默认打印格式为:[元素值1, 元素值2, ...] System.out.println("集合中的元素有:" + c1); // [] // 2.向集合中添加单个元素并打印 boolean b1 = c1.add(new String("one")); // new 占用新的内存空间 System.out.println("b1 = " + b1); // true System.out.println("集合中的元素有:" + c1); // [one] b1 = c1.add(Integer.valueOf(2)); System.out.println("b1 = " + b1); // true System.out.println("集合中的元素有:" + c1); // [one, 2] b1 = c1.add(new Person("zhangfei", 30)); System.out.println("b1 = " + b1); // true // 打印集合中的所有元素时,本质上就是打印集合中的每个对象,也就是让每个对象调用对应类的toString方法 System.out.println("集合中的元素有:" + c1); // [one, 2, Person{name='zhangfei', age=30}] // 3.向集合中添加多个元素并打印 Collection c2 = new ArrayList(); c2.add("three"); // 常量池 不占用新的内存空间 c2.add(4); // 自动装箱机制 集合存的是对象 自动装箱把int转为Integer System.out.println("c2 = " + c2); // [three, 4] // 将c2中的所有元素全部添加到集合c1中,也就是将集合c2中的元素一个一个依次添加到集合c1中 b1 = c1.addAll(c2); System.out.println("b1 = " + b1); // true System.out.println("c1 = " + c1); // [one, 2, Person{name='zhangfei', age=30}, three, 4] // 表示将集合c2整体看做一个元素添加到集合c1中 b1 = c1.add(c2); System.out.println("b1 = " + b1); // true System.out.println("c1 = " + c1); // [one, 2, Person{name='zhangfei', age=30}, [three, 4]] } }
-
-
boolean contains(Object o) 判断是否包含指定对象
-
boolean containsAll(Collection c) 判断是否包含参数指定的所有对象
-
boolean retainAll(Collection c) 保留当前集合中存在且参数集合中存在的所有对象
-
boolean remove(Object o) 从集合中删除对象
-
boolean removeAll(Collection c) 从集合中删除参数指定的所有对象
-
void clear() 清空集合
-
int size() 返回包含对象的个数
-
boolean isEmpty() 判断是否为空
-
boolean equals(Object o) 判断是否相等
-
int hashCode() 获取当前集合的哈希码值
-
Object[] toArray() 将集合转换为数组
-
Iterator iterator() 获取当前集合的迭代器
Iterator接口
基本概念
- java.util.Iterator接口主要用于描述迭代器对象,可以遍历Collection集合中的所有元素
- java.util.Collection接口继承Iterator接口,因此所有实现Collection接口的实现类都可以使用该迭代器对象
常用方法
-
boolean hasNext()
- 判断集合中是否有可以迭代/访问的元素
-
E next()
-
用于取出一个元素并指向下一个元素
import java.util.Iterator; public class CollectionPrintTest { public static void main(String[] args) { // 1.准备一个Collection集合并放入元素后打印 Collection c1 = new ArrayList(); c1.add("one"); c1.add(2); c1.add(new Person("zhangfei", 30)); // 遍历方式一: 自动调用toString方法 String类型的整体 System.out.println("c1 = " + c1); // [one, 2, Person{name='zhangfei', age=30}] // 2.遍历方式二:使用迭代器来遍历集合中的所有元素 更加灵活 // 2.1 获取当前集合中的迭代器对象 Iterator iterator1 = c1.iterator(); /* // 2.2 判断是否有元素可以访问 System.out.println(iterator1.hasNext()); // true // 2.3 取出一个元素并指向下一个 System.out.println("获取到的元素是:" + iterator1.next()); // one System.out.println(iterator1.hasNext()); // true System.out.println("获取到的元素是:" + iterator1.next()); // 2 System.out.println(iterator1.hasNext()); // true System.out.println("获取到的元素是:" + iterator1.next()); // Person{name='zhangfei', age=30} System.out.println(iterator1.hasNext()); // false System.out.println("获取到的元素是:" + iterator1.next()); // 编译ok,运行发生NoSuchElementException没有这样的元素异常 */ while (iterator1.hasNext()) { System.out.println("获取到的元素是:" + iterator1.next()); } } }
-
List集合
基本概念
- java.util.List集合是Collection集合的子集合,该集合中允许有重复的元素且有先后放入次序
- 该集合的主要实现类有:ArrayList类、LinkedList类、Stack类、Vector类
- ArrayList类的底层是采用动态数组进行数据管理的,支持下标访问,增删元素不方便
- LinkedList类的底层是采用双向链表进行数据管理的,访问不方便,增删元素方便
- 可以认为ArrayList和LinkedList的方法在逻辑上完全一样,只是在性能上有一定的差别,ArrayList 更适合于随机访问而LinkedList更适合于插入和删除;在性能要求不是特别苛刻的情形下可以忽略这个差别
- Stack类的底层是采用动态数组进行数据管理的,该类主要用于描述一种具有后进先出特征的数据结构,叫做栈(last in first out LIFO)
- Vector类的底层是采用动态数组进行数据管理的,该类与ArrayList类相比属于线程安全的类(ArrayList是它的线程不安全版本),效率比较低,以后开发中基本不用
常用方法
-
void add(int index, E element) 向集合中指定位置添加元素
-
boolean addAll(int index, Collection c) 向集合中添加所有元素
-
E get(int index) 从集合中获取指定位置元素
-
int indexOf(Object o) 查找参数指定的对象
-
int lastIndexOf(Object o) 反向查找参数指定的对象
-
E set(int index, E element) 修改指定位置的元素
-
E remove(int index) 删除指定位置的元素
-
删除前面的元素后,后续元素自动向前移,故选择从后向前删
System.out.println("集合中的元素有:" + lt1); // [one, two, three, four] for (int i = lt1.size()-1; i >= 0; i--) { System.out.println("被删除的元素是:" + lt1.remove(i)); } System.out.println("最终集合中的元素有:" + lt1); // []
-
-
List subList(int fromIndex, int toIndex) 用于获取子List
-
子集合和当前集合共用同一块内存空间
System.out.println("集合中的元素有:" + lt1); // [one, two, three, four] List lt2 = lt1.subList(1, 3); // [1,3) 取的位置为1和2 System.out.println("lt2 = " + lt2); // [two, three] // 验证:子集合和当前集合共用同一块内存空间 str2 = (String) lt2.remove(0); System.out.println("被删除的元素是:" + str2); // two System.out.println("删除后lt2 = " + lt2); // [three] System.out.println("删除后lt1 = " + lt1); // [one, three, four]
-
Queue集合
基本概念
- java.util.Queue集合是Collection集合的子集合,与List集合属于平级关系
- 该集合的主要用于描述具有先进先出特征的数据结构,叫做队列(first in first out FIFO)
- 该集合的主要实现类是LinkedList类,因为该类在增删方面比较有优势
常用方法
- boolean offer(E e) 将一个对象添加至队尾,若添加成功则返回true
- E poll() 从队首删除并返回一个元素
- E peek() 返回队首的元素(但并不删除)
Set集合
基本概念
- java.util.Set集合是Collection集合的子集合,与List集合平级
- 该集合中元素没有先后放入次序,且不允许重复
- 该集合的主要实现类是:HashSet类 和 TreeSet类以及LinkedHashSet类
- HashSet类的底层是采用哈希表进行数据管理的
- TreeSet类的底层是采用红黑树进行数据管理的
- LinkedHashSet类与HashSet类的不同之处在于内部维护了一个双向链表,链表中记录了元素的迭代顺序,也即元素插入集合中的先后顺序,因此便于迭代
常用方法
- 参考Collection集合中的方法即可
Map集合
基本概念
- java.util.Map集合中存取元素的基本单位是:单对元素,其中类型参数如下:
- K - 此映射所维护的键(Key)的类型,相当于目录
- V - 映射值(Value)的类型,相当于内容
- 该集合中key是不允许重复的,而且一个key只能对应一个value
- 该集合的主要实现类有:HashMap类、TreeMap类、LinkedHashMap类、Hashtable类、 Properties类
- HashMap类的底层是采用哈希表进行数据管理的
- TreeMap类的底层是采用红黑树进行数据管理的
- LinkedHashMap类与HashMap类的不同之处在于内部维护了一个双向链表,链表中记录了 元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代
- Hashtable类是古老的Map实现类,与HashMap类相比属于线程安全的类,且不允许null作为key或者value的数值
- Properties类是Hashtable类的子类,该对象用于处理属性文件,key和value都是String类型的
- Map集合是面向查询优化的数据结构, 在大数据量情况下有着优良的查询性能,经常用于根据key检索value的业务场景
常用方法
- V put(K key, V value) 将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null
- V get(Object key) 返回与参数Key所对应的Value对象,如果不存在则返回null
- boolean containsKey(Object key); 判断集合中是否包含指定的Key
- boolean containsValue (Object value); 判断集合中是否包含指定的Value
- V remove(Object key) 根据参数指定的key进行删除
- Set keySet() 返回此映射中包含的键的Set视图
- Collection values() 返回此映射中包含的值的Set视图
- Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射的Set视图
相关常量
- DEFAULT_INITIAL_CAPACITY : HashMap的默认容量是16
- DEFAULT_LOAD_FACTOR:HashMap的默认加载因子是0.75
- threshold:扩容的临界值,该数值为:容量*填充因子,也就是12
- TREEIFY_THRESHOLD:若Bucket中链表长度大于该默认值则转化为红黑树存储,该数值是8
- MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的hash表容量,该数值是64
Collections类
基本概念
- java.util.Collections类主要提供了对集合操作或者返回集合的静态方法
常用方法
- 请查阅手册