Collection
Set
Set继承于Collection接口,是一个不允许出现重复元素,并且无序的集合,主要有HashSet和TreeSet两大实现类.Set接口定义的常用方法如下:
序号 | 变量和类型 方法 | 描述 |
---|---|---|
1 | int size() | 返回此集合中的元素数 |
2 | boolean add(E e) | 如果指定集合中的所加元素尚未存在,则将其添加到此集合中 |
3 | boolean remove(Objecto) | 如果存在,则从该集合中移除指定的元素 |
4 | boolean contains(Object o) | 如果此set包含指定的元素,则返回 true 。 |
5 | Iterator<E> iterator() | 返回此set中元素的迭代器 |
1.新增功能:static Set of(E… elements) 返回包含任意数量元素的不可修改集,
其他方法从Collection继承
2.遍历方式:
foeach
//遍历及打印
for(String str:set){
System.out.println(str);
}
iterator
Iterator<String> it = set.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
3.注:其存放数据的顺序与内部真实存储的顺序可能不一致
HashSet
无序的,不可重复–>是由HashMap维护的
-
底层结构:哈希表:数组+链表+红黑树
1).hashCode():来自Object类
默认根据对象的地址通过指定的哈希算法得到的整数值 ,整数的hashCode()方法的返回值就是原数本身。重写hashCode根据对象的内容计算而非根据地址计算,相等就在一个位桶里,再在一个柆桶中用equals实现去重。
2).equals():比较对象是否相等,重写equals,比较对象的值而不是地址。
a.对要存储的数据调用hashCode()方法得到一个整数值,用来表示这个数据:int num=数据对象,hashCode();
b.对第一步得到的整数值 num进行某种hash算法,得到一个索引值,对应数组的位桶。
c.找到对应的位桶,拿当前要存储的数据与桶中已有的数据比较是否相等。
比较规则:对象1.equals(对象2)
相等去重不添加,与桶中的数据不相等,添加
d.桶中的数据由单向链表结构存储
哈希表中的数据结构是一个节点数组Node[],每一个索引位置都是单向链表的首节点(链表头节点)
哈希表中当链表的长度>8,数组的长度>64,会把链表变为红黑树(jdk1.8之后)
-
特点:查询、增删效率高,无序,去重
-
应用场景:存储数据由单个值决定的情况下,想要去重的情况下,适合使用Hashset
-
无新增方法
TreeSet
无序,去重–>是由Treemap维护的
-
底层结构:红黑树
-
特点:默认升序排序
-
新增方法:数据大小比较的相关方法,因为红黑树中的数据已经比较过大小,默认升序。
1.不能存储不同类型的数据,不然会出现ClassLastException(类型转换异常).解决方法:
指定自定义引用类型数据的比较规则
a.内部比较器,自然排序(定义在类的内部,是一种默认的比较规则 )
b.外部比较器,定制排序(定义在javabean类的外部,单独指定也可以在其初始化的时候重写其 comparator)
Map
存储键值对数据(元素的集合,键值对的集合)K-V键值对
key,value可以为任意引用数据类型的数据;
key --> 唯一的,无序的 -->set集合
value --> 无序的,可重复的 -->Collection
键值对为一个映射关系
key --> 映射 -->value
键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类型的,就像数组中的元素还可以是数组一样
Map 接口主要有两个实现类:HashMap 类和 TreeMap 类。(都继承了AbstractMap)
其中,HashMap 类按哈希算法来存取键对象,而 TreeMap 类可以对键对象进行排序。
相同点:HashMap非线程安全,TreeMap非线程安全
方法名称 说明 V get(Object key) 返回 Map 集合中指定键对象所对应的值。V 表示值的数据类型 V put(K key, V value) 向 Map 集合中添加键-值对,返回 key 以前对应的 value,如果没有, 则返回 null V remove(Object key) 从 Map 集合中删除 key 对应的键-值对,返回 key 对应的 value,如果没有,则返回null Set entrySet() 返回 Map 集合中所有键-值对的 Set 集合,此 Set 集合中元素的数据类型为 Map.Entry Set keySet() 返回 Map 集合中所有键对象的 Set 集合
其遍历方式:
-
keySet()获取集合中的所有的key
-
values() 获取集合中所有value
-
entrySet()返回多个Map.Entry类型的键值对对象,一个Set集合
Set<Map.Entry<K,V>> 引用=对象.entrySet()
HashMap
底层:哈希表(数组、链表、红黑树)
特点:查询、增删效率高
新增方法:无
遍历方式:与Map相同
通话null键与null值
TreeMap
底层结构:红黑树
特点:根据key对数据做升序排序
新增功能:1. 根据key做去重,根据key做排序
要求:key指定比较规则(内部比较器,外部比较器)
Properties
存储的键值对都是字符串
Properties可以保存到流中或从流中加载
配置文件properties格式,符合Properties的特点
public static void main(String[] args) throws IOException {
Properties pro=new Properties();
pro.setProperty("zhangsan","18");
pro.setProperty("lisi","19");
//void load(InputStream inStream) 从输入字节流中读取属性列表(键和元素对)。
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties"));
//void store(OutputStream out, String comments) 将此 Properties表中的此属性列表(键和元素对)以适合使用 load(InputStream)方法加载到 Properties表的格式写入输出流。
pro.store(new FileOutputStream(new File("D:\\training\\src\\db.properties")),"peizhi");
System.out.println(pro);
}
Collections工具类
- java.lang.Object
-
- java.util.Collections
类 java.util.Collections 提供了对Set、List、Map操作的工具方法。
例:sort(),shuffle(),reverse(),fill(),binarySearch()
public static void main(String[] args) {
/*
void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
void shuffle(List) //对List容器内的元素进行随机排列
void reverse(List) //对List容器内的元素进行逆续排列
void fill(List, Object) //用一个特定的对象重写整个List容器
int binarySearch(List, Object)//对于顺序的List容器,采用折半查找的方法查找特定对象
*/
List<Integer> list = new ArrayList<>();
list.add(3);
list.add(1);
list.add(2);
list.add(5);
list.add(4);
System.out.println(list);
//sort 升序排序徐
Collections.sort(list);
System.out.println(list);
//sort(List<T> list, Comparator<? super T> c)
//shuffle 随机排序
//Collections.shuffle(list);
System.out.println(list);
//void reverse(List)翻转
//Collections.reverse(list);
System.out.println(list);
//binarySearch 如果找到返回索引,找不到返回-插入点-1
System.out.println(Collections.binarySearch(list,12));
}