java Arrays.asList 返回什么与普通 ArrayList 区别介绍
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>核心结论</li><li>详细区别与解释</li><ul class="second_class_ul"><li>代码示例</li></ul><li>为什么会这样设计?</li><ul class="second_class_ul"></ul><li>如何得到一个真正可变的ArrayList?</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>核心结论</h2><ul><li><strong>它返回什么?</strong> <code>Arrays.asList()</code> 返回一个由指定数组<strong>支持的、固定大小的</strong> <code>List</code> 视图。</li><li><strong>有区别吗?</strong> <strong>有巨大区别</strong>。它返回的不是我们常用的 <code>java.util.ArrayList</code>,而是一个内部自定义的、行为受限的类。</li></ul>
<p class="maodian"></p><h2>详细区别与解释</h2>
<p>我们可以通过一个表格和代码示例来清晰地对比:</p>
<table><thead><tr><th>特性</th><th>Arrays.asList(...) 返回的列表</th><th>new ArrayList<>()</th></tr></thead><tbody><tr><td><strong>所属类</strong></td><td>一个私有的、内部的 <code>Arrays$ArrayList</code> 类</td><td><code>java.util.ArrayList</code></td></tr><tr><td><strong>数据结构</strong></td><td><strong>基于原始数组的一个“视图”(View)</strong></td><td>基于可动态扩容的数组</td></tr><tr><td><strong>大小是否可变</strong></td><td><strong>固定大小(Fixed-size)</strong></td><td><strong>可变大小(Resizable)</strong></td></tr><tr><td><strong>支持添加元素</strong></td><td><strong>否</strong>。调用 <code>add()</code> 会抛出 <code>UnsupportedOperationException</code></td><td><strong>是</strong></td></tr><tr><td><strong>支持删除元素</strong></td><td><strong>否</strong>。调用 <code>remove()</code> 会抛出 <code>UnsupportedOperationException</code></td><td><strong>是</strong></td></tr><tr><td><strong>支持修改元素</strong></td><td><strong>是</strong>。<code>set(index, element)</code> 方法可用</td><td><strong>是</strong></td></tr><tr><td><strong>与原数组的关系</strong></td><td><strong>共享底层数据</strong>。修改列表元素等于修改原数组</td><td><strong>完全独立</strong>。创建时拷贝元素,与原数组无关</td></tr></tbody></table>
<p class="maodian"></p><h3>代码示例</h3>
<div class="jb51code"><pre class="brush:java;">import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
// 1. 创建一个原始数组
String[] originalArray = {"A", "B", "C"};
// 2. 使用 Arrays.asList 得到一个 List
List<String> asList = Arrays.asList(originalArray);
System.out.println("asList: " + asList); // 输出:
// 3. 创建一个普通的 ArrayList
List<String> realArrayList = new ArrayList<>(Arrays.asList(originalArray));
System.out.println("realArrayList: " + realArrayList); // 输出:
// --- 测试修改元素 (两者都支持) ---
asList.set(0, "A_Modified");
realArrayList.set(0, "A_Modified");
System.out.println("After set(0):");
System.out.println("asList: " + asList); // 输出:
System.out.println("realArrayList: " + realArrayList); // 输出:
System.out.println("originalArray: " + Arrays.toString(originalArray));
// 关键!原数组也被修改了:
// 这说明 asList 和 originalArray 共享底层数据
// --- 测试添加元素 (关键区别) ---
try {
realArrayList.add("D"); // 成功
System.out.println("realArrayList after add: " + realArrayList); //
} catch (Exception e) {
System.out.println("realArrayList add failed: " + e);
}
try {
asList.add("D"); // 失败!抛出异常
} catch (Exception e) {
System.out.println("asList add failed: " + e);
// 输出: java.lang.UnsupportedOperationException
}
// --- 测试删除元素 (关键区别) ---
try {
realArrayList.remove(0); // 成功
System.out.println("realArrayList after remove: " + realArrayList); //
} catch (Exception e) {
System.out.println("realArrayList remove failed: " + e);
}
try {
asList.remove(0); // 失败!抛出异常
} catch (Exception e) {
System.out.println("asList remove failed: " + e);
// 输出: java.lang.UnsupportedOperationException
}
}
}</pre></div>
<p class="maodian"></p><h2>为什么会这样设计?</h2>
<p><code>Arrays.asList()</code> 的设计目的不是为了创建一个全能、可变的集合,而是为了提供一个在数组和期望接收 <code>List</code> 参数的API之间进行转换的桥梁。</p>
<p>它的主要用途是:</p>
<ol><li>当你需要一个快速、轻量级的列表视图来遍历或访问数组元素时。</li><li>当一个方法需要传入 <code>List</code> 参数,而你手头正好有一个数组时,可以快速包装一下。例如:<code>someMethodThatTakesList(Arrays.asList(myArray))</code>。</li></ol>
<p class="maodian"></p><h2>如何得到一个真正可变的ArrayList?</h2>
<p>如果你需要的是一个可以随意添加、删除元素的完整功能的 <code>ArrayList</code>,你应该<strong>新建一个</strong>:</p>
<p>String[] myArray = {“A”, “B”, “C”};<br />// 方法一:最常用和推荐的方法<br />List list1 = new ArrayList<>(Arrays.asList(myArray));</p>
<p>// 方法二:使用 Java 8 的 Stream API (更现代)<br />List list2 = Arrays.stream(myArray).collect(Collectors.toList());</p>
<p>// 方法三:如果你需要的是特定类型的ArrayList,而不是通用的List接口<br />ArrayList list3 = new ArrayList<>(Arrays.asList(myArray));</p>
<p><strong>总结:</strong></p>
<p>记住 <code>Arrays.asList()</code> 返回的是一个<strong>尺寸固定的“假”列表</strong>,它只是原始数组的一个<strong>只读视图(除了修改元素值)</strong>。在绝大多数需要操作集合内容的场景下,你都应该将它作为构造参数,创建一个真正的 <code>java.util.ArrayList</code>。</p>
<p>到此这篇关于java Arrays.asList 返回什么与普通 ArrayList 区别介绍的文章就介绍到这了,更多相关java Arrays.asList与ArrayList 区别内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
<div class="art_xg">
<b>您可能感兴趣的文章:</b><ul><li>java中为什么要谨慎使用Arrays.asList、ArrayList的subList</li><li>Java用Arrays.asList初始化ArrayList实例方法</li><li>java List.of()与Arrays.asList()方法对比分析</li><li>Java的静态方法Arrays.asList()使用指南</li><li>Java中Arrays.asList()需要注意的坑</li><li>Java中List.of()和Arrays.asList()的区别及原因分析</li><li>Java Arrays.AsList原理及用法实例</li><li>Java踩坑记录之Arrays.AsList</li><li>Java Arrays.asList使用方法解析</li></ul>
</div>
</div>
<!--endmain-->
頁:
[1]