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

上海哪家公司做网站动画视频制作软件app免费

上海哪家公司做网站,动画视频制作软件app免费,网站建设费一般多少,企业如何进行网络推广大家好,我是静幽水,一名大厂全栈程序员,今天给大家分享一个案例,看似简单。却容易引发惨案。 事情是这样的,最近组里来了一个实习生,因为项目工作量大,人力比较紧张,所以就分配了一…

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

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

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.yayakq.cn/news/877285/

相关文章:

  • 用dw做淘宝网站天津建设厅官方网站
  • 昆明专业网站设计公司幸运28网站建设
  • 甘肃省建设部网站平面设计正规兼职平台
  • 西安做网站的公司电话用手机搭建wordpress
  • 浙江网站建设售后保障资溪县建设局网站
  • 网设台州关键词优化哪家好
  • 哪些网站可以免费申请域名wordpress插件水印
  • 怎么做网站文章优化济南建设局网站公式
  • wordpress图片超链接广州网站建设公司乐云seo598
  • 江西南昌网站建设招标安徽区块链虚拟币网站开发价格
  • 网站怎么做限时抢购共享办公室可以注册公司吗
  • 网站里怎样做点击量查询制作影视宣传片
  • 辽宁省建设安全监督网网站加强校园网站建设
  • 南昌如何做百度的网站微信小程序开发一个多少钱啊
  • 大连网站建设网站网站建设关键词排名
  • 云工厂网站建设做网站的工具
  • 意大利设计网站建网站做seo
  • 山西做网站的企业海外红人营销推广
  • 精品网站建设费用 都来磐石网络互联网销售平台
  • 企业网页设计素材深圳网站建设seo推广优化
  • 网站怎么优化关键词快速提升排名做正规网站有哪些
  • 企业为什么要网站建设商丘河南网站建设
  • 做微博网站东莞建设局网站
  • 手机网站开发在pc端家庭装修报价明细预算表
  • 如何做网站路径分析短视频网站怎么建设
  • 网站全屏弹出窗口vps做vpn svn和网站
  • 外贸网站屏蔽国内ip泰安做网站网络公司
  • 加上强机关网站建设管理的通知济南市网站推广公司
  • 优化大师电脑版官方免费下载优化网站有哪些方法
  • 图书馆门户网站建设方案衡水 网站建设