当前位置:   article > 正文

java常用集合以及测试遇见的问题_java大结果集经常出现的场景及规避

java大结果集经常出现的场景及规避

目录

为什么要学习java集合?

一.list 集合

1.1list

如何遍历:

1.2 Arraylist

为什么不适合随机增加或删除? 

1.3LinkedList

1.4 Vector

1.5CopyOnWriteArrayList

二.set集合 

2.1Hashset

2.2TreeSet 

三. map集合

3.1Hashmap 

3.2HashTable

3.3ConcurrentHashMap

3.4TreeMap 

 3.5LinkedHashMap

 遍历方式

四 、排序

4.1 工具类

   


为什么要学习java集合


为了保存数量不确定的数据,以及保存具有映射关系的数据(也被称为关联数组),Java 提供了集合类。集合类主要负责保存、盛装其他数据,因此集合类也被称为容器类。Java 所有的集合类都位于 java.util 包下,提供了一个表示和操作对象集合的统一构架,包含大量集合接口,以及这些接口的实现类和操作它们的算法。 

集合类和数组不一样,数组元素既可以是基本类型的值,也可以是对象(实际上保存的是对象的引用变量),而集合里只能保存对象(实际上只是保存对象的引用变量,但通常习惯上认为集合里保存的是对象)。

Java 集合类型分为 CollectionMap,它们是 Java 集合的根接口,这两个接口又包含了一些子接口或实现类。图 1 和图 2 分别为 Collection 和 Map 的子接口及其实现类。

                                              图 1  Collection接口基本结构 

                                                 图 2  Map接口基本结构 

一.list 集合

1.1list

  • 特点:有序 且可重复 
  • 遍历:下标 迭代器 
  • 扩容:初始容量10,负载因子0.5,扩容增量0.5倍  
  • 新容量 = 原容量 + 原容量 * 0.5  , 如 ArrayList的容量为10,一次扩容后是容量为15

如何遍历:

下标

  1. @Test//测试用力
  2. public void test03() {
  3. for (Integer integer : list) {
  4. System.out.println(integer);
  5. }
  6. }

迭代器

  1. @Test//测试用力
  2. public void test04() {
  3. Iterator<Integer> it=list.iterator();
  4. while (it.hasNext()) {
  5. System.out.println(it.next());
  6. }
  7. }

1.2 Arraylist

  • 简单数据结构,超出容量自动扩容,动态数组
  • 内部实现是基于基础的对象数组的
  • 随机访问快
  • 不适合随机增加或删除
  • 线程不安全

为什么不适合随机增加或删除? 

运行这段代码的时候出现了一个报错

  1. @Test
  2. public void del() {
  3. list.remove(1);
  4. System.out.println(list);
  5. }

报错结果

为什么?

程序发现那个位置也就是0位置那里并没有值,就会报这个错,也有人说是越界错误,也是可以理解的。数组越界了

解决方案:

  1. @Test
  2. public void del01() {
  3. for (int i = 0; i < list.size(); i++) {
  4. if(list.get(i)==3) {
  5. list.remove(i);
  6. }
  7. }
  8. System.out.println(list);
  9. }

原始数据:

  运行结果:

                                           

由此可以看出 删除了两个为3的元素

这就是为什么Arraylist 不适合删除的原因 

但是可以推荐大家使用迭代器删除

代码示例:

  1. //迭代器删除
  2. @Test
  3. public void del02() {
  4. Iterator<Integer> it=list.iterator();
  5. while (it.hasNext()) {
  6. Integer value=it.next();
  7. if(value==3) {
  8. it.remove();
  9. }
  10. }
  11. System.out.println(list);
  12. }

运行结果:

 所有为3的元素已全部删除

建议使用迭代器删除 

1.3LinkedList

  •     LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部
  •     线程不安全
  •     LinkedList可被用作堆栈(stack)【包括了push,pop方法】,队列(queue)或双向队列(deque)
  •     以双向链表实现,链表无容量限制,允许元素为null,线程不安全
  •     适合做随机的增加或删除 

 效率太慢 不常用

1.4 Vector

  • 相比于LinkedList 线程是安全的
  • 但是由于效率慢 也不是很常用

1.5CopyOnWriteArrayList

  •     写时复制
  •     线程安全
  •     适合于读多,写少的场景
  •     写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
  •     比Vector性能高
  •     最终一致性
  •     实现了List接口,使用方式与ArrayList类似

二.set集合 

  • 特点:无序,不重复
  • 遍历:foreach,迭代器
  • 扩容: 初始容量16,负载因子0.75,扩容增量1倍

2.1Hashset

  • 它存储唯一元素并允许空值
  •  依据对象的hashcode来确定该元素是否存在
  • 由HashMap支持
  • 不保持插入顺序
  • 非线程安全
  • 性能参数:初始容量,负载因子
  •  默认值: 初始容量16,负载因子0.75
  1. private HashSet<Integer> set = new HashSet<>();
  2. @Before
  3. public void set01() {
  4. set.add(1);
  5. set.add(2);
  6. set.add(2);
  7. set.add(3);
  8. set.add(4);
  9. set.add(5);
  10. }
  11. @Test
  12. public void test() {
  13. for (Integer integer : set) {
  14. System.out.println(integer);
  15. }
  16. }

运行结果

 

 实现了自动去重 所以需要去重的集合 可以借助hashset

2.2TreeSet 

  •     TreeSet
  •     是一个包含有序的且没有重复元素的集合
  •     作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
  •     TreeSet是基于TreeMap实现的

三. map集合

  • 特点:
  •     无序,键值对,键不能重复,值可以重复,
  •     键重复则覆盖,没有继承Collection接口
  • 扩容:初始容量16,负载因子0.75,扩容增量1倍
  • 遍历:
  •     先获取所有键的Set集合,再遍历(通过键获取值)
  •     取出保存所有Entry的Set,再遍历此Set即可 

3.1Hashmap 

线程不安全,最常用,速度快
内部采用数组来存放数据(红黑树

3.2HashTable

线程安全,不太常用

3.3ConcurrentHashMap

线程安全,比HashTable性能高

3.4TreeMap 

  •  key值按一定的顺序排序
  • 添加或获取元素时性能较HashMap慢
  •     因为需求维护内部的红黑树,用于保证key值的顺序

 3.5LinkedHashMap

LinkedHashMap是有序的,且默认为插入顺序
 当我们希望有顺序地去存储key-value时,就需要使用LinkedHashMap了 

 遍历方式

  1. Map<String, String> linkedHashMap = new LinkedHashMap<>();
  2. linkedHashMap.put("name1", "josan1");
  3. linkedHashMap.put("name2", "josan2");
  4. linkedHashMap.put("name3", "josan3");
  5. Set<Entry<String, String>> set = linkedHashMap.entrySet();
  6. Iterator<Entry<String, String>> iterator = set.iterator();
  7. while(iterator.hasNext()) {
  8. Entry entry = iterator.next();
  9. String key = (String) entry.getKey();
  10. String value = (String) entry.getValue();
  11. System.out.println("key:" + key + ",value:" + value);
  12. }

四 、排序

java.lang.Comparable

java.util.Comparator

4.1 工具类

Collections 提供一组静态方法操作集合

Arrays  提供一组静态方法操作数组


   

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/422365
推荐阅读
相关标签
  

闽ICP备14008679号