List 接口提供了subList方法,其作用是返回一个原列表的一个视图。对子列表的修改可以直接反馈到原列表中。
/** *subList 只是原列表的一个视图 * @author zhangwei_david * @version $Id: SubListDemo.java, v 0.1 2014年10月18日 下午8:50:33 zhangwei_david Exp $ */ public class SubListDemo { /** * * @param args */ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); System.out.println("原列表的内容: " + list); List<String> subList = list.subList(0, list.size()); System.out.println("子列表的内容: " + subList); list = Collections.unmodifiableList(list); subList.add("C"); System.out.println("子列表的内容: " + subList); System.out.println("原列表的内容: " + list); System.out.println("子列表和原列表是否相等:" + subList.equals(list)); } }
原列表的内容: [A, B]
子列表的内容: [A, B]
子列表的内容: [A, B, C]
原列表的内容: [A, B, C]
子列表和原列表是否相等:true
对子列表中的增加可以直接反馈到原列表中。
那么翻过来是否可以呢?我们看下面一个示例:
/** *subList 只是原列表的一个视图 * @author zhangwei_david * @version $Id: SubListDemo.java, v 0.1 2014年10月18日 下午8:50:33 zhangwei_david Exp $ */ public class SubListDemo { /** * * @param args */ public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("A"); list.add("B"); System.out.println("原列表的内容: " + list); List<String> subList = list.subList(0, list.size()); System.out.println("子列表的内容: " + subList); subList.add("C"); System.out.println("子列表的内容: " + subList); System.out.println("原列表的内容: " + list); System.out.println("子列表和原列表是否相等:" + subList.equals(list)); // 修改原列表 list.add("D"); System.out.println("子列表的内容: " + subList); } }
结果是:
子列表的内容: [A, B] 子列表的内容: [A, B, C] 原列表的内容: [A, B, C] 子列表和原列表是否相等:true Exception in thread "main" java.util.ConcurrentModificationException at java.util.SubList.checkForComodification(Unknown Source) at java.util.SubList.listIterator(Unknown Source) at java.util.AbstractList.listIterator(Unknown Source) at java.util.SubList.iterator(Unknown Source) at java.util.AbstractCollection.toString(Unknown Source) at java.lang.String.valueOf(Unknown Source) at java.lang.StringBuilder.append(Unknown Source) at com.cathy.demo.collections.SubListDemo.main(SubListDemo.java:34)
为什么会有并发修改的异常呢?
public List<E> subList(int fromIndex, int toIndex) { return (this instanceof RandomAccess ? new RandomAccessSubList<E>(this, fromIndex, toIndex) : new SubList<E>(this, fromIndex, toIndex)); }
public int size() { checkForComodification(); return size; }
private void checkForComodification() { if (l.modCount != expectedModCount) throw new ConcurrentModificationException(); }
至此我们可以发现在修改原列表后,使用size 方法出现了并发修改异常。
也就是原列表在生成子列表的时候,原列表是不能再被修改的
相关推荐
在MFC中,树视图(TreeView)和列表视图(ListView)是两种常见的控件,用于展示层次化的数据和多列数据。本篇将详细解释这两种视图的创建和使用方法,帮助初学者理解其核心概念。 首先,列表视图(ListView)是一...
在C# WinForm开发中,列表视图(ListView)是一个常用控件,它允许程序员以多种方式展示数据,如图标、列表、详细信息等。本教程将深入探讨如何使用列表视图,帮助初学者掌握其核心功能和用法。 1. **ListView控件的...
例如,我们可以创建两个子视图控制器,一个用于显示列表,另一个用于显示详细信息。 在父视图控制器中,我们需要加载这些子视图控制器,并将它们的视图添加到UIStackView中。可以使用`addChild()`方法来添加子视图...
这里,`sections`是一个数组,每个元素都是一个对象,包含一个`title`表示父列表的标题,以及一个`items`数组,表示该父列表下的子列表项。 解析这个JSON数据,我们可以使用Gson库或者其他解析库,例如Jackson或org...
在这个例子中,我们假设存在三个不同的Activity(FirstActivity、SecondActivity、ThirdActivity),每个Activity对应列表项的一个位置。根据`position`,我们可以启动相应的Activity,实现界面跳转。 ### 6. 进阶...
创建一个`CSplitterWnd`对象,然后在SDI视图中嵌入它,可以让我们轻松地在同一个窗口中显示多个视图。 要实现视图分割,你需要做以下步骤: 1. 在你的视图类中,继承自`CSplitterWnd`或`CChildFrame`(如果你希望每...
列表视图是一种常见的数据展示形式,它以行和列的形式组织数据,每一行代表一个数据项,每列则表示一个属性或字段。用户可以通过排序、过滤和搜索功能来定制他们的视图,以便更高效地查找和操作所需的数据。 在...
在MFC(Microsoft Foundation Classes)框架中,CListView是一个用于创建和管理列表视图控件的类,它基于Windows API中的LISTVIEW控件。列表视图控件是一种强大的用户界面元素,可以显示多列数据,并支持多种视图...
ScrollView是一个可滚动的容器,它可以包含一个或多个子视图,并允许用户垂直滚动查看超出屏幕范围的内容。在"QQ的奇观"项目中,可能因为需要展示大量的信息或者设计需要,开发者频繁地使用了ScrollView。然而,过度...
完美实现自定义的二级listview列表,自定义标题视图和子列表视图.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
《高级控件之分组列表视图》是一个深入探讨用户界面设计和开发的主题,尤其针对移动应用和桌面软件。在19页的详尽内容中,这份文档可能涵盖了以下关键知识点: 1. 分组列表视图的概念:分组列表视图是一种组织数据...
namespace ListView_列表视图_ { public partial class Form1 : Form { public Form1() { InitializeComponent(); } static int itemNumber = 0;int a = 0; private void button1_Click(object sender, ...
在iOS开发中,创建一个滚动视图并嵌入多个列表视图是一种常见的需求,它可以用于展示多组数据或者实现复杂的用户界面布局。标题"在滚动视图中加入多个列表视图效果"涉及到的关键知识点主要是如何将UITableView(列表...
在本资源中,"listview展开列表视图的效果源码.zip" 提供了一个实现ListView展开/折叠功能的示例代码。这个效果使得用户可以方便地查看和管理列表中的嵌套内容,例如在主列表项下展开子列表项,以此来组织和显示更...
本示例代码着重于如何自定义一个结合了树形视图和列表视图功能的控件——TreeListView。这个控件允许用户以树形结构展示数据,同时每个节点下还可以有列表形式的子项,提供了一种灵活的数据展示方式。 树列表视图...
例如,你可以使用Transition动画在数据加载前后切换空视图和数据列表,或者在空视图上添加一个刷新按钮,点击后触发数据加载。 5. **结合ListAdapter**:如果你使用的是自定义的ListAdapter,可以在其中添加一个...
标签“列表”表明这是一个与列表展示相关的技术问题,通常在移动应用开发中,列表是数据展示的主要形式,因此解决头部视图拉伸不变形的问题对于提供良好的用户体验至关重要。 在压缩包中的文件名“TOPULL”可能是...
在Microsoft Foundation Classes (MFC)库中,"MFC单文档多视图"是一个重要的编程概念,主要用于构建用户界面。MFC是微软为Windows应用程序开发提供的一种C++类库,它封装了Windows API,使开发者可以更高效地编写...
在Android开发中,我们经常需要实现一种效果:在一个列表(ListView、RecyclerView等)中,每个列表项可以展开或隐藏特定的视图。这样的交互设计能够有效地节省屏幕空间,提高用户体验。"Android列表单一展开隐藏...