在Java中如何使用子列表_Java subList使用要点解析
技术百科
P粉602998670
发布时间:2025-12-17
浏览: 次 subList返回原列表的视图而非副本,修改双向同步;索引需满足0≤fromIndex≤toIndex≤size;不支持add、remove等结构性操作;多线程下不安全,需转不可变副本或加锁。
Java中的subList是List接口提供的一个视图方法,返回原列表的“活”子区间,不是独立副本——修改子列表会同步影响原列表,反之亦然。
subList返回的是视图,不是新集合
调用 list.subList(fromIndex, toIndex) 得到的仍是同一个底层数据结构的引用。它不复制元素,只是定义了一个逻辑窗口。
- 对子列表增删改,会直接反映在原列表上(可能抛出
ConcurrentModificationException,尤其在遍历时) - 原列表后续结构性修改(如add、remove、clear),可能导致子列表失效,访问时抛
UnsupportedOperationException或异常 - 若需真正隔离的副本,应显式构造:
new ArrayList(list.subList(1, 4))
索引范围必须合法且遵守左闭右开
参数 fromIndex 和 toIndex 必须满足:0 ≤ fromIndex ≤ toIndex ≤ list.size(),否则抛IndexOutOfBoundsException。
-
fromIndex == toIndex返回空子列表(长度为0,但非null) -
toIndex取不到,即子列表包含索引fromIndex到toIndex - 1的元素 - 常见错误:误用
subList(0, list.size())想复制全量——虽不报错,但仍是视图;应改用new ArrayList(list)
子列表不支持部分操作,注意UnsupportedOperationException
因为子列表无法保证自身长度不变(受原列表约束),以下方法会抛出异常:
-
add(E)、addAll(Collection)、remove(Object)、removeAll(...)等结构性修改方法(除非底层实现允许,如ArrayList子列表允许add/remove,但有严格位置限制) -
clear()在某些JDK版本中可能被禁止(取决于具体List实现) - 安全操作包括:
get()、set()、contains()、indexOf()、iterator()(但迭代中修改原列表仍危险)
多线程环境下务必避免共享subList
subList本身不是线程安全的,且与原列表共享内部数组或节点。并发读写极易引发数据不一致或异常。
- 不要将subList暴露给多个线程,尤其当原列表也在被修改时
- 如需线程安全的子视图,先加锁保护原列表操作,或转为不可变副本:
Lists.newArrayList(list.subList(a, b))(Guava)或List.copyOf(list.subList(a, b))(Java 10+) - 考虑用
Collections.unmodifiableList(包装子列表,防止意外修改
)
基本上就这些。subList用起来简洁,但本质脆弱——理解它是“视图”而非“副本”,就能避开绝大多数坑。
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11快速助手怎么用_Win11远程协助连接教
- LINUX下如何配置VLAN虚拟局域网_在LINU
- Bpmn 2.0的XML文件怎么画流程图
- Win11怎么设置ip地址_Windows 11手
- ACF 教程:正确更新嵌套在多层 Group 字段
- Windows10如何更改桌面图标间距_Win10
- php中::能访问全局变量吗_全局作用域与类作用域
- LINUX如何开放防火墙端口_Linux fire
- Win11怎么清理C盘系统日志_Win11清理系统
- Win11怎么设置单手模式_Win11触控键盘布局
- 如何使用Golang包导出规则_控制函数和变量可见
- 如何在同包不同文件中正确引用 Go 结构体
- MAC如何启用访达侧边栏显示_MAC Finder
- Windows10系统服务优化指南_Win10禁用
- 如何使用Golang捕获测试日志_Golang t
- C++如何将C风格字符串(char*)转换为std
- c++的位运算怎么用 与、或、异或、移位操作详解【
- 如何在Golang中处理通道发送接收错误_防止阻塞
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- Mac的“调度中心”与“空间”怎么用_Mac多桌面
- php下载安装后swoole扩展怎么安装_异步框架
- Windows10如何更改系统字体大小_Win10
- Win11怎么关闭系统推荐内容_Windows11
- Python如何创建带属性的XML节点
- 如何使用Golang log设置日志输出格式_Go
- Win11怎么关闭防火墙通知_屏蔽Win11安全中
- Golang如何遍历目录文件_Golang fil
- Win11怎么开启空间音效_Windows11耳机
- c++怎么使用std::filesystem遍历文
- C#怎么使用委托和事件 C# delegate与e
- Windows7怎么找回经典开始菜单_Window
- Win11怎么设置虚拟内存_Windows 11优
- Win11如何设置系统语言_Win11系统语言切换
- c++如何判断文件是否存在_c++ filesys
- Win10如何更改电脑休眠时间_Windows10
- 如何在Golang中使用log包输出不同级别日志_
- 用lighttpd能运行php吗_lighttpd
- PythonPandas数据分析教程_数据清洗与处
- 如何在 Go 中高效缓存与分发网络视频流
- Go 中 defer 在 goroutine 内部
- Go 语言标准库为何不提供泛型切片的 Contai
- Win10如何卸载预装Edge扩展_Win10卸载
- MAC怎么在照片中添加水印_MAC自带编辑工具文字
- Mac如何与安卓手机传文件_Mac和Android
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- c# 如何用c#实现一个支持优先级的任务队列
- 如何使用Golang实现聊天室消息存档_存储聊天记
- Win11笔记本怎么看电池健康度_Win11电池报
- php增删改查报错1054怎么办_字段名错误排查修
- Python大文件处理策略_内存优化说明【指导】

)
QQ客服