概念
Java中的集合是工具类,可以存储任意数量的具有共同属性的对象。
**
集合和数组的区别
用数组存储固定长度的数据,数组是内存中一块连续的空间;
用集合存储动态变化的数据;
集合的应用场景
- 无法预测存储数据的数量(集合解决动态问题,数组解决静态问题);
- 同时存储具有一对一关系的数据;
- 需要进行数据的增删改查;
- 解决数据重复问题;
集合的框架体系
- Collection:存储类的对象Collection有三个子接口,List(序列)、Queue(队列)、Set(集)
- List:(序列) 有序的、允许重复的 主要实现类:ArrayList:长度动态增长的数组
- Queue:(队列) 有序的、允许重复的 主要实现类:LinkedList:链表的内容
- Set:(集)无序的、不允许重复的 主要实现类:HashSet:哈希集
- Map:键值对内容什么是键值对:比如学生都有对应的学号,通过学号就可以指向某个具体的学生。
- Map实现类HashMap(哈希表的意思,存储以键值对表示的形式)
List集合
- List是元素有序并且可以重复的集合,称为序列。
- List 是一个接口,它继承于Collection的接口。
- List可以精确地控制每个元素的插入位置,或删除某个位置的元素。
- List的两个主要实现类:ArrayList和LinkedList。
ArrayList
ArrayList底层是由数组实现的,长度动态增长。ArrayList中的元素可以为null且可以有多个。在列表尾部插入或删除数据非常有效,但是在中间则需要进行大量的数组复制,耗费较多资源。所以更适合查找和更新元素。
Collection接口和List接口中方法:
实现类ArrayList中构造器及方法:
举例:
import java.util.ArrayList;
import java.util.List;
public class ListDemo1 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("Java");
list.add("C");
list.add("C++");
list.add("Go");
list.add("Swift");
//输出列表中元素的个数
System.out.println("列表中元素的个数为:" + list.size());
//遍历输出所有的集合元素
System.out.println("*****************************");
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + ",");
}
//移除列表中的C++
System.out.println("\n*****************************");
//list.remove(2);
list.remove("C++");
System.out.println("移除列表中的C++元素后,集合元素为:");
for(int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + ",");
}
}
}
补充:
add方法的引用
可以添加String类型的数据,也可以根据指定索引位置进行添加,也可以添加另外一个list集合。
在创建ArrayList对象时,可以规定元素的类型,如
List<String> list = new ArrayList<String>();
查找方法:
contains(o);查找某个元素,返回值为布尔值;
indexOf(); 查找某个元素,返回值为元素的索引,若没有返回-1;
删除方法:
clear(); 清空;
remove(index); 根据指定索引删除;
remove(Object obj); 删除某个指定元素;
修改方法:
set(int index,E element); 根据指定索引替换元素
遍历方法:
for(String str : list) {
System.out.println(str);
}
Set集合
Set中元素无序且不可以重复,称为集。
HashSet是Set的一个重要实现类,称为哈希集。HashSet中的元素无序且不可以重复,HashSet中只允许一个null元素。HashSet底层是HashMap实现。HashSet具有良好的存取和查找性能,所以适合存取和查找的情况。
HashSet 类是按照哈希算法来存储集合中的元素,使用哈希算法可以提高集合元素的存储速度,当向 Set 集合中添加一个元素时,HashSet 会调用该元素的 hashCode() 方法,获取其哈希码,然后根据这个哈希码计算出该元素在集合中的存储位置。
Set<String> set = new HashSet<>();
新增方法:
add(); 添加元素;
查找方法:
contains(obj);查找是否有某个元素,返回值为布尔值;
删除方法:
remove(); 删除某个元素;
不要通过for循环遍历去删除,因为长度会变。
删除某个元素
Iterator<String> it = set.iterator();
while(it.hasNext()) {
String next = it.next();
if("b".equals(next)) {//"b"写在前面,防止空指针
it.remove();
}
}
修改方法:
可以先删除后添加,因为是无序的;
遍历方法:
利用迭代器(Iterator),Iterator接口可以以统一的方式对各种集合元素进行遍历;
hasNext()方法检测集合中是否还有下一关元素,它的返回值是boolean类型;
next()方法返回集合中的下一个元素,返回Object类型的对象。
// 在Set集合中没有取元素的方法
// 获取迭代器接口
Iterator it = set.iterator();
// 遍历迭代器并输出元素
while (it.hasNext()) {
System.out.print(it.next() + " ");
}
说明:元素存贮在迭代器中,再通过遍历迭代器来遍历存贮在迭代器中的元素,然后通过hasNext()判断迭代器中是否还有下一个元素,返回ture时再通过next()方法打印出集合中所有元素
Map集合
Map
- Map中的数据是以键值对(key-value)的形式存储的;
- key-value以Entry类型的对象实例存在;
- 可以通过key值快速地查找value;
- 一个映射不能包含重复的键;
- 每个键最多只能映射到一个值。
HashMap实现类
- 基于哈希表的Map接口的实现;
- 允许使用null值和null键;
- key值不允许重复;
- HashMap中的Entry对象是无序排列的。
Map<String, String> map = new HashMap<String, String>();
新增方法:
map.put("html", "超文本标记语言");
查找方法:根据key获取到value
删除方法:
修改方法:
遍历方法:获取到map所有key的
Set<String> keys = map.keySet();
for(String str : keys) {
System.out.println(map.get(str));
}