Set
继承Collection
不允许存储重复的内容
没有索引,不能用for 循环遍历
Treeset
特点:
无序,不可重复
底层结构: 红黑树进行存储
有序(自动从小到达升序排序)
可以定义比较规则,排序规则,并且可以使用去重原则
内部比较器|自然排序: 实现Comparable接口,重写comparaTo方法,在方法中定义比较规则.,默认的比较规则
//根据年龄进行比较,年龄相同就是一个对象
外部比较器|指定比较器:实现一个Comparator接口,重写compare()方法,方法的内部定义比较规则
//外部比较器定义的比较规则,现在只能比较Person对象,因为有泛型
HashSet
不允许存储重复的内容
没有索引,不能用for 循环遍历
无序,存储的与拿出的顺序可能不同
底层为Hashcode链表结构
处理HashSet存储的自定义引用数据类型去重问题:
需要对这个对象类型中重写hashcode和equals方法,然后这个两个的值都根据对象的成员属性值进行计算,而非地址值
hash表结构的特点是先调用hashcode,如果值形同的对象才会进一步调用equals方法进行比较内容,如果hashcode值不相同,根本不会比较equals方法的值
//重写equals方法,比较对象时比较对象的内容,非地址
Map
存储的每一个数据都是一个键值对形式存在的 k,v
key 无序的,唯一的 -->就是一个set集合
value 无序的,可重复的
一个key对象一个value,两者之间存在映射关系
如果存储数据的时候,key相同,value的值会覆盖
方法:
// V get(Object key)
System
// V remove(Object key)
System
Map的遍历方式:
1.获取所有key,根据key拿value keySet()
2.获取所有的value, values() 这中遍历方式无法获取key,只能遍历所有的value
3.entrySet() 获取所有的键值对,每一个键值对都是一个Map.ENTRY类型的数据,所有的Map.ENTRY类型的数据放在一个set集合中
import
HashMap
HashMap如果key是自定义的引用数据类型,去重问题:需要给key数据的类型重写hashcode和equals方法,能达到去重特点
key的值相同value的值不覆盖,需要在put之前进行判断
import
TreeaMap的特点是:其中数据会自动升序排序,根据学生的身高进行排序
1.去重
实现内部|外部比较器 比较的原则根据key,不能根据value
2.根据需求排序
key的内容决定排序和去重的原则,这是TreeMap默认的比较过程
public
Properties
Properties Properties 可保存在流中或从流中加载。 key与value都是字符串类型的数据
配置文件使用: *
1.项目右键->source floder->file->添加键值对类型的数据 *
2.通过Properties 的load方法,从资源文件中获取资源流,读入数据
![cca1cda8d8c0d152f5410ecbaee3502b.png](https://i-blog.csdnimg.cn/blog_migrate/3594029d1be285f2ca3fd50dbc5a4c16.jpeg)
![9e173813ea8e0ec2f92525ff96e8c026.png](https://i-blog.csdnimg.cn/blog_migrate/085f2b01513acf1d38457939b8e65b98.jpeg)
import
bd.properties内容
![452554fa52331fdf5f925c3ab9901a02.png](https://i-blog.csdnimg.cn/blog_migrate/b988e0621ae9095df6b2ebe183c90864.jpeg)
打印为
![90cc5100ebf6b49a4048c4dc6fc4cbb6.png](https://i-blog.csdnimg.cn/blog_migrate/aadda41ab18dd9082498ec20c4acfca9.png)
Collections
void sort(List) //对 List 容器内的元素排序,按照升序进行排序。
void shuffle(List) //对 List 容器内的元素进行随机排列
void reverse(List) //对 List 容器内的元素进行逆续排列
void fill(List, Object) //用一个特定的对象重写整个 List 容器
int binarySearch(List, Object)//采用折半查找的方法查找特定对象
public
如何解决HashMap线程不安全的问题:
1.使用Hashtable容器
2.static Map synchronizedMap(Map m) 使用Collecitons工具类中的
synchronizedMap,返回一个线程安全的map
3.juc包下的ConcurrentHashMap类 ---推荐使用
Thread
多线程: 多任务同时执行,多条路径执行,如果没有多任务,不需要使用多线程
线程和进程之间的区别:
1.进程包含1~n个线程
2.每个进程有自己的代码和运行空间
3.一系列线程共享继承的资源
4.进程是资源分配的最小单位,线程是cpu调度的最小单位
5.线程之间切换开销小,进程之间开销大.
多线程的开启方式
1.继承Thread类,重写run()方法,在方法中定义多线程的线程体
2.实现Runnable接口,重写run()方法,在方法中定义多线程的线程体 ---推荐
3.实现Callable接口,重写call()方法,在方法中定义多线程的线程体
多线程的状态问题
多线程的线程安全问题
public
模仿12306买票。假如有100张票,肯定是多个窗口售卖,但只有100张。现在有三个人来买。
public