当前位置: 首页 > news >正文

设计人才网站百度商业平台官网

设计人才网站,百度商业平台官网,男女做那个什么的视频网站,做图赚钱的网站有哪些大家好,我是静幽水,一名大厂全栈程序员,今天给大家分享一个案例,看似简单。却容易引发惨案。 事情是这样的,最近组里来了一个实习生,因为项目工作量大,人力比较紧张,所以就分配了一…

大家好,我是静幽水,一名大厂全栈程序员,今天给大家分享一个案例,看似简单。却容易引发惨案。

事情是这样的,最近组里来了一个实习生,因为项目工作量大,人力比较紧张,所以就分配了一个简单的小需求给他,给一个接口增加一个出参,返回匹配到的规则编码列表,规则编码是数字类型,当没有匹配到规则时,就返回默认规则编码。他的代码是这样写的:

int[] ruleIds = new int[roleList.size()];
for (int i = 0; i++; i<roleList.size() ) {ruleIds[i] = roleList.get(i).getId;
}

ok,这里看着还没有问题,但是在最后返回结果之前,他好像突然想起了,如果没有匹配到规则的话,要返回一个默认规则Id,于是他写下来这段代码。

List<Integer> ruleIdList =  Arrays.asList(ruleIds);
if (ruleIdList.size() == 0){ruleIdList.add(defaultId)
}

后来,对于他的代码,我们都觉得比较简单,代码review的时候,都在review其他同时的,比较复杂的代码逻辑,也就忽视了他的代码,但往往你最轻视的地方,就是最容易出问题的地方。就是这个ruleIdList.add(),导致在匹配不到规则的场景下,程序抛出UnsupportedOperationException异常。而他自测和UT也没有覆盖到这种场景,导致这个定时炸弹一直存在到上线之前。还好在上线前的前一天晚上,我们发现了这个问题,才避免了惨案的发生。

后来我去询问他这样写的动机。为什么上面没有用List而是用的数组,他给的解释是因为要放int类型,List里面只能放对象,我当场吐血。难道不知道自动装箱拆箱吗,那后面为啥再转成list呢,他说,因为前端开发要的list类型。好吧,既然事已发生,也就没有过多去追问。但是产生这个异常的原因,我还是想和大家分享一下。

Arrays.asList()方法是Java中将数组转换为集合的常用方法。它接收一个数组作为参数,并返回一个固定大小的List。这个List实际上是Arrays类的私有静态内部类ArrayList的实例。它实现了List接口,但是并没有实现List接口中的一些修改集合结构的方法,如add()、remove()等。

其实这并不是一种设计上的缺陷,而是特意为之,目的就是为了提高数组到集合的转换效率,避免创建新的ArrayList对象。但是同时也带来了一些限制,即不能对返回的List进行修改操作。如果使用修改集合结构的方法,例如add()、remove(),将会抛出UnsupportedOperationException异常,就像上面的代码一样。

为了更好地理解Arrays.asList()方法的局限性,我们来看一下它的源码实现。Arrays.asList()方法是在Arrays类中定义的静态方法。

// Arrays类的源码
public static <T> List<T> asList(T... a) {return new ArrayList<>(a);
}

从源码可以看出,Arrays.asList()方法接收可变参数,而返回的是ArrayList类的实例。这个ArrayList类是Arrays类中的一个内部类,实现了List接口。

// Arrays类的内部类ArrayList的源码
private static class ArrayList<E> extends AbstractList<E> implements RandomAccess, java.io.Serializable {private final E[] array;ArrayList(E[] array) {if (array == null) {throw new NullPointerException();}this.array = array;}public E get(int index) {return array[index];}public int size() {return array.length;}// 不支持修改集合结构的方法public E set(int index, E element) {throw new UnsupportedOperationException();}public void add(int index, E element) {throw new UnsupportedOperationException();}public E remove(int index) {throw new UnsupportedOperationException();}
}

从ArrayList类的源码可以看出,它继承了AbstractList类并实现了RandomAccess接口,因此支持快速随机访问。但是在ArrayList类中,修改集合结构的方法都被重写为抛出UnsupportedOperationException异常,从而保证了对返回的List进行修改的操作是不可行的。

除了Arrays.asList()方法,还存在其他类似的坑,它们在处理集合时也需要注意。

Collections.nCopies()

Collections.nCopies()方法用于创建一个指定元素重复多次的List。这个List同样是固定大小的,不能进行修改操作。

List<String> list = Collections.nCopies(3, "apple");
list.add("banana"); // 抛出UnsupportedOperationException异常

原理和Arrays.asList()类似,Collections.nCopies()方法返回的是一个AbstractList的实例,不支持修改集合结构的操作。

Arrays.asList()的嵌套问题

Arrays.asList()方法还存在一个嵌套的问题。如果使用Arrays.asList()方法将一个二维数组转换为List,会得到一个List的嵌套结构,此时对内层的List进行修改同样会抛出UnsupportedOperationException异常。

String[][] array2D = { { "apple", "banana" }, { "orange", "grape" } };
List<List<String>> nestedList = Arrays.asList(array2D);
nestedList.get(0).add("kiwi"); // 抛出UnsupportedOperationException异常

原因是这个嵌套的List中的元素仍然是固定大小的List。

这种设计是为了提高效率和节省内存开销。在转换数组到集合时,能直接使用Arrays.asList()方法的时候,它是非常方便的。但是当需要对集合进行修改操作时,应该创建一个新的ArrayList对象,并使用addAll()方法将数组元素添加进去,以避免UnsupportedOperationException异常的发生。

代码示例:

String[] array = { "apple", "banana", "orange" };
List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.add("grape"); // 正常添加元素到集合中

或者如下:

List<String> Ids = new ArrayList<>(Arrays.asList(array));
Ids.add(id);

Collections.unmodifiableList()方法的不可修改特性

Collections.unmodifiableList()方法返回的是一个不可修改的List。它采用了装饰器模式,对原始List进行了封装,重写了修改集合结构的方法并抛出UnsupportedOperationException异常。

List<String> originalList = new ArrayList<>();
originalList.add("apple");
List<String> unmodifiableList = Collections.unmodifiableList(originalList);
unmodifiableList.add("banana"); // 抛出UnsupportedOperationException异常

总结: 在使用Arrays.asList()方法将数组转换为集合时,注意其局限性。返回的List是一个固定大小的List,不支持修改集合结构的方法。类似的坑还有Collections.nCopies()方法和Arrays.asList()的嵌套问题,它们同样需要注意不能对返回的集合进行修改操作。

http://www.ds6.com.cn/news/88119.html

相关文章:

  • 怎样拿电脑做网站广州seo排名收费
  • 做网站需要哪些手续鄞州seo整站优化服务
  • 潍坊中企动力做的网站怎么样云南新闻最新消息今天
  • 网站开发跟网页制作短视频推广
  • wordpress登录按钮设置河南整站百度快照优化
  • wordpress 中英文网站宁波网络推广方式
  • 做计量检定的网站北京出大大事了
  • 用jsp做网站的感想重庆seo技术博客
  • 厦门博客网站制作seo优化软件哪个好
  • 怎么做站旅游网站上泡到妞营销型网站一般有哪些内容
  • 医院网站建设怎么设置如何优化关键词排名到首页
  • 企业高端网站建设台州网站seo
  • 外发加工费计入什么科目武汉seo创造者
  • 中山 网站建设开发长春网站建设模板
  • 简述电子商务网站开发的研究意义百度指数搜索
  • wordpress评论关闭郑州优化公司有哪些
  • 域名做网站网站建设方案推广
  • 企业网站建设定制开发服务驻马店百度seo
  • 江苏网站建设机构优化设计五年级下册数学答案
  • 网站建设鞍山百度资源站长平台
  • 昆明网站建站平台成长电影在线观看免费
  • 沈阳建站免费模板快速开发网站的应用程序
  • 推荐做那个的电影网站电脑优化大师
  • 网站建设管理专员网络营销pdf
  • 建设南大街小学网站2345网址导航
  • 宜宾做网站公司百度搜索引擎提交入口
  • 网站建设杭州杭州网站建设网页制作
  • 电子商务网站建设概括重庆人力资源和社会保障网官网
  • wordpress 代码 换行沈阳网站seo排名公司
  • 怎么做网站流量统计分析百度主页