单例集合结构
Iterator接口
描述:用来遍历单例集合的。
常用方法:
E next():返回迭代的下一个元素。
boolean hasNext():如果仍然有元素,返回true。
简单使用:
public class a {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("123");
list.add("456");
list.add("789");
//每个集合都有自己的迭代器
Iterator<String> iterator = list.iterator();
//判断是否有迭代元素
while (iterator.hasNext()){
//取出迭代出的元素
String s = iterator.next();
System.out.println(s);
}
}
}
在while循环中操作集合元素,会出现并发修改异常。
List集合
特点:有序,元素可重复。
ArryList底层是一个Objects[],数组,在new的时候创建了一个长度为0的空Objects[],在第一次调用add的方法的时候,创建了一个一个长度为10的Objects[]数组。在扩容时是原有集合1.5倍。
int newCapacity = oldCapacity + (oldCapacity >> 1)
LinkedList集合
底层的数据结构是双向链表。
元素增删快,查找慢,线程不安全,运行速度快。
在get元素时采用了一个简单的二分法,进行查找。
Set集合
set集合没有重复元素(hashcode方法和equals方法)。
HashSet集合
无序(hashcode%数组长度)。
底层是由一个HashMap(哈希表)实现,值被存储为map的键,在添加元素时,会创建一个对象作为HashMap的值。
桶的数量>8,数组元素>=64,时会变成红黑树。
在存储对象时,对象应该重写hashcode和equals方法(不重写调用object的equals,比较地址值),否则会存入相同内容的对象。
LinkedHashSet
有序,不可重复。
单例集合遍历
1.iterator接口
2.增强for循环。
public class a {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("abc");
list.add("def");
list.add("ghi");
for (String s : list) {
System.out.println(s);
}
}
}
红黑树
约束:
1.节点可以时红色或者黑色的。
2.根节点时黑色的。
3.叶子节点(空节点)是黑色的
4.每个红色节点的子节点都是黑色的。
5.任何一个节点到其每一个叶子节点的所有路径上的黑色节点数相同。
特点:查找速度快,趋近于平衡树。
哈希表
哈希表是数组加链表或者红黑树。
保证元素唯一:
对象所属的hashcode方法和equals方法。hashcode不同一定不相等,hashcode相同用equals方法比较(默认是地址值)。
HashSet构造方法
空参构造方法创建HashSet集合对象,把加载因子指定为0.75,底层的数组table为null。第一次添加元素,数组长度变为16。
集合底层数据结构
ArrayList:object[]数组
LinkedList:双向链表
HashSet:哈希表(HashMap)
LinkedHashSet:LinkedHashMap
HashMap:数组+链表+红黑树
LinkedHashMap:HashMap+LinkedList
集合线程安全
线程安全:
vector(单例),HashTable(双列)
线程不安全:
单例:ArrayList,HashSet、TreeSet,LinkedList。
双列:HashMap,TreeMap
Map集合的遍历
public class a {
public static void main(String[] args) {
Map<String, String> map=new HashMap<String, String>();
map.put("张三1", "男");
map.put("张三2", "男");
map.put("张三3", "男");
//加强for循环
for (String s : map.keySet()) {
System.out.println(map.get(s));
}
//遍历键或者值
for (String s : map.keySet()) {
System.out.println(s);
}
for (String value : map.values()) {
System.out.println(value);
}
System.out.println("==============");
//加强for遍历键和值
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey());
System.out.println(entry.getValue());
}
}
}