java集合,List,Set和Map全面总结
程序员文章站
2022-05-14 09:27:16
...
集合
1.java集合分类
Java标准库自带的java.util包提供了集合类:Collection,它是除Map外所有其他集合类的根接口。
Java的java.util包主要提供了以下三种类型的集合:
List:一种有序列表的集合,例如,按索引排列的Student的List;
Set:一种保证没有重复元素的集合,例如,所有无重复名称的Student的Set;
Map:一种通过键值(key-value)查找的映射表集合,例如,根据Student的name查找对应Student的Map。
2.List
Collection
|--List 有序,可重复
|--ArrayList
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢。
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高
在末尾添加一个元素:void add(E e)
在指定索引添加一个元素:void add(int index, E e)
删除指定索引的元素:int remove(int index)
删除某个元素:int remove(Object e)
获取指定索引的元素:E get(int index)
判断是否包含元素:boolean contains(Object e)
修改指定索引的值:set(int index, E e)
获取链表大小(包含元素的个数):int size()
遍历:使用for each循环遍历, 或则iterator迭代器遍历
注意:调用List的contains(),放入的元素就需要实现equals()方法,
Java标准库提供的String、Integer等已经覆写了equals()方法
public boolean equals(Object o) {
if (o instanceof Person) {
Person p = (Person) o;
return Objects.equals(this.name, p.name) && this.age == p.age;
}
return false;
}
3.Set
HashSet
|--HashSet
底层数据结构是哈希表。
如何保证元素唯一性的呢?
依赖两个方法:hashCode()和equals()
开发中自动生成这两个方法即可
|--LinkedHashSet
底层数据结构是链表和哈希表
由链表保证元素有序
由哈希表保证元素唯一
|--TreeSet
底层数据结构是红黑树。
如何保证元素排序的呢?
自然排序
比较器排序
如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
HashSet是无序的,因为它实现了Set接口,并没有实现SortedSet接口;
TreeSet是有序的,因为它实现了SortedSet接口
它主要提供以下几个方法:
将元素添加进Set<E>:boolean add(E e)
将元素从Set<E>删除:boolean remove(Object e)
判断是否包含元素:boolean contains(Object e)
遍历:使用for each循环遍历
注意:正确使用Set必须保证:
放入的元素必须正确覆写equals()方法,相等的两个例调用equals()必须返回true;
放入的元素还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
如果两个对象相等,则两个对象的hashCode()必须相等;
如果两个对象不相等,则两个对象的hashCode()尽量不要相等。
4.Map
Map接口有三个比较重要的实现类,分别是HashMap、TreeMap和HashTable。
TreeMap是有序的,HashMap和HashTable是无序的。
Hashtable的方法是同步的,HashMap的方法不是同步的。这是两者最主要的区别
它主要提供以下几个方法:
将元素添加进Map<K, V>:put(K key, V value)
将元素从Map<K, V>删除:remove(K,key)
判断是否包含元素:boolean containsKey(K key)
获取元素 get(K,key)
判断是否包含key:boolean containsKey(Object e)
判断是否包含value:boolean containsValue(Object e)
替换指定键的值:replace(K key, V value)
遍历:使用for each循环遍历,keySet()和entrySet()
for (String key : map.keySet()) {
Integer value = map.get(key);
System.out.println(key + " = " + value);
}
for (Map.Entry<String, Integer> entry : map.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + " = " + value);
}
注意:正确使用Map必须保证:
作为key的对象必须正确覆写equals()方法,相等的两个key实例调用equals()必须返回true;
作为key的对象还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
如果两个对象相等,则两个对象的hashCode()必须相等;
如果两个对象不相等,则两个对象的hashCode()尽量不要相等。
5.用Properties读取配置文件
一共有三步:
1.创建Properties实例;
2.调用load()读取文件;
3.调用getProperty()获取配置。
String f = "setting.properties";
Properties props = new Properties();
props.load(new java.io.FileInputStream(f));
读取配置
String filepath = props.getProperty("last_open_file");
写入配置
props.setProperty("language", "Java");
props.store(new FileOutputStream("C:\\conf\\setting.properties"), "这是写入的properties注释");
6.Collections 集合操作方法
1.创建空集合,返回的空集合是不可变集合,无法向其中添加或删除元素
创建空List:List<T> emptyList()
创建空Map:Map<K, V> emptyMap()
创建空Set:Set<T> emptySet()
2.创建一个单元素集合:返回的单元素集合也是不可变集合
创建一个元素的List:List<T> singletonList(T o)
创建一个元素的Map:Map<K, V> singletonMap(K key, V value)
创建一个元素的Set:Set<T> singleton(T o)
3.排序
Collections.sort(list);
4.洗牌
Collections.shuffle(list);
5.线程安全集合
变为线程安全的List:List<T> synchronizedList(List<T> list)
变为线程安全的Set:Set<T> synchronizedSet(Set<T> s)
变为线程安全的Map:Map<K,V> synchronizedMap(Map<K,V> m)
上一篇: 停顿几秒钟执行
下一篇: vue路由跳转打开新页面
推荐阅读
-
Java 集合基础知识 List/Set/Map
-
Java基础知识回顾之四 ----- 集合List、Map和Set
-
java基础语法集合框架与泛型(List和Set)
-
【java读书笔记】——Collection集合之六大接口(Collection、Set、List、Map、Iterator和Comparable)
-
java中的三大集合框架(List,Set,Map)
-
Java的collection集合/set容器/list容器/map容器
-
Java 集合基础知识 List/Set/Map
-
Java and JavaScript 遍历set(集),list(列表)和map(映射)汇总
-
java集合类(Map、Set、List)
-
Java集合框架 List集合、Set集合、Map集合 学习泛型与包装类的装箱拆箱