Java提升学习(七):Java集合类、迭代器
一、Java集合类
(一)集合的概念
Java提供了一种类,这种类相当于容器,可存储一系列对象,统称为集合。
集合与数组相近,但区分于数组
- 数组的长度是固定的。集合的长度是可变的。
- 数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不 一致。在开发中一般当对象多的时候,使用集合进行存储。
(二)Collection接口
Collection
:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是 java.util.List
和 java.util.Set
。其中, List
的特点是元素有序、元素可重复。 Set
的特点是元素无序,而且不可重复。 List
接口的主要实现类有 java.util.ArrayList
和 java.util.LinkedList
, Set
接口 的主要实现类有 java.util.HashSet
和 java.util.TreeSet
。
可以说Collection接口是最基本的集合类接口,在定义Collection中,定义了单列集合(List和Set)通用的一些方法。
方法 | 描述 |
---|---|
public boolean add(E e) |
把给定的对象添加到当前集合中 |
public void clear() |
清空集合中所有的元素 |
public boolean remove(E e) |
把给定的对象在当前集合中删除 |
public boolean contains(E e) |
判断当前集合中是否包含给定的对象 |
public boolean isEmpty() |
判断当前集合是否为空 |
public int size() |
返回集合中元素的个数 |
public Object[] toArray() |
把集合中的元素,存储到数组中 |
(三)List集合
java.util.List
接口继承自 Collection
接口,是单列集合的一个重要分支,习惯性地会将实现了 List
接口的对 象称为List
集合。在List
集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过 索引来访问集合中的指定元素。另外,List
集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
- 元素存取有序的集合,怎么入怎么出
- 带有索引的集合,通过索引就可以访问元素
- 元素可重复
List中的常用方法:
方法 | 描述 |
---|---|
public void add(int index, E element) |
将指定的元素,添加到该集合中的指定位置上 |
public E get(int index) |
:返回集合中指定位置的元素 |
public E remove(int index) |
移除列表中指定位置的元素, 返回的是被移除的元素 |
public E set(int index, E element) |
用指定元素替换集合中指定位置的元素,返回值的更新前的元素 |
List的子类:ArrayList集合
java.util.ArrayList
集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用多的功能为 查询数据、遍历数据,所以 ArrayList
是常用的集合。
List的子类:LinkedList集合
java.util.LinkedList
集合数据存储的结构是链表结构。方便元素添加、删除的集合。
方法 | 描述 |
---|---|
public void addFirst(E e) |
将指定元素插入此列表的开头 |
public void addLast(E e) |
将指定元素添加到此列表的结尾 |
public E getFirst() |
返回此列表的第一个元素 |
public E getLast() |
返回此列表的后一个元素 |
public E removeFirst() |
移除并返回此列表的第一个元素 |
public E removeLast() |
移除并返回此列表的后一个元素 |
public E pop() |
从此列表所表示的堆栈处弹出一个元素 |
public void push(E e) |
将元素推入此列表所表示的堆栈 |
public boolean isEmpty() |
如果列表不包含元素,则返回true |
(四)Set接口
java.util.Set
接口和 java.util.List
接口一样,同样继承自 Collection
接口,它与 Collection
接口中的方 法基本一致,并没有对 Collection
接口进行功能上的扩充,只是比 Collection
接口更加严格了。与 List
接口不同的是, Set
接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
- HashSet集合介绍
java.util.HashSet
是Set
接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。
HashSet
是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性 的方式依赖于:hashCode
与equals
方法。
(五)Collections
常用功能:
方法 | 描述 |
---|---|
public static <T> boolean addAll(Collection<T> c, T... elements) |
往集合中添加一些元素 |
public static void shuffle(List<?> list) |
打乱集合顺序 |
public static <T> void sort(List<T> list) |
将集合中元素按照默认规则排序 |
public static <T> void sort(List<T> list,Comparator<? super T> ) |
将集合中元素按照指定规则排序 |
- Comparator比较器
public static <T> void sort(List<T> list,Comparator<? super T> )
可以方便的设定比较规则并实现排序等功能。
(三)Map集合
学习过python的小伙伴们都知道,python里面有个叫做 字典 的傻孩子,它被用于存储键值对儿。
而Java里面的map集合就是实现这样的功能的。
上图明确的告诉大家,键值对的一些特点与性质。
- 相比
collection
中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 map
中,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
map接口中的常用方法
方法 | 描述 |
---|---|
put(K key , V value) |
把指定的键与指定的值添加到Map集合中。 |
putAll(Map<? extends K , ? extends V> m) |
将指定的Map集合全部添加到该集合 |
clear() |
将集合内所有的键值对清除 |
containsKey(Object key ) |
返回类型为布尔型,判断该Key中是否包含指定的对象 |
containsValue(Object value) |
返回类型为布尔型,判断该集合中的Value是否百翰指定对象 |
isEmpty() |
判断是否为空 |
remove(Object key) |
将指定key-value映射从该集合中删除 |
size() |
返回该集合包含的key-value映射的个数 |
entrySet() |
返回该集合包含的所有键值对的Set集合 |
keySet() |
返回集合中的所有的key的Set集合 |
get(Object key) |
返回指定的key映射的值,若不存在该key则返回null |
hashCode() |
返回该值的哈希值 |
map的用法:
public class MapDemo {
public static void main(String[] args) {
//创建 map对象
HashMap<String, String> map = new HashMap<String, String>(); //添加元素到集合
map.put("黄晓明", "杨颖");
map.put("文章", "马伊琍");
map.put("邓超", "孙俪");
System.out.println(map);
//String remove(String key)
System.out.println(map.remove("邓超"));
System.out.println(map);
// 想要查看 黄晓明的媳妇 是谁
System.out.println(map.get("黄晓明"));
System.out.println(map.get("邓超"));
}
}
map遍历的方法:
public class MapDemo01 {
public static void main(String[] args) {
//创建Map集合对象
HashMap<String, String> map = new HashMap<String,String>();
//添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
//获取所有的键 获取键集
Set<String> keys = map.keySet();
// 遍历键集 得到 每一个键
for (String key : keys) {
//key 就是键
//获取对应值
String value = map.get(key);
System.out.println(key+"的CP是:"+value);
}
}
}
Entry键值对对象
我们已经知道, Map
中存放的是两种对象,一种称为key(键),一种称为value(值),它们在 Map 中是一一对应关 系,这一对对象又称做 Map 中的一个 Entry
(项) 。 Entry 将键值对的对应关系封装成了对象。即键值对对象
,这 样我们在遍历 Map 集合时,就可以从每一个键值对( Entry )对象中获取对应的键与对应的值。
public Set<Map.Entry<K,V>> entrySet() : 获取到Map集合中所有的键值对对象的集合(Set集合)
使用
public class MapDemo02 {
public static void main(String[] args) {
// 创建Map集合对象
HashMap<String, String> map = new HashMap<String,String>();
// 添加元素到集合
map.put("胡歌", "霍建华");
map.put("郭德纲", "于谦");
map.put("薛之谦", "大张伟");
// 获取 所有的 entry对象 entrySet
Set<Entry<String,String>> entrySet = map.entrySet();
// 遍历得到每一个entry对象
for (Entry<String, String> entry : entrySet) {
// 解析
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"的CP是:"+value);
}
}
}
二、迭代器
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口 java.util.Iterator
。 Iterator 接口也是Java集合中的一员,但它与 Collection 、 Map 接口有所不同, Collection 接口与 Map 接口主要用于存储元素,而 Iterator 主要用于迭代访问(即遍历) Collection 中的元 素,因此 Iterator 对象也被称为迭代器。
想要遍历Collection集合,那么就要获取该集合迭代器完成迭代操作。
public Iterator iterator() : 获取集合对应的迭代器,用来遍历集合中的元素
public E next() :返回迭代的下一个元素
public boolean hasNext() :如果仍有元素可以迭代,则返回 true
使用:
public class IteratorDemo {
public static void main(String[] args) {
// 使用多态方式 创建对象
Collection<String> coll = new ArrayList<String>();
// 添加元素到集合
coll.add("串串星人");
coll.add("吐槽星人");
coll.add("汪星人");
//遍历
//使用迭代器 遍历 每个集合对象都有自己的迭代器
Iterator<String> it = coll.iterator();
// 泛型指的是 迭代出 元素的数据类型
while(it.hasNext()){ //判断是否有迭代元素
String s = it.next();//获取迭代出的元素
System.out.println(s);
}
}
}