07 容器
容器的作用与概览
变量:存储单个数据的空间
数组[]:存储若干个相同类型数据的集合|容器
数组
数组作用
数组是一种容器,可以在其中放置一个或一组数据。从而,实现使用数组来管理一组数据。
数组优势
是一种简单的线性序列,可以快速的访问数组元素,效率高。如果从 效率和类型检 查的角度讲,数组是最好的。
数组劣势
- 一旦初始化以后,其长度就不可修改。
- 数组中提供的方法非常限,对于添加、删除、插入数据等操作,非常不便,同时效率不高。
- 获取数组中实际元素的个数的需求,数组没有现成的属性或方法可用
- 数组存储数据的特点:有序、可重复。对于无序、不可重复的需求,不能满足。
集合
一个独立元素的序列,这些元素都服从一条或多条规则。List 必须以插入的顺序保存元素, Set 不能包含重复元素, Queue 按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
作用
长度可变,结构不单一,有数组和链表,数组加链表的结构,可以根据数据选择他合适的集合进行操作,集合也封装了很多方法,让其存储过程固定。
集合优势
解决数组存储数据方面的弊端。
Map
- HashMap
- 使用1.8之前使用 位桶和链表实现(1.8改用红黑树),它是线程不安全的Map,方法上都没有synchronize关键字修饰。默认16,多线程下resize,rehash时可能会出现死锁,拖死系统。
- TreeMap
- 他具有一个很大的特点就是会对Key进行排序,使用了TreeMap存储键值对,再使用iterator进行输出时,会发现其默认采用key由小到大的顺序输出键值对,如果想要按照其他的方式来排序,需要重写compartor接口。
- HashTable
- hashTable是线程安全的一个map实现类,它实现线程安全的方法是在各个方法上添加了synchronize关键字。(现已不推荐使用,效率低。改用ConcurrentHashMap)
- ConcurrentHashMap
- 1.5加入,使用segment分段锁。从1.8开始采用了CAS+Synchronize技术来保障线程安全。底层采用数组+链表+红黑树的存储结构,也就是和HashMap一样。
List
- ArrayList
- 底层数据结构是数组,查询快,增删慢。
- 线程不安全,效率高
- 这个ArrayListObject[]数组的默认大小为16。默认数据量超过3/4会进行扩充操作。这里可以根据自己的使用大小,指定集合的大小 new ArrayList(num)(HashMap同原理)
- LinkedList
- 底层数据结构是链表,查询慢,增删快。
- 线程不安全,效率高
Set
- HashSet
- HashSet按照Hash算法来存储结合中的元素,因此具有良好的存取和查找的性能。
- LinkedHashSet
- 使用连表来维护元素,因为需要维护元素的插入顺序,所以性能略低,低于HashSet。
- TreeSet
- 采用红黑树的数据结构来存储集合元素,并且支持两种排序方法,自然排序和定制排序。注意:使用TreeSet时,保证添加的对象全都实现了Comparable接口,否则会添加失败,并且抛出ClassCastExecption异常。简单一句话,如果想要TreeSet正常运行,只能添加同一种类型的对象。
容器中的接口层次结构
Collection接口
Collection是一个接口,只是规定了一些方法,即作为一个容器就应该具有这些功能。在Collection中并没有任何的可以存储数据的地方,因此只是作为一个规范存在。
-
添加 add
-
删除 remove
-
记数 size
-
包含 contains
-
清空 clear
-
是否空 isEmpty
三种遍历
迭代器Iterator
boolean hasNext(); //判断是否有元素没有被遍历
Object next(); //返回游标当前位置的元素并将游标移动到下一个位置
void remove(); //删除游标左面的元素,在执行完next之后该 ,操作只能执行一次
//普通for循环
for(int i=0;i<T.size();i++){
System.out.println(T[i]);
}
//增强for循环
for(T t: T){
System.out.println(T[i]);
}
//迭代器
Iterator<String> it = list.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
//map 迭代器
Map<String,Integer> maps=new HashMap<>();
Set<String> set = maps.keySet();
Collection<Integer> values = maps.values();
Iterator<Map.Entry<String, Integer>> iterator = maps.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String, Integer> next = iterator.next();
System.out.println(next);
}
Properties
Properties为Hashtable的子类,要求键与值只能为字符串 ,不能为null,长与 配置文件(与外界交互 的信息) 即内存与存储介质(文件、数据库、网络、服务器内存等)交互。
Properties pro = new Properties();
// 通过当前线程获取ClassLoader
pro.load(Thread.currentThread().getContextClassLoader().getResourceAs Stream("db.properties"));
System.out.println(pro.getProperty("userName"));
db.properties
userName=zhangsan
userPwd=123
Collections工具类
类 java.util.Collections 提供了对Set、List、Map操作的工具方法。
Comparable接口
所有可以“排序”的类都实现了 java.lang.Comparable 接口, Comparable 接口中只有一个方法
public int compareTo(Object obj){
return this.value-obj.value;
}
返回0 this==obj
返回正数 this>obj
返回负数 this<obj
Comparator 接口
Comparator比较器,可以根据需要定制特定的比较规则 重写比较器
判断传入对象那个大。
emps.stream()
//重写比较器 Lambda知识
.sorted((e1, e2) -> {
if(e1.getAge().equals(e2.getAge())) {
return e1.getName().compareTo(e1.getName());
}else {
return e1.getAge().compareTo(e2.getAge());
}
})
.forEach(System.out::println);
返回0 e1==e2
返回正数 e1>e2
返回负数 e1<e2