集合框架
集合框架
1.List接口
2.Set接口
3.Map接口
一、集合的体系
1.Collection接口
也是一种集合,特征:无序,可重复
无序:没有游标
可重复:这个集合当中可以有相同的数据
注意:没有直接的实现类
Collection<String> list = Arrays.asList(new String[]{
"a1","b2",
"b22",
"c3"
});
迭代器获取和使用
作用:寻访集合内所有的元素
//获取Iterator接口
Iterator<String> iter = list.iterator();
while (iter.hasNext()){
String item = iter.next();
System.out.println(item);
}
package com.mine.demo01;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
Collection<String> list = Arrays.asList(new String[]{
"a1","b2",
"b22",
"c3"
});
//获取Iterator接口
Iterator<String> iter = list.iterator();
while (iter.hasNext()){
String item = iter.next();
System.out.println(item);
}
}
}
结果:
a1
b2
b22
c3
二、List集合
特点:有序,有重复
1.实现类
(1)ArrayList
是一个基于数组的集合,其扩容策略为0,默认为0,添加第一个元素后直接扩展到10,此后每次扩容50%
常用的API:
package com.mine.demo01;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main1 {
public static void main(String[] args) {
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = new ArrayList<>();
list2.add(4);
list2.add(5);
list2.add(6);
System.out.println(Arrays.toString(list1.toArray()));//输出list1 //[1, 2, 3]
System.out.println(Arrays.toString(list2.toArray()));//输出list2 //[4, 5, 6]
list1.addAll(list2);//将list2集合加到list1集合末尾
System.out.println(Arrays.toString(list1.toArray()));//[1, 2, 3, 4, 5, 6]
list1.add(0,-10);//指定位置插入
System.out.println(Arrays.toString(list1.toArray()));//[-10, 1, 2, 3, 4, 5, 6]
System.out.println("集合长度:"+list1.size()); //集合长度:7
//一种快速创建集合的方法
List list3 = Arrays.asList(new Integer[]{
100,
200,
300
});
System.out.println(Arrays.toString(list3.toArray())); //[100, 200, 300]
list1.addAll(0,list3);//将list3集合插入到list1集合的指定位置
System.out.println(Arrays.toString(list1.toArray()));//[100, 200, 300, -10, 1, 2, 3, 4, 5, 6]
//清空集合
// list1.clear();
// System.out.println(Arrays.toString(list1.toArray()));//[]
list1.remove(1);//删除指定位置的元素
System.out.println(Arrays.toString(list1.toArray()));//[100, 300, -10, 1, 2, 3, 4, 5, 6]
//判断是否存在某个元素
System.out.println(list1.contains(300));//true
//判断是否为空
System.out.println(list1.isEmpty());//false
//判断元素位置
System.out.println(list1.indexOf(300));//1
}
}
结果:
[1, 2, 3]
[4, 5, 6]
[1, 2, 3, 4, 5, 6]
[-10, 1, 2, 3, 4, 5, 6]
集合长度:7
[100, 200, 300]
[100, 200, 300, -10, 1, 2, 3, 4, 5, 6]
[100, 300, -10, 1, 2, 3, 4, 5, 6]
true
false
1
当集合元素为整数时,删除指定元素可能会出现异常。
迭代器的使用和集合接口(见上方Collection案例)
(2)LinkedList
双向链表:每次扩容增加一个对象,适合进行元素的增减,而不适合进行随机访问
常用API
package com.mine.demo01;
import java.util.Arrays;
import java.util.LinkedList;
public class Main2 {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
linkedList.addFirst("a");
linkedList.addLast("z");
System.out.println(linkedList.getFirst());//a
System.out.println(linkedList.getLast());//z
linkedList.removeFirst();//删除首个
System.out.println(Arrays.toString(linkedList.toArray()));//[z]
linkedList.removeLast();
System.out.println(Arrays.toString(linkedList.toArray()));//[]
// linkedList.removeFirst();
// linkedList.removeLast();//空集合继续删除会报错
System.out.println(linkedList.peekLast());//验证不移除
System.out.println(Arrays.toString(linkedList.toArray()));
System.out.println(linkedList.pollLast());//验证并移除
System.out.println(Arrays.toString(linkedList.toArray()));
}
}
结果:
a
z
[z]
[]
null
[]
null
[]
三、Set集合
特性:
1.无序、不可重复的集合
2.其核心实现类为HashSet
3.HashSet的本质是HashMap的key
1.创建集合
//创建集合
Set<String> s = new HashSet<String>();
2.元素的添加(重点)
//创建集合
Set<String> s = new HashSet<String>();
s.add("a");
s.add("a");
s.add("a");//只保留了最后一个(通过hash值的比较)
s.add("b");
s.add("c");
System.out.println(Arrays.toString(s.toArray()));
结果:
[a, b, c]
针对对象,可以重写hash来完成一致性判断,而不是重写equals(了解)
package com.mine.demo02;
import java.util.Objects;
public class Person {
private Integer id;
public void setId(Integer id){
this.id = id;
}
public Integer getId(){
return id;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return Objects.equals(id, person.id);
}
@Override
public int hashCode() {
return Objects.hash(id);//自己去设计发生hash碰撞的规则
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
'}';
}
}
package com.mine.demo02;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class Main1 {
public static void main(String[] args) {
//创建集合
Set<Person> s = new HashSet<>();
Person p1 = new Person();
p1.setId(1);
Person p2 = new Person();
p2.setId(1);
s.add(p1);
s.add(p2);
System.out.println(Arrays.toString(s.toArray()));
}
}
结果:
[Person{id=1}]
3.元素的遍历
package com.mine.demo02;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Main2 {
public static void main(String[] args) {
//遍历Set
Set<String> s = new HashSet<>();
s.add("a");
s.add("b");
s.add("c");
//通过迭代器
Iterator<String> iter= s.iterator();
while (iter.hasNext()){
String str = iter.next();
System.out.println(str);
}
//通过增强for循环
for(String str : s){
System.out.println(str);
}
}
}
结果:
a
b
c
a
b
c
四、Map集合
一种可以自行定义检索规则的数据结构,也叫字典
构成:key-Value
注意:
1.null值可以作为key
2.key具有唯一性
3.HashMap的key其本质是数组+链表构成的红黑树
package com.mine.demo02;
import java.util.*;
public class Main3 {
public static void main(String[] args) {
Map<String,Object> map = new HashMap<>();
//存值
map.put("k1",10);
map.put("k2",20);
map.put("k3",30);
map.put("k3",40);//覆盖前一个值
//取值
System.out.println(map.get("k1"));
System.out.println(map.get("k2"));
System.out.println(map.get("k3"));
//判断某个key是否存在
System.out.println(map.containsKey("k1"));//true
//判断某个Value是否存在
System.out.println(map.containsValue(20)); //true
//有一个特殊的key
map.put(null,500);
map.put(null,600);
map.put(null,700);//覆盖前面的值
System.out.println(map.get(null)); //700
//分别获取key和Value的集合
Set<String> keys = map.keySet();//不可重复
Collection<?> values = map.values();//可以重复
System.out.println(Arrays.toString(keys.toArray())); //[null, k1, k2, k3]
System.out.println(Arrays.toString(values.toArray())); //[700, 10, 20, 40]
}
}
结果:
10
20
40
true
true
700
[null, k1, k2, k3]
[700, 10, 20, 40]