java标准库中被使用最多的类型
除Map外, 其他集合类的根接口
java.util
主要提供以下三种类型的集合
List
: 一种序列表的集合.Set
: 保证没有重复元素的集合.Map
: 通过键值(key-value)查找的映射表集合.ArrayList
内部使用数组来存储元素
List<E>
接口, 主要方法
void add(E e)
void add(int index, E e)
int remove(int index)
int remove(Object e)
E get(int index)
int size()
LinkedList
通过链表也实现了List
接口LinkedList
中, 每个元素都指向下一个元素null
List.of()
进行创建, 根据给定元素快速创建List
null
Iterator
iterator()
创建hasNext()
是否含有下一个元素E next()
返回下一个元素 List<String> list = List.of("apple", "pear", "banana");
for (Iterator<String> it = list.iterator(); it.hasNext();) {
String s = it.next();
System.out.println(s);
}
Iterator
遍历List
永远都有最高效的方式for each
使用的就是Iterator
遍历Iterable
接口的集合都可以直接使用for each
进行遍历toArray()
方法直接返回一个Object[]
数组: 造成信息丢失toArray(T[])
传入一个相同类型的Array, List自动把元素复制到传入的Array
中
Number[] arr = list.toArray(Number[]::new);
: 函数式写法List.of(T...)
List.of
生成的List
是只读的.add()
, remove()
方法会抛出错误.boolean contains(Object o)
方法判断List
是否包含某个指定元素.int indexOf(Object o)
方法可以返回某个元素的索引instanceof
判断传入的实例, 是否为当前的类型Objects.equals()
进行判断, 基本类型, 使用==
Objects.equals
判断两个null
, 他们相等.key
快速查找value
(元素)Map<K, V>
是一种键-值
映射表put(K key, V value)
方法时, 即将key
和value
做了映射关系V get(K key)
时, 就可以通过key, 获取value
key
, 不存在, 返回nullboolean containsKey(K key)
方法, 判断key是否存在.keySet()
获取key
的集合, 在用for each
遍历集合.entrySet()
同时遍历key
和value
key
的对象, 必须正确覆写equals
方法key
对象, 进行hashCode()
, 返回一个int
整数key
的对象, 必须正确覆写hashCode()
方法hashCode()
必须相等hashCode()
尽量不相等Objects.hash(a, b, c)
进行覆写HashMap
默认大小只有16, int index = key.hashCode() & 0xf
key
Map<String, Integer> map = new HashMap<>(1000)
HashMap
实际上不是直接存储的实例对象, 而是对应一个entry
的list
key.hashCode()
以后相同, 就放到不同的两个entry
上面.entry
key
是enum
对象value
enum
类型的key, 直接定义到内部数组的索引, 不需要计算hashCode()
EnumMap
使用的时候, 持有Map
接口SortedMap
会对key
进行排序. SortedMap
是接口, TreeMap
是实现类key
的顺序进行排序key
必须实现Comparable
接口String.compareTo()
在两个值相同的时候, 返回0
, 就是判断一样TreeMap
的key
不需要实现equals
和hashCode
String
-String
Properties
表示一组配置Properties
实例load()
读取文件getProperty()
获取配置InputStream
, 表示字节流, 所以文件字节流和jar包中的资源流都可以.properties
文件, 反复load()
读取, 后面读取的key-value
会覆盖已经读取的Hashtable
派生, 只使用getProperty
和setProperty
, 不适用继承的get()
和put()
方法setProperty()
修改属性, 使用store()
进行存储load(InputStream)
默认总是以ASCII编码, 所以会导致读到乱码load(Reader)
方法解决, 一个字节流, 一个字符流, 字符在内容已经char
类型表示了, 不涉及编码问题Set
boolean add(E e)
boolean remove(Object e)
boolean contains(Object e)
Set
是只存key, 不存value的mapSet
中的元素需要实现equals()
和hashCode()
HashSet
仅仅是对HashMap
的一个简单封装Set
接口不能保证有序, 但是SortedSet
接口可以保证有序TreeSet
可以保证有序, 元素正确实现Comparable
接口int size()
: 获取队列长度boolean add(E)/boolean offer(E)
添加元素到队尾E remove() / E poll()
获取首元素并从队列中删除E element() / E peek()
获取首元素但不从队列中删除add()
添加失败, 抛出异常 / offer()
添加失败, 返回falseremove()
, 抛出异常 / pull()
, 返回null 所以不要把null放到队列pull()
获取并删除 / peek()
获取不删除, 重复使用LinkedList
即实现了List
接口, 又实现了Queue
接口.remove()
或者poll()
方法, 返回的总是优先级最高的元素Comparable
接口, 从而根据优先级进行出队addLast()
/ addFirst()
Queue
, 但最好不要使用add()
等方法Deque
的实现类ArrayList
和LinkedList
push(E)
/ addFirst(E)
E pop()
/ E removeFirst()
E peek()
/ E peekFirst()
Stack
接口, 使用Deque
进行模拟, 只使用push, pop, peek
方法jvm使用栈结构维护方法的调用顺序
调用的时候, 会先把参数压栈, 然后执行对应的方法; 方法返回时, 返回值压栈, 调用方法通过出栈操作获得方法返回值.
调用方法有容量现在, 调用过多会造成栈溢出: StackOverflowError
对整数进行进制转换
计算表达式后缀
for each
循环 for (Iterator<String> it = list.iterator();it.hasNext();) {
String s = it.next();
System.out.println(s);
}
Iterable
接口, 要求返回一个Iterator
对象Iterator
对象迭代集合内部数据import java.util.*;
public class Main {
public static void main(String[] args) {
ReverseList<String> rList = new ReverseList();
rList.add("A");
rList.add("B");
rList.add("C");
for (String s : rList) {
System.out.println(s);
}
}
}
class ReverseList<T> implements Iterable<T> {
private List<T> list = new ArrayList<>();
public void add(T t) {
list.add(t);
}
@Override
public Iterator<T> iterator() {
return new ReverseIterator(list.size());
}
class ReverseIterator implements Iterator<T> {
int index;
ReverseIterator(int index) {
this.index = index;
}
@Override
public boolean hasNext() {
return index > 0;
}
public T next() {
index--;
return ReverseList.this.list.get(index);
}
}
}
通过内部类实现Iterator
接口
这个内部类, 可以直接访问对应外部类的全部字段和方法
使用外部类.this
获取
集合类实现了Iterable
接口, 提供iterator
方法, 返回Iterator
实例
Collections
工具类, 提供一系列操作集合的方法List<T> emptyList()
Map<T> emptyMap()
Set<T> emptySet()
.of()
相同: 空集合是不可变集合, 无法添加或者删除元素. List<String> list1 = List.of();
List<String> list2 = Collections.emptyList();
List<T> singletonList(T t)
Map<K, V> singletonMap(K k, V v)
Set<T> singleton(T t)
返回的单元素集合, 或者多个元素集合, 也是不可变的, 还是.of()
方便
Collections.sort()
进行排序, 修改List
中元素的位置Collections.shuffle()
进行洗牌, 打乱元素位置List<T> uList = Collections.unmodifiableList(list);
List<T> synchronizedList(List<T> list)
原文:https://www.cnblogs.com/zhangrunhao/p/12678449.html