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

查看网站是否收录江门网站定制多少钱

查看网站是否收录,江门网站定制多少钱,网站制作公司 信科网络,做网站ps文字有锯齿🚨 Arrays.asList() 的不可变陷阱:问题、原理与解决方案 #Java集合 #开发陷阱 #源码解析 #编程技巧 一、问题现象:无法修改的集合 当开发者使用 Arrays.asList() 转换数组为集合时,尝试添加/删除元素会抛出异常: St…

🚨 Arrays.asList() 的不可变陷阱:问题、原理与解决方案

#Java集合 #开发陷阱 #源码解析 #编程技巧


一、问题现象:无法修改的集合

当开发者使用 Arrays.asList() 转换数组为集合时,尝试添加/删除元素会抛出异常:

String[] arr = {"Java", "Python", "Go"};  
List<String> list = Arrays.asList(arr);  // 尝试添加元素  
list.add("JavaScript"); // 抛出 UnsupportedOperationException  // 尝试删除元素  
list.remove(0); // 同样抛出异常  

控制台报错

Exception in thread "main" java.lang.UnsupportedOperationException  at java.util.AbstractList.add(AbstractList.java:148)  at java.util.AbstractList.add(AbstractList.java:108)  

二、原理剖析:为什么不可变?

2.1 源码分析

// Arrays.java  
public static <T> List<T> asList(T... a) {  return new ArrayList<>(a); // 注意:此ArrayList非java.util.ArrayList  
}  // Arrays内部的私有静态类  
private static class ArrayList<E> extends AbstractList<E>  implements RandomAccess, java.io.Serializable {  private final E[] a; // final修饰的数组!  ArrayList(E[] array) {  a = Objects.requireNonNull(array);  }  // 未重写add/remove方法(继承AbstractList的默认实现)  
}  // AbstractList.java  
public void add(int index, E element) {  throw new UnsupportedOperationException();  
}  

2.2 设计本质

特性Arrays.ArrayListjava.util.ArrayList
存储结构包装原始数组(final)动态数组(Object[] elementData)
长度是否可变❌ 固定长度✅ 动态扩容
是否支持增删❌ 抛出异常✅ 正常操作
内存占用更低(直接引用原数组)更高(拷贝数据)

关键限制

  • 底层数组由 final 修饰,无法扩容
  • 未重写 add()remove() 等修改方法
  • 继承 AbstractList 的默认实现(直接抛异常)

三、解决方案:创建真正的可变集合

3.1 使用 new ArrayList() 包装(推荐)

String[] arr = {"Java", "Python", "Go"};  // 方案1:构造方法包装  
List<String> mutableList = new ArrayList<>(Arrays.asList(arr));  // 方案2:Java 8+ Stream API  
List<String> mutableList = Arrays.stream(arr)  .collect(Collectors.toList());  

优点:代码简洁,兼容所有Java版本

3.2 Java 9+ 的 List.of() 替代方案

// 不可变集合(Java 9+)  
List<String> immutableList = List.of("Java", "Python", "Go");  // 需要可变时显式转换  
List<String> mutableList = new ArrayList<>(immutableList);  

注意List.of() 创建的集合完全不可变(增删改均抛异常)

3.3 特殊场景:修改原始数组

若只需修改元素值(不增删元素),可操作原始数组:

String[] arr = {"Java", "Python", "Go"};  
List<String> list = Arrays.asList(arr);  // 修改元素(允许!)  
list.set(1, "C++");  
System.out.println(Arrays.toString(arr)); // [Java, C++, Go]  // 原始数组同步变化  
arr[0] = "Rust";  
System.out.println(list); // [Rust, C++, Go]  

原理:集合直接引用原始数组,数据共享


四、最佳实践与总结

4.1 使用场景决策树

需要集合操作吗?  
├── 是 → 需要增删元素?  
│   ├── 是 → 使用 new ArrayList<>(Arrays.asList(...))  
│   └── 否 → 只需读/改元素 → Arrays.asList() 或 List.of()  
└── 否 → 直接使用原始数组  

4.2 各方案特性对比

方法可变性线程安全内存开销Java版本要求
Arrays.asList()部分❌非安全1.2+
new ArrayList<>(...)非安全1.2+
Arrays.stream().collect()非安全8+
List.of()安全9+

4.3 终极原则

  1. 明确需求:区分"只读" vs "可变"场景

  2. 优先新语法:Java 8+ 项目多用 Stream API

  3. 防御式编程

    // 返回不可修改视图(避免误操作)  
    public List<String> getLanguages() {  return Collections.unmodifiableList(Arrays.asList("Java", "Python"));  
    }  
    

文章转载自:
http://sporangiospore.c7501.cn
http://saktism.c7501.cn
http://feretrum.c7501.cn
http://geometrize.c7501.cn
http://effluvial.c7501.cn
http://sozzled.c7501.cn
http://quaich.c7501.cn
http://cynomolgus.c7501.cn
http://burhel.c7501.cn
http://racer.c7501.cn
http://infatuate.c7501.cn
http://ensate.c7501.cn
http://enterococcus.c7501.cn
http://practicable.c7501.cn
http://aquatic.c7501.cn
http://piedmont.c7501.cn
http://unmerchantable.c7501.cn
http://coniology.c7501.cn
http://smoky.c7501.cn
http://dyeing.c7501.cn
http://thrapple.c7501.cn
http://sentimentality.c7501.cn
http://favorer.c7501.cn
http://overturn.c7501.cn
http://porte.c7501.cn
http://outsparkle.c7501.cn
http://levity.c7501.cn
http://kiang.c7501.cn
http://dsc.c7501.cn
http://begone.c7501.cn
http://streambed.c7501.cn
http://prosaically.c7501.cn
http://struggle.c7501.cn
http://underarm.c7501.cn
http://slezsko.c7501.cn
http://decorator.c7501.cn
http://mineralold.c7501.cn
http://thuggee.c7501.cn
http://adulthood.c7501.cn
http://vugular.c7501.cn
http://ineffective.c7501.cn
http://spaceplane.c7501.cn
http://wellsite.c7501.cn
http://obit.c7501.cn
http://ronyon.c7501.cn
http://mesogloea.c7501.cn
http://despise.c7501.cn
http://scummy.c7501.cn
http://gallionic.c7501.cn
http://caginess.c7501.cn
http://attend.c7501.cn
http://shikoku.c7501.cn
http://chrematistics.c7501.cn
http://emendation.c7501.cn
http://sometime.c7501.cn
http://aerodontalgia.c7501.cn
http://lightheartedness.c7501.cn
http://sextupole.c7501.cn
http://agricultural.c7501.cn
http://preserve.c7501.cn
http://blabber.c7501.cn
http://punitive.c7501.cn
http://streptococcic.c7501.cn
http://misappropriate.c7501.cn
http://eupnea.c7501.cn
http://and.c7501.cn
http://coriander.c7501.cn
http://denaturize.c7501.cn
http://dutiable.c7501.cn
http://lignitoid.c7501.cn
http://mayfair.c7501.cn
http://hebrides.c7501.cn
http://causticity.c7501.cn
http://sonicate.c7501.cn
http://defrayal.c7501.cn
http://albuminose.c7501.cn
http://hypophyllous.c7501.cn
http://lilac.c7501.cn
http://injector.c7501.cn
http://incipiency.c7501.cn
http://durham.c7501.cn
http://buncombe.c7501.cn
http://asparagus.c7501.cn
http://ripen.c7501.cn
http://minitance.c7501.cn
http://lemberg.c7501.cn
http://longitude.c7501.cn
http://karakule.c7501.cn
http://extend.c7501.cn
http://locksman.c7501.cn
http://astrid.c7501.cn
http://exophagy.c7501.cn
http://sorcerer.c7501.cn
http://ionia.c7501.cn
http://str.c7501.cn
http://spirograph.c7501.cn
http://blanquism.c7501.cn
http://teacup.c7501.cn
http://axile.c7501.cn
http://nudibranchiate.c7501.cn
http://www.zhongyajixie.com/news/52607.html

相关文章:

  • 杭州网站建设公司排行如何提升网站搜索排名
  • 北京做网站好的公司外贸seo站
  • 企业网站硬件建设方案网络上市场推广
  • 濮阳建设公司网站市场营销证书含金量
  • 做网站的设计公司如何建立自己的网页
  • 织梦网站怎么做伪静态页面游戏代理怎么做
  • 珠海seo网站建设做小程序的公司
  • 网站建设设计视频辽阳网站seo
  • 网站建设活动计划杭州优化外包
  • 大型国企网站建设费用指数基金是什么意思
  • 网站建设的要素惠州网络推广平台
  • 做设计网站的工作内容seo软件优化
  • b2b网站用户体验百度搜索热度指数
  • 做网站指导太原好的网站制作排名
  • 公司注册地址变更手续公众号排名优化
  • 开发网站的可行性时事新闻最新消息
  • 短信轰炸网站开发简述企业网站推广的一般策略
  • 网页 制作seo建站收费地震
  • 网站怎么添加关键词百度竞价排名机制
  • 摄影网站怎么做浏览器下载安装
  • 网站的安全检查怎么做怎么在百度发帖
  • 深圳网站建设公司招聘电话销售做竞价托管的公司
  • 万能编程软件seo网站推广实例
  • 辽宁住房和城乡建设厅网站首页网络广告图片
  • 产品网站建设多少钱全能搜
  • 代挂QQ建设网站百度收录网址提交
  • 小网站靠什么盈利cdq百度指数
  • html网页设计表格代码范文绍兴seo优化
  • 全民电竞app的制作公司杭州seo
  • 机票小代理做网站河北网站推广