java List,Set,Map,Properties
1. List
Collection 的子接口
List接口特点:
- 有下标
- 有序性
- 可重复
1.1ArrayList 数组列表
底层采用数组结构——查询块,增删慢
方法:
- 增加
- add(T t);//尾部添加
- add(int index,T t);//指定位置添加
- 删除
- remove(Object o);//按值删除
- remove(int index);//按位置删除
- 修改
- set(int index,E e);
- 查询
- get(int index);
- 其他
- size();//长度
- clear();//清除所有
- contains(Object o);//判断这个值是否存在
- toArray();//转换为数组
- iterator();//实现迭代
- isEmpty();//判断为不为空
1.2LinkedList 链表
底层采用链表结构——查询慢,增删快
LinkedList 实际开发过程中对一个集合元素的添加和删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法
方法:
- ArrayList的全部方法
- addFirst(E e);//插入到头部
- addLast(E e);//插入到尾部
- getFirst();//拿第一个
- getLate();//拿最后一个
- removeFirst();//移除并返回第一个
- removeLast();//移除并返回会后一个
- pop();// 弹出
- push(E e);// 压如
Vector
底层采用数组结构——查询块,增删慢
方法参考api
2. Set
Collection 的子接口
Set接口特点:
- 无下标
- 无序性(LinkedHashSet和TreeSet除外)
- 不重复
2.1 HashSet 哈希集
底层采用Hash表 查询比数组还快,增删快
方法几乎和Collection一样
2.2 LinkedHashSet 链式
底层采用 链表+Hash表, 查询快,增删快
方法几乎和Collection一样
哈希表结构
哈希表是采用数组和链表结构
-
添加元素判断是否重复
- 先判断新旧元素的哈希值
- 在判断就元素的equals
-
如果两个元素的哈希值一样
哈希表结构
挂载在和整个元素相同的数组上
如果还出现一个与这个相同的元素出现那么继续挂载
-
哈希表判断是否重复原理
- 如果都不相同 直接添加
- 如果Hash相同 则进行equals判断
如果返回true那么直接覆盖,如果返回false则挂载
总结:
- 只有哈希值相同,并且equals返回为true,才判定重复
- 如果想将自定义对象唯一性 那么在改自定义对象重写.hashCode(); 和 .equals();
2.3 TreeSet 不常用
哈希表的由来
是由真正的地址计算的,通过一种散列算法(哈希算法)
注意点
字符串的,hashCode() 不是使用的Object的.hashCode(),Sting类重写了.hashCode();
//jdk 源码:
public int hashCode() {
int h = hash;// 未赋值为零
if (h == 0 && value.length > 0) {//value 为字符串的内容
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
两个字符串的哈希值一样,单两个哈希值一样内容可以不一样
contains方法
contains 方法在set和List中是不一样的
-
ArrayList的contains方法
原理是只比较equals的返回值
他会和list中每个对比,如果出现在最后一个效率会很低 -
HashSet的contains方法
先判断哈希值
在使用equals方法
只有元素和判断元的元素 的哈希值相同,并且equals方法为true才判定包含
3. Map
3.1 hashMap
集合初始化时,指定集合初始值大小。 说明:HashMap使用如下构造方法进行初始化,如果暂时无法确定集合大小,那么指定默认值(16)即可。
map 集合不是Collection的子接口,所有没有迭代器
如果是自定义数据类型,那么就要从写HashSet和equals
- 增
T put(K key, V value);
//如果集合中存在该键,那么将覆盖并返回被覆盖的值 - 删
T remover(Object key); - 改
T put(K key, V value); - 查
T get(K key); - 遍历
- 键找值
Set keySet();public class MapDemo { public static void main(String[] args){ Map<String,String> strMap = new HashMap<>(16); strMap.put("test1","tests1"); strMap.put("test2","tests2"); strMap.put("test3","tests3"); strMap.put("test4","tests4"); Set<String> keys = strMap.keySet(); Iterator<String> iterator = keys.iterator(); while (iterator.hasNext()){ String temp = iterator.next(); System.out.println(temp+" "+strMap.get(temp)); } } }
- 键值对遍历
Set entrySet();
public class MapDemo { public static void main(String[] args){ Map<String,String> strMap = new HashMap<>(16); strMap.put("test1","tests1"); strMap.put("test2","tests2"); strMap.put("test3","tests3"); strMap.put("test4","tests4"); Set<Map.Entry<String,String>> entrySet = strMap.entrySet(); //迭代器 Iterator<Map.Entry<String,String>> iteSet = entrySet.iterator(); while (iteSet.hasNext()){ Map.Entry<String,String> entry = iteSet.next(); System.out.println(entry.getKey()+"====="+entry.getValue()); } //for循环 for (Map.Entry<String, String> stringStringEntry : entrySet) { System.out.println(stringStringEntry.getValue()); } } }
- 键找值
3.2 LinkedHashMap
4 Properties
属性集,
class Properties extends HashTable implements Map
本质上是一个Map集合
- Properties是一个持久的属性集
它具有自己写数据到文件的方法 - Properties是没有泛型的,泛型是固定的<String,String>
- Properties 具有Map的全部方法
- Properties 特有方法
- String getProperty(String key)
用指定的键在此属性列表中搜索属性的值,和Map的get一样 - Object setProperty(String key, String key)
调用Hash的方法put,添加键值对, - Set<String> stringPropertyNames()
返回此属性列表中的键集
- String getProperty(String key)
demo:
public static void read() throws IOException {
Properties ps = new Properties();
ps.load(new FileReader("name.properties"));
Set<String> psNames = ps.stringPropertyNames();
for (String psName : psNames) {
System.out.println(psName+" "+ps.getProperty(psName));
}
}
public static void write() throws IOException {
Properties ps = new Properties();
//创建
ps.setProperty("zhang shan","12");
ps.setProperty("li si","13");
ps.setProperty("wan wu","14");
//遍历
Set<String> psNames = ps.stringPropertyNames();
for (String psName : psNames) {
System.out.println(psName+" "+ps.getProperty(psName));
}
//持久化
ps.store(new FileWriter("name.properties"),"");
}