文章目录
1. 集合
2. 集合体系结构
3. 单列集合
3.1 ArrayList集合
3.1.1 ArrayList特点
1.有序: 保证存入和取出元素的顺序是一致的
2.有索引: 可以通过索引的方式获取元素
3.可重复: 可以存储相同的内容
1.底层数据结构:数组
2.查询快: 元素有索引,元素内存空间连续
3.增删慢:
数组长度不可改变
需要频繁创建新数组,拷贝元素,销毁老数组
4.线程不同步,不安全,效率高
-------------JDK 1.0 Vector集合--------------
和ArrayList 唯一不同是:
有synchronized 修饰,线程同步,安全,效率低
3.1.2 构造方法
3.1.3 方法
- 删除方法
E remove(int index)
Removes the element at the specified position in this list.
* 删除指定索引的元素
* 底层用 ``System.arraycopy(elementData, index+1, elementData, index, numMoved);`` 将索引后面的元素整体向前移动一位,最后空出来的设为null,元素个数减一。
- toArray()
Object[] toArray()
Returns an array containing all of the elements in this list in proper sequence (from first to last element).
* 将集合返回数组
* 底层用System.arraycopy() ,都是数组拷贝。
3.1.4 ArrayList底层原理
- 底层基于Object[] 数组实现,增删需要做元素的移位操作。
3.1.5 遍历ArrayList删除特定元素,出现删不干净的现象
package com.arraylist_test;
import java.util.ArrayList;
public class Test01 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("b");
list.add("d");
list.add("e");
System.out.println(list);//[a, b, b, d, e]
//遍历删除所有元素 "b"
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b")) {
list.remove(i);
}
}
System.out.println(list);//[a, b, d, e] 发现漏删除
}
}
- 原因:
- 删除操作,会将后面的元素整体向前移位。
- 删除第一个"b" 索引是1,后面的元素整体向前移动一位。
- 此时 第二个"b" 索引有原来的2 变为了 1 。
- 但for循环 i 已经为2了,漏过了第二个"b"。
- 解决方法:
- 1 倒叙删除
for (int i = list.size() - 1; i >= 0; i--) {
if (list.get(i).equals("b")) {
list.remove(i);
}
}
- 2 删除操作后 i–
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b")) {
list.remove(i);
i--;
}
}
3.2 LinkedList集合
3.2.1 LinkedList特点
特点:
1.底层数据结构:双向链表
2.增删快: 元素分配不连续的,添加/删除元素,只需要找到位置,再修改对应节点保存地址的地方
3.查询慢:
要么从前向后查,要么从后向前查
4.线程不同步,不安全,效率高
3.2.2 方法
public void addFirst(E e) : 将指定元素插入此列表的开头。
public void addLast(E e) : 将指定元素添加到此列表的结尾。
public E getFirst() : 返回此列表的第一个元素。
public E getLast() : 返回此列表的最后一个元素。
public E removeFirst() : 移除并返回此列表的第一个元素。
public E removeLast() : 移除并返回此列表的最后一个元素。
public void push(E e) : 底层调: addFirst
public E pop() : 底层调: removeFirst
3.3 HashSet
package set;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class SetDemo01 {
public static void main(String[] args) {
Set<String> sets = new HashSet<>(); //无序 不重复 无索引
//Set<String> sets = new HashSet<>(); //有序 不重复 无索引
sets.add("Java");
sets.add("hhh");
sets.add("a");
sets.add("b");
sets.add("c");
System.out.println(sets);
}
}
package set;
import java.util.Objects;
public class Student {
private String name;
private int age;
private String gender;
public Student() {
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name) && Objects.equals(gender, student.gender);
}
@Override
public int hashCode() {
return Objects.hash(name, age, gender);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
package set;
import java.util.HashSet;
import java.util.Set;
public class SetDemo03 {
public static void main(String[] args) {
Set<Student> students = new HashSet<>();
students.add(new Student("zhx",20,"male"));
students.add(new Student("zhx",20,"male"));
students.add(new Student("libai",2077,"male"));
System.out.println(students);
}
}
package set;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo05 {
public static void main(String[] args) {
Set<Integer> sets = new TreeSet<>();
sets.add(12);
sets.add(23);
sets.add(21);
sets.add(88);
System.out.println(sets);//[12, 21, 23, 88]
Set<String> sets2 = new TreeSet<>();
sets2.add("d");
sets2.add("a");
sets2.add("C");
sets2.add("B");
sets2.add("A");
System.out.println(sets2);//[A, B, C, a, d]
}
}
package set;
public class Apple implements Comparable<Apple>{
private String name;
private int weight;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public Apple(String name, int weight) {
this.name = name;
this.weight = weight;
}
public Apple() {
}
@Override
public int compareTo(Apple o) {
return this.weight - o.weight;
}
@Override
public String toString() {
return "Apple{" +
"name='" + name + '\'' +
", weight=" + weight +
'}';
}
}
package set;
import java.util.Comparator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class SetDemo05 {
public static void main(String[] args) {
Set<Apple> sets3 = new TreeSet<>();
sets3.add(new Apple("a",10));
sets3.add(new Apple("b",10));
System.out.println(sets3); //[Apple{name='a', weight=10}]
Set<Apple> sets4 = new TreeSet<>(new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
//return o1.getWeight()-o2.getWeight();//升序
return o1.getWeight()-o2.getWeight(); //降序
}
});
}
}
3.4 Map
package map;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class MapDemo01 {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
maps.put("李宁",10);
maps.put("那可",-10);
maps.put("羊毛",1200);
maps.put(null,null);
System.out.println(maps);
}
}
package map;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
public class MapDemo01 {
public static void main(String[] args) {
Map<String,Integer> maps = new LinkedHashMap<>();
maps.put("李宁",10);
maps.put("那可",-10);
maps.put("羊毛",1200);
maps.put(null,null);
System.out.println(maps);
}
}
package map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo02 {
public static void main(String[] args) {
Map<String,Integer> maps = new HashMap<>();
maps.put("1",100);
maps.put("2",200);
maps.put("3",300);
maps.put("4",200);
maps.put("5",100);
System.out.println(maps);//{1=100, 2=200, 3=300, 4=200, 5=100}
//清空集合
// maps.clear();
// System.out.println(maps);
//判断集合是否为空
System.out.println(maps.isEmpty()); //false
//根据键获取值
Integer integer = maps.get("1");
System.out.println(integer ); //100
Integer integer1 = maps.get("");
System.out.println(integer1); //null
//根据键删除元素
maps.remove("5");
System.out.println(maps);//{1=100, 2=200, 3=300, 4=200}
//是否包含某个键
System.out.println(maps.containsKey("4"));//true
//是否包含某个值
System.out.println(maps.containsValue(200));//ture
//获取键的集合
Set<String> strings = maps.keySet();
System.out.println(strings);//[1, 2, 3, 4]
//获取值的集合
Collection<Integer> values = maps.values();
System.out.println(values);//[100, 200, 300, 200]
System.out.println(maps.size());
Map<String,Integer> maps2 = new HashMap<>();
maps2.put("a",100);
maps2.put("b",100);
maps2.put("c",100);
//将maps2 添加到maps
maps.putAll(maps2);
System.out.println(maps);//{1=100, a=100, 2=200, b=100, 3=300, c=100, 4=200}
System.out.println(maps2 );//{a=98, b=100, c=100}
}
}
Map集合的遍历
package map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo03 {
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<>();
maps.put("a", 100);
maps.put("b", 200);
maps.put("aaa", 300);
maps.put("c", 400);
maps.put("d", 200);
//方式一
Set<String> keys = maps.keySet();
for (String key : keys) {
System.out.println(key + ":" + maps.get(key));
}
//方式二
Set<Map.Entry<String, Integer>> entries = maps.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " : " + value);
}
}
}
maps.forEach(new BiConsumer<String, Integer>() {
@Override
public void accept(String s, Integer integer) {
System.out.println(s+" : "+integer);
}
});
maps.forEach((k,v)->System.out.println(k+" : "+v));