[Arrays,asList,ArrayList,程序员,String]Java程序员们最常犯的3个集合错误

简介:   1.将数组转化为列表  将数组转化为一个列表时,程序员们经常这样做:  List list=Arrays.asList(arr);  Arrays.asList() 会返回一个ArrayList对象,ArrayList类是Arrays的一个私有静态类,而不是java.util.ArrayList 类,

  1.将数组转化为列表

  将数组转化为一个列表时,程序员们经常这样做:

  List list=Arrays.asList(arr);

  Arrays.asList() 会返回一个ArrayList对象,ArrayList类是Arrays的一个私有静态类,而不是java.util.ArrayList 类,

  java.util.Arrays.ArrayList类有set()、get()、contains()方法,但是没有增加元素的方法,所以它的大 小是固定的,想要创建一个真正的ArrayList类,你应该这样做:

  ArrayList arrayList=new ArrayList(Arrays.asList(arr));

  ArrayList的构造方法可以接受一个集合类型,刚好它也是

  java.util.Arrays.ArrayList的超类。

  2.判断一个数组是否包含一个值

  程序员们经常这样做:

  Set set=new HashSet(Arrays.asList(arr));

  return set.contains(targetValue);

  这段代码起作用,但是没有必要把一个数组转化成列表,转化为列表需要额外的时间。它可以像下面那样简单:

  Arrays.asList(arr).contains(targetValue);

  或者是:

  for (String s : arr) {

  if (s.equals(targetValue)) {

  return true;

  }

  }

  return false;

  很显然第一种方法比第二种更容易读

  3.在一个循环中删除一个列表中的元素

  思考下面这一段在循环中删除多个元素的的代码:

  ArrayList list=new ArrayList(Arrays.asList("a", "b", "c", "d"));

  for (int i=0; i < list.size(); i++) {

  list.remove(i);

  }

  System.out.println(list);

  输出结果是:

  [b,d]

  在这个方法中有一个严重的错误。当一个元素被删除时,列表的大小缩小并且下标变化,所以当你想要在一个循环中用下标删除多个二手手机号买卖平台元素的时候,它并不会正常的生效。

  你也许知道在循环中正确的删除多个元素的方法是使用迭代,并且你知道java中的foreach循环看起来像一个迭代器,但实际上并不是。考虑一下下面的代码:

  ArrayList list=new ArrayList(Arrays.asList("a","b","c","d"));

  for(String s:list){

  if(s.equals("a")){

  list.remove(s);

  }

  }

  它会抛出一个

  ConcurrentModificationException异常。

  相反下面的显示正常:

  ArrayList list=new ArrayList(Arrays.asList("a", "b","c", "d"));

  Iterator iter=list.iterator();

  while (iter.hasNext()) {

  String s=iter.next();

  if (s.equals("a")) {

  iter.remove();

  }

  }

  .next() 必须在.remove()之前调用。在一个foreach循环中,编译器会使.next()在删除元素之后被调用,因此就会抛出

  ConcurrentModificationException异常,你也许希望看一下ArrayList.iterator()的源代码。

目录
相关文章
|
12天前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
37 9
|
16天前
|
Java 测试技术 开发者
Java零基础-indexOf(String str)详解!
【10月更文挑战第14天】Java零基础教学篇,手把手实践教学!
106 65
|
4天前
|
Java 索引 容器
Java ArrayList扩容的原理
Java 的 `ArrayList` 是基于数组实现的动态集合。初始时,`ArrayList` 底层创建一个空数组 `elementData`,并设置 `size` 为 0。当首次添加元素时,会调用 `grow` 方法将数组扩容至默认容量 10。之后每次添加元素时,如果当前数组已满,则会再次调用 `grow` 方法进行扩容。扩容规则为:首次扩容至 10,后续扩容至原数组长度的 1.5 倍或根据实际需求扩容。例如,当需要一次性添加 100 个元素时,会直接扩容至 110 而不是 15。
Java ArrayList扩容的原理
|
5天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
8天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
5天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
5天前
|
Java 开发者
|
9天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
15天前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
19 5
|
17天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
46 5

热门文章

最新文章

下一篇
无影云桌面