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中, 每个元素都指向下一个元素nullList.of()进行创建, 根据给定元素快速创建ListnullIteratoriterator()创建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, 获取valuekey, 不存在, 返回nullboolean containsKey(K key)方法, 判断key是否存在.keySet()获取key的集合, 在用for each遍历集合.entrySet()同时遍历key和valuekey的对象, 必须正确覆写equals方法key对象, 进行hashCode(), 返回一个int整数key的对象, 必须正确覆写hashCode()方法hashCode()必须相等hashCode()尽量不相等Objects.hash(a, b, c)进行覆写HashMap默认大小只有16, int index = key.hashCode() & 0xfkeyMap<String, Integer> map = new HashMap<>(1000)HashMap实际上不是直接存储的实例对象, 而是对应一个entry的listkey.hashCode()以后相同, 就放到不同的两个entry上面.entrykey是enum对象valueenum类型的key, 直接定义到内部数组的索引, 不需要计算hashCode()EnumMap使用的时候, 持有Map接口SortedMap会对key进行排序. SortedMap是接口, TreeMap是实现类key的顺序进行排序key必须实现Comparable接口String.compareTo()在两个值相同的时候, 返回0, 就是判断一样TreeMap的key不需要实现equals和hashCodeString-StringProperties表示一组配置Properties实例load()读取文件getProperty()获取配置InputStream, 表示字节流, 所以文件字节流和jar包中的资源流都可以.properties文件, 反复load()读取, 后面读取的key-value会覆盖已经读取的Hashtable派生, 只使用getProperty和setProperty, 不适用继承的get()和put()方法setProperty()修改属性, 使用store()进行存储load(InputStream)默认总是以ASCII编码, 所以会导致读到乱码load(Reader)方法解决, 一个字节流, 一个字符流, 字符在内容已经char类型表示了, 不涉及编码问题Setboolean 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和LinkedListpush(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