集合
集合和数组区别
- 长度:集合可变,数组不可变
- 数据类型:集合只能是引用类型,数组可以是引用类型和基本数据类型
- 数据一致性:同一集合可以是不同的引用数据类型,同一数组只能是同一类型
各种集合的区别
- List:元素有序、元素可重复、有索引
- ArrayList:基于数组实现、遍历快(数组空间连续的)、增删慢(需要移动数据)
- LinkedList:基于双向链表实现、增删块(只需要改变指向)、遍历慢(数据分散在内存各个地方)
- Vuector:基于数组实现,过期
- Set:元素无序、元素不可重复、无索引
- HashSet:基于 HashMap 实现
- LinkedHashSet:有序 (存入顺序)
- TreeSet:有序 (自然排序) 基于 TreeMap 实现
- Map:key 不可重复
- HashMap:无序、key 不重复,基于数组 + 单链表 + 红黑树实现的
- LinkedHashMap:有序 (存入顺序)、key 不重复,基于数组 + 单链表 + 红黑树 + 双向链表实现的
- TreeMap:有序 (自然排序)、key 不重复,基于红黑树实现
单列集合
Collection 接口


package note;
import java.util.ArrayList;
import java.util.Collections;
public class CollectionsNote {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"b","a","c","d","e");
System.out.println(list);
Collections.shuffle(list);
System.out.println(list);
Collections.sort(list);
System.out.println(list);
}
list 接口
ArrrayList 实现类
package note;
import java.util.*;
import java.util.function.Predicate;
public class ArrayListNote {
public static void main(String[] args) {
ArrayList<String> strings = new ArrayList<>();
ArrayList<String> strings1 = new ArrayList<>();
System.out.println("strings.add(\"str1\") = " + strings.add("str1"));
System.out.println("strings.add(\"str2\") = " + strings.add("str2"));
System.out.println("strings.add(\"str3\") = " + strings.add("str3"));
System.out.println("strings.add(\"str5\") = " + strings.add("str5"));
strings.add(3,"str4");
System.out.println("strings1.add(\"string1\") = " + strings1.add("string1"));
System.out.println("strings1.add(\"string2\") = " + strings1.add("string2"));
System.out.println("strings.addAll(strings1) = " + strings.addAll(strings1));
System.out.println("Collections.addAll(strings, \"java\", \"hello\", \"learn\") = " + Collections.addAll(strings, "java", "hello", "learn"));
System.out.println("strings = " + strings);
System.out.println("strings.get(1) = " + strings.get(1));
System.out.println("strings.size() = " + strings.size());
System.out.println("strings.remove(1) = " + strings.remove(1));
System.out.println("strings.remove(new Integer(1)) = " + strings.remove(new Integer(1)));
System.out.println("strings.remove(\"str1\") = " + strings.remove("str1"));
System.out.println("strings.removeAll(strings1) = " + strings.removeAll(strings1));
System.out.println("strings = " + strings);
strings.removeIf(new Predicate<String>() {
@Override
public boolean test(String s) {
return s.contains("str");
}
});
System.out.println("strings = " + strings);
strings.clear();
System.out.println("strings.isEmpty() = " + strings.isEmpty());
System.out.println(strings);
System.out.println("Collections.addAll(strings, \"str\",\"str2\",\"str3\",\"something\",\"something\",\"str4\") = " + Collections.addAll(strings, "str", "str2", "str3", "something","something", "str4"));
System.out.println("strings = " + strings);
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if (next.equals("something")) {
iterator.remove();
}
}
System.out.println("strings = " + strings);
for (String string : strings) {
System.out.println(string);
}
Object[] objects = strings.toArray();
for (Object object : objects) {
System.out.println(object);
}
strings.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
});
}
}
LinkedList 实现类
package note;
import java.util.LinkedList;
public class LinkedListNote {
public static void main(String[] args) {
LinkedList<Integer> integers = new LinkedList<>();
System.out.println("integers.add(1) = " + integers.add(1));
System.out.println("integers.add(2) = " + integers.add(2));
System.out.println("integers.add(3) = " + integers.add(3));
System.out.println("integers.add(4) = " + integers.add(4));
System.out.println("integers.add(6) = " + integers.add(6));
integers.add(4,5);
System.out.println("integers = " + integers);
System.out.println("integers.removeLast() = " + integers.removeLast());
System.out.println("integers.remove(2) = " + integers.remove(2));
System.out.println("integers.remove(new Integer(2)) = " + integers.remove(new Integer(2)));
System.out.println("integers = " + integers);
integers.clear();
System.out.println("integers.add(0) = " + integers.add(0));
System.out.println("integers.add(0) = " + integers.add(0));
integers.addLast(2);
System.out.println("integers = " + integers);
}
package note;
import java.util.LinkedList;
public class LinkedListNote2 {
public static void main(String[] args) {
LinkedList<String> strings = new LinkedList<>();
strings.push("one");
strings.push("two");
strings.push("three");
System.out.println("strings = " + strings);
System.out.println("strings.pop() = " + strings.pop());
System.out.println("strings = " + strings);
strings.clear();
System.out.println("strings.offer(\"one\") = " + strings.offer("one"));
System.out.println("strings.offer(\"two\") = " + strings.offer("two"));
System.out.println("strings.offer(\"three\") = " + strings.offer("three"));
System.out.println("strings = " + strings);
System.out.println("strings.poll() = " + strings.poll());
System.out.println("strings = " + strings);
}
package note;
public class LinkedListNote3 {
public static void main(String[] args) {
CustomLinkedList list = new CustomLinkedList();
list.add(5);
list.add(2);
list.add(3);
list.add(4);
System.out.println(list);
System.out.println("list.getSize() = " + list.getSize());
System.out.println("list.remove(2) = " + list.remove(2));
System.out.println("list.getSize() = " + list.getSize());
System.out.println(list);
System.out.println("list.get(2) = " + list.get(2));
CustomLinkedList customLinkedList = new CustomLinkedList();
customLinkedList.add(0);
System.out.println("customLinkedList = " + customLinkedList);
}
}
class CustomLinkedList {
int size;
Node first;
Node last;
boolean add(int data) {
Node newNode = new Node(last, null, data);
if (size == 0) {
first = newNode;
} else {
last.next = newNode;
}
last = newNode;
size++;
return true; }
boolean remove(int index) {
Node thisNode = first;
if ((index < 0 || index >= size)) {
throw new NullPointerException();
} else if (index == 0) {
} else {
for (int i = 0; i < index; i++) {
thisNode = thisNode.next;
}
}
thisNode.prev.next = thisNode.next;
thisNode.next.prev = thisNode.prev;
size--;
return true; }
@Override
public String toString() {
String str = "[";
Node thisNode = first;
do {
str += thisNode.item + ",";
} while ((thisNode = thisNode.next) != null);
str = str.substring(0, str.length() - 1) + "]";
return str;
}
static class Node {
Node prev;
Node next;
int item;
public Node(Node prev, Node next, int item) {
this.prev = prev;
this.next = next;
this.item = item;
}
}
int get(int index) {
Node thisNode = first;
if (index == 0) {
return thisNode.item;
} else if (index >= size || index < 0) {
throw new NullPointerException();
} else {
for (int i = 0; i < index; i++) {
thisNode = thisNode.next;
}
return thisNode.item;
}
}
public int getSize() {
return size;
}
}
package note;
public class LinkedListNote4 {
public static void main(String[] args) {
SingleList singleList = new SingleList();
System.out.println("singleList.add(1) = " + singleList.add(1));
System.out.println("singleList.add(2) = " + singleList.add(2));
System.out.println("singleList.add(3) = " + singleList.add(3));
System.out.println("singleList.add(4) = " + singleList.add(4));
System.out.println("singleList = " + singleList);
System.out.println("singleList.delete(2) = " + singleList.delete(2));
System.out.println("singleList = " + singleList);
System.out.println("singleList.size() = " + singleList.size());
singleList.reverse();
System.out.println("singleList = " + singleList);
}
}
class SingleList {
private Node head = null;
private int size;
public boolean add(int data) {
boolean flag = false;
Node newNode = new Node(data, null);
if (size == 0) {
head = newNode;
} else {
Node lastNode = head;
for (int i = 0; i < size - 1; i++) {
lastNode = lastNode.next;
}
lastNode.next = newNode;
}
size++;
flag = true;
return flag;
}
public Integer delete(int index) {
Node lastNode2 = head;
int data = 0;
if (index < 0 || index >= size) {
throw new NullPointerException();
} else if (index == 0) {
data = head.data;
head = head.next;
} else {
for (int i = 0; i < index - 1; i++) {
lastNode2 = lastNode2.next;
}
data = lastNode2.next.data;
if (index == size - 1) {
lastNode2.next = null;
} else {
lastNode2.next = lastNode2.next.next;
}
}
size--;
return data;
}
public void reverse() {
Node thisNode = head;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
arr[i] = thisNode.data;
thisNode = thisNode.next;
}
thisNode = head;
for (int i = 0; i < size; i++) {
thisNode.data = arr[size - i - 1];
thisNode = thisNode.next;
}
}
public SingleList merge(SingleList other) {
SingleList newList = this;
Node thisNode = other.head;
do {
newList.add(thisNode.data);
} while ((thisNode = thisNode.next) != null);
return newList;
}
public int size() {
return this.size;
}
@Override
public String toString() {
String str = "[";
Node thisNode = head;
do {
str += thisNode.data + ",";
} while ((thisNode = thisNode.next) != null);
str = str.substring(0, str.length() - 1) + "]";
return str;
}
static class Node {
public int data;
public Node next;
public Node(int data, Node next) {
this.data = data;
this.next = next;
}
}
}
set 接口
HashSet 实现类
package note;
import java.util.Collections;
import java.util.HashSet;
public class HashSetNote {
public static void main(String[] args) {
HashSet<String> strings = new HashSet<>();
Collections.addAll(strings,"张三","李四","王五","赵六");
System.out.println(strings.add("张三"));
System.out.println(strings);
}
}
LinkedHashSet
package note;
import java.util.LinkedHashSet;
public class LinkedHashSetNote {
public static void main(String[] args) {
LinkedHashSet<String> strings = new LinkedHashSet<>();
strings.add("aaa");
strings.add("ccc");
strings.add("ddd");
strings.add("bbb");
System.out.println("strings = " + strings);
}
}
TreeSet
package note;
import java.util.Collections;
import java.util.TreeSet;
public class TreeSetNote {
public static void main(String[] args) {
TreeSet<String> strings = new TreeSet<>();
Collections.addAll(strings,"java","hello","world","a","c","b","d","f","e");
System.out.println("strings = " + strings);
}
}
双列集合
Map 接口


HashMap 实现类
package note;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
public class HashMapNote {
public static void main(String[] args) {
HashMap<String, Object> noby = new HashMap<>();
noby.put("name","noby");
noby.put("age",20);
noby.put("isMan",true);
noby.put("hobby","learn java");
System.out.println("noby.put(\"age\",21) = " + noby.put("age", 21));
System.out.println(noby.get("name"));
System.out.println(noby.size());
System.out.println("noby.remove(\"hobby\") = " + noby.remove("hobby"));
System.out.println(noby.containsKey("hobby"));
Set<String> keys = noby.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
System.out.println(next + " = " + noby.get(next));
}
Set<Map.Entry<String, Object>> entries = noby.entrySet();
Iterator<Map.Entry<String, Object>> iterator1 = entries.iterator();
while (iterator1.hasNext()) {
Map.Entry<String, Object> next = iterator1.next();
System.out.println(next.getKey() + "-" + next.getValue());
}
}
}
treeMap 实现类
package note;
import java.util.TreeMap;
public class TreeMapNote {
public static void main(String[] args) {
TreeMap<String, Object> kace = new TreeMap<>();
kace.put("ccc",22);
kace.put("aaa","kace");
kace.put("bbb","man");
System.out.println(kace);
}
}
LinkedHashMap 实现类
package note;
import java.util.LinkedHashMap;
public class LinkedHashMapNote {
public static void main(String[] args) {
LinkedHashMap<String, Object> noby = new LinkedHashMap<>();
noby.put("name","noby");
noby.put("age",21);
noby.put("gender","man");
System.out.println(noby);
}
}
Properties 实现类
package note;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties;
import java.util.Set;
public class PropertiesNote {
public static void main(String[] args) throws Exception{
Properties properties = new Properties();
properties.setProperty("one","hello");
properties.setProperty("two","world");
properties.setProperty("three","java");
System.out.println(properties.getProperty("one"));
Set<String> strings = properties.stringPropertyNames();
System.out.println(strings);
FileOutputStream fos = new FileOutputStream("D:\\IdeaProjects\\stage1\\day15\\src\\PropertiesStore.properties");
properties.store(fos,"这是一行注释");
loadProperties();
}
private static void loadProperties() throws Exception{
FileInputStream fis = new FileInputStream("D:\\IdeaProjects\\stage1\\day15\\src\\PropertiesStore.properties");
Properties properties1 = new Properties();
properties1.load(fis);
Set<String> set = properties1.stringPropertyNames();
System.out.println("以下遍历从配置文件读取到的键值对");
for (String s : set) {
System.out.println(s + "..." + properties1.getProperty(s));
}
}
}
快速失败和安全失败
- 安全失败(fail-safe)和快速失败(fail-fast)是两种处理并发访问数据结构时出现冲突的策略。
- 安全失败:指的是在并发访问数据结构时,不会抛出异常或导致程序崩溃,而是通过复制数据结构或使用锁等方式来保证并发安全。
- 快速失败:指的是在并发访问数据结构时,一旦检测到冲突,立即抛出 ConcurrentModificationException 异常,以避免出现数据不一致的情况。这种策略通常用于迭代器等需要遍历数据的场景。
package note;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class FailSafeNote {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer element = iterator.next();
list.remove(element);
}
}