需要注意的subList方法!和substring是不一样的!从源码解释他们的不同。
很多时候我们截取字符串用的是substring方法,很自然用着,但是对于列表的截取时很多时候就用得很少,但是其实他们是很不一样的,具体哪里不一样呢?
package main; import java.util.ArrayList;
import java.util.List; /**
* @author XX
*
*/
public class Test { public static void main(String[] args) {
//先来一个字符串
String abcd = "abcd";
//删除字符串前面两个字符
String cd = abcd.substring(2);
//true
System.out.println(cd.equals(cd));
//false
System.out.println(abcd.equals(cd)); //下面的源码很容易解释这个问题,造成这个结果的原因是,生成了一个新的字符串,所以不一样,很正常也容易理解 /*public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}*/ List<Integer> list = new ArrayList<Integer>();
list.add(3);
list.add(2);
list.add(2);
list.add(4);
list.add(1);
list.add(5); List<Integer> list2 = list.subList(0, list.size());
list2.add(2);
//true?为什么list截取之后再加元素还是true呢?
System.out.println(list.equals(list2));
//如果不明白的话,打印个原来列表的size就明白了,结果是7,原来只有6个元素哦
System.out.println(list.size()); //然后我们再看看源码是怎么样的
/*
* public List<E> subList(int fromIndex, int toIndex)
* {
* subListRangeCheck(fromIndex, toIndex, size);
* return new SubList(this, 0, fromIndex, toIndex);
* }
*
* 首先是进入这个方法,是List中的subList中ArrayList实现的那个方法
* subListRangeCheck这个我们不管,看命名就知道是判断能不能sub
* 直接进下一个方法,别看到new就着急,往里面看看
* private class SubList extends AbstractList<E> implements RandomAccess {
private final AbstractList<E> parent;
private final int parentOffset;
private final int offset;
int size; SubList(AbstractList<E> parent,
int offset, int fromIndex, int toIndex) {
this.parent = parent;
this.parentOffset = fromIndex;
this.offset = offset + fromIndex;
this.size = toIndex - fromIndex;
this.modCount = ArrayList.this.modCount;
} public E set(int index, E e) {
rangeCheck(index);
checkForComodification();
E oldValue = ArrayList.this.elementData(offset + index);
ArrayList.this.elementData[offset + index] = e;
return oldValue;
} public E get(int index) {
rangeCheck(index);
checkForComodification();
return ArrayList.this.elementData(offset + index);
} public int size() {
checkForComodification();
return this.size;
} 。。。。。
后面的方法省略了 这里我们就可以看到,其实在这里的操作,都是this. =
这就表示所有的操作都是在原来的列表上面操作的。 简单的说,subList方法只是返回了一个原来列表的视图而已
*
* */ //利用这个性质可以实现删除列表中任何位置的连续的一段值,代码如下
list.subList(0, 2).clear();
//执行上面这句之后,列表就变成了[2, 4, 1, 5, 2],删除了前面两个数,列表的大小也变成了5
System.out.println(list.size()); //需要提醒的是,一旦用过subList方法之后,就不要对原来的列表进行任何操作了,
//否则在对新列表操作时就会出现并发修改异常,这也和这个性质有关 }
}
需要注意的subList方法!和substring是不一样的!从源码解释他们的不同。的更多相关文章
- 使用ajax方法实现form表单的提交(附源码)
写在前面的话 在使用form表单的时候,一旦点击提交触发submit事件,一般会使得页面跳转,页面间的跳转等行为的控制权往往在后端,后端会控制页面的跳转及数据传递,但是在某些时候不希望页面跳转,或者说 ...
- equals和==方法比较(三)--Long中LongCache源码分析
下面我们来分析,上篇博客中遗留的问题,为什么下方的两个一个是true,两一个是false那? //true Long l1=123l; Long l2=123l; System.out.println ...
- Python数据类型方法精心整理,不必死记硬背,看看源码一切都有了
Python认为一切皆为对象:比如我们初始化一个list时: li = list('abc') 实际上是实例化了内置模块builtins(python2中为__builtin__模块)中的list类: ...
- equals和==方法比较(二)--Long中equals源码分析
接上篇,分析equals方法在Long包装类中的重写,其他类及我们自定义的类,同样可以根据需要重新equals方法. equals方法定义 equals方法是Object类中的方法,java中所有的对 ...
- java 8 Hashmap深入解析 —— put get 方法源码
每个java程序员都知道,HashMap是java中最重要的集合类之一,也是找工作面试中非常常见的考点,因为HashMap的实现本身确实蕴含了很多精妙的代码设计. 对于普通的程序员,可能仅仅能说出Ha ...
- 框架源码系列五:学习源码的方法(学习源码的目的、 学习源码的方法、Eclipse里面查看源码的常用快捷键和方法)
一. 学习源码的目的 1. 为了扩展和调优:掌握框架的工作流程和原理 2. 为了提升自己的编程技能:学习他人的设计思想.编程技巧 二. 学习源码的方法 方法一: 1)掌握研究的对象和研究对象的核心概念 ...
- 查看Chrome浏览器扩展程序源码的两种方法
注意:仅在当前最新的版本 55.0.2883.87 m (64-bit)上测试有效 首先获取extensionId: chrome 打开扩展程序页面 chrome://extensions/ 比如我想 ...
- jquery源码解析:jQuery工具方法when详解
我们先来看when方法是如何使用的: var cb = $.when(); //when方法也是返回一个延迟对象,源码是return deferred.promise();返回的延迟对象不能修改状 ...
- python最好用的IDE及查看源码的方法
一.PyCharm 很多语言都有比较流行的开发工具,比如JAVA 的Eclipse, C#,C++的VisualStudio,最好的Python 开发IDE就是PyCharm 可以直接调试代码,试运行 ...
随机推荐
- LeetCode OJ 223.Rectangle Area
Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...
- nefu 753 n!末尾有多少个0
Problem : 753 Time Limit : 1000ms Memory Limit : 65536K description 计算N!末尾有多少个0 input 输入数据有多组,每组1行,每 ...
- repeat帮定删除按钮事件,并且生成去人删除提示
前台 <ItemTemplate> <tr> <td> <asp:LinkButton ID="LinkButton_cancel" On ...
- 12.04 ubuntu 更改IP
在一个局域网里面,如果是自动获取IP,就会导致IP冲突 进入要连接的热点进行设置 IPV4 Setting address netmask ...
- 为什么要在onNewIntent的时候要显示的去调用setIntent
一.原因: 当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIn ...
- MyEclipse 2015 如何使项目能够使用 Hibernate自动生成文件
在MyEclipse-Project facets 下 对hibernate这一栏打钩即可
- Dockerfile编写语法
docker镜像本质上就是一个个基础镜像的堆叠,为了做出我们想要的镜像,我们需要考虑最终镜像所需的所有基础环境,然后一层层堆叠.也就是不断以基础镜像搭建上层镜像. 先看例子: # Version: # ...
- opencv----人脸美白算法,祛斑,祛痘,磨皮等
现在各种手机camera软件都自带图像美颜处理,但是成熟的算法在网上很难搜到,博主也是自己摸索了自己做出来了,跟美图秀秀的处理效果相比,还不错,感觉很好,所以PO上来,与各位博友分享之. 首先是根据网 ...
- HDU 5652 India and China Origins 二分优化+BFS剪枝
题目大意:给你一个地图0代表可以通过1代表不可以通过.只要能从第一行走到最后一行,那么中国与印度是可以联通的.现在给你q个点,每年风沙会按顺序侵蚀这个点,使改点不可通过.问几年后中国与印度不连通.若一 ...
- 闭包 -> map / floatMap / filter / reduce 浅析
原创: 转载请注明出处 闭包是自包含的函数代码块,可以在代码中被传递和使用 闭包可以捕获和存储其所在上下文中任意常量和变量的引用.这就是所谓的闭合并包裹着这些常量和变量,俗称闭包.Swift 会为您管 ...