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

济南富腾网站建设快速网站推广公司

济南富腾网站建设,快速网站推广公司,web网站开发需求文档模板,免费企业网站后台大家好,我是静幽水,一名大厂全栈程序员,今天给大家分享一个案例,看似简单。却容易引发惨案。 事情是这样的,最近组里来了一个实习生,因为项目工作量大,人力比较紧张,所以就分配了一…

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

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

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.hrbkazy.com/news/6976.html

相关文章:

  • 电子商务网站建设的大纲龙华百度快速排名
  • 工程机械 网站模板深圳网站优化公司
  • 工业设计排名前十的大学如何优化企业网站
  • 郑州网站建设找汉狮如何搭建网站平台
  • WordPress标签转拼音代码seo推广招聘
  • 郑州比较好的男科医院有哪些seo技术网
  • c 网站登录验证码怎么做不受国内限制的浏览器下载
  • 美国新闻网站app什么平台可以免费推广产品
  • 杭州cms建站模板下载专业制作网站的公司哪家好
  • 广东贸易网站建设国内真正的永久免费砖石
  • 哪个网站做飞机订单大地seo视频
  • 网站后台如何做文件下载连接seo引擎优化是什么
  • 织梦cms仿某作文网站整站源码(带采集)安装数据库怎么让某个关键词排名上去
  • 创研科技做网站怎么样做网络销售如何找客户
  • 我的网站域名公司网站制作需要多少钱
  • 麻花星空影视传媒制作公司网站线上推广
  • 盘锦威旺做网站建设公司百度竞价推广效果怎么样
  • 网站推广的作用是什么可以营销的十大产品
  • 张家港江阴网站设计上海哪家seo好
  • 百度怎样才能搜到自己的网站浏览器下载安装2023版本
  • cn域名知名网站怎样做搜索引擎推广
  • 网站开发中背景图片怎么弄全屏软件开发公司有哪些
  • app开发一般收费天津seo顾问
  • 国产真实母子视频做那里有网站小红书信息流广告投放
  • 班级网站建设步骤seo网站优化培训价格
  • 常德网站建设厦门网站制作方象科技服务案例
  • 域名网站空间淄博搜索引擎优化
  • 做外包软件的网站关键词查询
  • 做网站要用框架吗seo sem是什么职位
  • 做招聘网站客户要发票怎么办上海自动seo