1.Collection集合概述
集合顶层Collection包含List和Set。
List的实现类 包括ArrayList和LinkedList;
Set的实现类 包括HashSet(无序)和TreeSet(有序);
接口Map实现类 包括HashMap(无序)和TreeMap(有序)
数组和集合的区别:
a、数组长度固定,集合长度可变
b、数组存储的是同一种类型的元素,集合可以存储不同类型的数据
c、数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用类型
Collection接口存储一组不唯一,无序的对象
List接口存储一组不唯一,有序的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象
List 默认容量为10个;超出容量后,之后每次增加当前容量的50%

2.Collection集合的方法
a、添加功能:
boolean add(E e);//将指定的元素追加到此列表的末尾,返回boolean值
boolean add(int index, E element);//将指定的元素插入此列表中的指定位置
boolean addAll(Collection c);//添加一个集合的元素
public class Demo01Collection {
public static void main(String[] args) {
//创建集合对象,可以使用多态
Collection<String> coll = new ArrayList<>();
boolean b1 = coll.add("张三");
System.out.println(b1);//true
System.out.println(coll);//[张三]
}
}b、删除功能:
void clear();//从此集合删除所有元素
boolean remove(int index);//删除该索引处的元素
boolean remove(Object o);//删除指定的元素
c、判断功能:
boolean contains(Object o);//如果此列表中包含指定的元素,则返回true
boolean containsAll(Collection c);//判断集合中是否包含指定的集合元素
boolean isEmpty();//判断集合是否为空,集合是否为空
d、获取功能:
get(int index);//返回此列表中指定位置的元素
indexOf(Object o);//返回此列表中指定元素的第一次出现的索引,不包含则返回-1
e、交集功能:
boolean retainAll(Collection c);//两个集合都有的元素
假设有A、B两个集合,A对B做交集,最终结果保存在A中,B不变;返回值表示A是否发生过改变
f、长度功能:
int size();//返回此列表的元素数
set(int index,E element);用指定的元素替换列表中制动位置的元素
3.增强for循环
增强for循环:用来遍历集合和数组
格式:
for(集合/数组的数据类型 变量名: 集合名/数组名) {
sout(变量名);
}
public class Demo02Foreach {
public static void main(String[] args) {
demo01();
demo02();
}
public static void demo01() {
int[] arr = {1,2,3};
for (int i:arr) {
System.out.println(i);
}
}
public static void demo02() {
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
for (String s:list) {
System.out.println(s);
}
}
}4.Map集合概述
Map<key,value> 接口 专门处理键值映射数据的存储,可以根据键实现对值得操作
常用的实现类是HashMap
- put(K key,V value); //将制定的值与此映射中的指定的键关联
- keySet(); //返回此地图中包含的键的Set视图
- remove(Object key); //从地图中删除指定键的映射
- get(Object key); //返回到指定键所映射的值,或null
- containsKey(Object key); //如果此映射包含指定键的映射,则返回true
遍历Map集合:
a、使用迭代器Iterator
获取Iterator:Collection接口的iterate()方法
boolean hasNext(); //判断是否存在另一个课访问的元素
Objiect next(); //返回要访问的下一个元素(获取元素并移动到下一个位置)
hasNext 判断 next() 取出
Iterator it= c.keySet().iterator();//获取Iterator
while (it.hasNext()) {
System.out.println(c.get(it.next())); //不要多次使用it.next()方法
}
b、增强型的for循环
for(基本类型 别名:集合名 ){ }
Map集合的特点:
1.Map集合是一个双列集合, 一个元素包含两个值(一个key,一个value)
2.Map集合中的元素, key和value的数据类型可以相同,也可以不同
3.Map集合中的元素, key是不允许重复的, value是可以重复的
4.Map集合中的元素, key和value是一一对应
Map集合的第一种遍历方式:通过键找值的方式
Map集合中的方法:
Set<K> keySet() 返回此映射中包含的键的Set视图。
实现步骤:
1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
2.遍历set集合,获取Map集合中的每一个key
3.通过Map集合中的方法get(key) ,通过key找到value
public class Demo02KeySet {
public static void main(String[] args) {
//创建Map集合对象
Map<String,Integer> map = new HashMap<>();
map.put("陈萱琳",19);
map.put("陈小雨",18);
map.put("陈傻逼",17);
//1.使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合中
Set<String> set = map.keySet();
//2.遍历set集合,获取Map集合中的每一个key
//使用迭代器遍历set集合
Iterator<String> it = set.iterator();
while (it.hasNext()) {
String key =it.next();
//3.通过Map集合中的方法get(key) ,通过key找到value
Integer value = map.get(key);
System.out.println(key+"="+value);
}
}
}
5.ArrayList 与LinkedList的区别
ArrayList实现了长度可变的数组,在内存分配连续的空间。遍历元素和随机访问元素的效率比较高,查询效率高。
LinkedList采用链表存储方式。插入,删除元素时效率比较高。
6.Vector和ArrayList的异同
实现原理、功能相同,可以互用
主要区别:a、Vector线程安全。ArrayList重速度轻安全,线程非安全
b、长度需增长时,Vector默认增长一倍,ArrayList增长50%
小练习
计算一个字符串中每个字符出现次数
分析:
- 使用Scanner获取用户输入的字符串
- 创建一个Map集合,键代表字符,值代表次数
- 遍历字符串得到每个字符
- 判断Map中是否有该键
- 如果没有,第一次出现,存储次数为1;如果有,则说明已经出现过,获取到对应的值++,再次存储
- 打印最终结果
public class Test01StringNum {
public static void main(String[] args) {
//1.获取一个字符串对象
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String input = sc.next();
//2.创建一个Map集合
Map<Character,Integer> map = new HashMap<>();
//3.遍历字符串得到每个字符
for (char c:input.toCharArray()) {
//4.判断Map中是否有该键
if (map.containsKey(c)) {//key存在
Integer value = map.get(c);
value++;
map.put(c,value);
} else {
map.put(c,1);
}
}
//5.打印最终结果
for (Character key:map.keySet()) {
Integer value = map.get(key);
System.out.println(key+":"+value);
}
}
}