HashSet
基本类型会自动去重
引用类型需重写hashCode和equals方法实现去重
处理HashSet存储的自定义引用数据类型去重问题:
- 需要对这个对象类型中重写hashcode和equals方法,然后这个两个的值都根据对象的成员属性值进行计算,而非地址值
- hash表结构的特点是先调用hashcode,如果值形同的对象才会进一步调用equals方法进行比较内容,如果hashcode值不相同,根本不会比较equals方法的值
TreeSet
TreeSet: 无序,不可重复
- 底层结构: 红黑树进行存储
- 特点: 有序(自动从小到达升序排序)
- 可以定义比较规则,排序规则,并且可以使用去重原则
- 内部比较器|自然排序: 实现Comparable接口,重写comparaTo方法,在方法中定义比较规则.,默认的比较规则
- 外部比较器|指定比较器:实现一个Comparator接口,重写compare()方法,方法的内部定义比较规则
Map
Map:存储的每一个数据都是一个键值对形式存在的 k,v
key 无序的,唯一的–>就是一个set集合
value无序的,可重复的
一个key对象一个value,两者之间存在映射关系
如果存储数据的时候,key相同,value的值会覆盖
map中,HashMap的去重,根据Map的key进行计算
TreeMap的去重+排序,根据Map的key进行计算
如果一个key,想要对多个value值,可以把多个value存在一个容器中
Map的遍历方式
- 获取所有key,根据key拿value keySet()
- 获取所有的value, values()这种遍历方式无法获取key,只能遍历所有的value
- entrySet()获取所有的键值对,每一个键值对都是一个Map.ENTRY类型的数据,所有的Map.ENTRY类型的数据放在一个set集合中
TreeMap
TreeaMap 去存储自定义的引用数据类型的数据key是自定义的引用数据类型
TreeaMap的特点是:其中数据会自动升序排序,
- 实现的步骤:
-
1.去重 实现内部|外部比较器 比较的原则根据key,不能根据value
-
2.根据需求排序
-
key的内容决定排序和去重的原则,这是TreeMap默认的比较过程
Collection工具类
Collections操作容器的工具类:
void sort(List) //对 List 容器内的元素排序,按照升序进行排序。
void shuffle(List) //对 List 容器内的元素进行随机排列
void reverse(List) //对 List 容器内的元素进行逆续排列
void fill(List, Object) //用一个特定的对象重写整个 List 容器
int binarySearch(List, Object)//采用折半查找的方法查找特定对象
如何解决HashMap线程不安全的问题:
1.使用Hashtable容器
2.static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 使用Collecitons工具类中的synchronizedMap,返回一个线程安全的map
3.juc包下的ConcurrentHashMap<K,V>类 —推荐使用
Properties
Properties Properties 可保存在流中或从流中加载。 key与value都是字符串类型的数据
- 配置文件使用:
- 1.项目右键->source floder->file->添加键值对类型的数据
- 2.通过Properties 的load方法,从资源文件中获取资源流,读入数据
线程
-
多线程:
-
多任务同时执行,多条路径执行,如果没有多任务,不需要使用多线程
-
线程和进程之间的区别:
-
1.进程包含1~n个线程
-
2.每个进程有自己的代码和运行空间
-
3.一系列线程共享继承的资源
-
4.进程是资源分配的最小单位,线程是cpu调度的最小单位
-
5.线程之间切换开销小,进程之间开销大.
-
多线程的开启方式(重点)
-
1.继承Thread类,重写run()方法,在方法中定义多线程的线程体
-
2.实现Runnable接口,重写run()方法,在方法中定义多线程的线程体 —推荐
-
3.实现Callable接口,重写call()方法,在方法中定义多线程的线程体优点: 1)抛出异常 2)返回值
-
多线程的状态问题
-
多线程的线程安全问题 (重点)
-
线程通信问题