程序员常犯的bug错误

我们常写的bug

作为java软件开发人员,在开发的过程中难免会遇到各种bug,比如异常错误等,下面就分享几个常见的bug。

1)Array转成ArrayList

如果要把数组转成ArrayList,你会怎样做呢?

		String[] arr = { "a", "an", "snd" };
		List<String> list = Arrays.asList(arr);

但这种方法不支持使用!因为Arrays内部的ArrayList只有set、get、contains等方法,但是没有能够像是add这种能够使其内部结构进行改变的方法,所以Arrays内部的ArrayList的大小固定。
如果要创建一个能添加元素的ArrayList,你可以使用以下方式:

ArrayList<String> arraylist=new ArrayList<String>(Arrays.asList(arr));

2)检查某个数组是否包含某一个值

对于程序员来说,我们常常会这样来写:

		Set<String> set=new HashSet<String>(Arrays.asList(arr));
		return set.contains(value);

这样写虽然没有错误,但是有性能损耗。正常情况下,可以这样写:

return Arrays.asList(arr).contains(value);

或者使用穷举法方式:

	for(String s:arr) {
			if(s.equals(value)) {
				return true;
			}
			return false;
		}

3)在List中循环删除元素

集合中循环删除元素,得不到预期的结果!

	ArrayList<String> list=new ArrayList<String>(Arrays.asList("a","b","c","d"));
		for(int i=0;i<list.size();i++) {
			list.remove(i);
		}
		System.out.println(list);

然而,这个结果的输出答案是:[b, d]
为什么会只有两个值?我这不是在循环输出?
其实,在列表的内部,当你使用remove的时候,一旦remove一个元素后,其列表的内部结构会发生变化,一开始集合总容量是4,remove一个元素后就会变为3,然后在和i进行比较判断,所以只能输出两个元素

你可能知道使用迭代器是正确的remove元素的方式,你可能还知道for-each和iterator这种方式类似,所以你写了:

	ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
		for (String s : list) {
			if (s.equals("a")) {
				list.remove(s);
			}
		}
		System.out.println(list);

结果如何?
在这里插入图片描述
为什么?
那是因为使用ArrayList中外部remove元素,会造成其内部结构和游标的改变。
所以建议大家使用list进行元素的删除或者添加时,一定要使用迭代器进行操作:

	ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
		Iterator<String> iter = list.iterator();
		while (iter.hasNext()) {
			String s = iter.next();
			if (s.equals("a")) {
				iter.remove();
			}
		}
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值