内功心法 -- java.util.ArrayList<E> (6)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>中的其他操作和数组操作进行介绍,主要内容包括:
1、其他操作
2、数组操作
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1、ArrayList的其他操作和数组操作
其他操作和数组操作
(1)Object clone() , 关于java中的深拷贝和浅拷贝可以看看这里的介绍
功能: 返回此列表实例的浅复制
示例代码:
import java.util.ArrayList; public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(22);
list.add(33);
list.add(44);
list.add(11);
list.add(15);
list.add(12);
list.add(7);
list.add(3);
System.out.println("list1 :" + list);
//测试ArrayList的'Object clone()'方法的使用
ArrayList<Integer> list2 = (ArrayList<Integer>) list.clone();
System.out.println("list2 :" + list2);
System.out.println("-----------------");
list2.set(1, 3333);
System.out.println("list1 :" + list);
System.out.println("list2 :" + list2);
}
} 运行结果:
list1 :[22, 33, 44, 11, 15, 12, 7, 3]
list2 :[22, 33, 44, 11, 15, 12, 7, 3]
-----------------
list1 :[22, 33, 44, 11, 15, 12, 7, 3]
list2 :[22, 3333, 44, 11, 15, 12, 7, 3]
源代码如下:
public Object clone() {
try {
@SuppressWarnings("unchecked")
//进行浅拷贝
ArrayList<E> v = (ArrayList<E>) super.clone();
//为拷贝的新对象设置属性值
v.elementData = Arrays.copyOf(elementData, size);
v.modCount = 0;
return v;
} catch (CloneNotSupportedException e) {
// this shouldn't happen, since we are Cloneable
throw new InternalError();
}
}
(2) void ensureCapaCity(int minCapacity)
功能:如有必要,增加此列表实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数
源代码如下:
/*
确保列表容量足够
*/
public void ensureCapacity(int minCapacity) {
//如果参数minCapacity>0,则调用内部方法ensureCapacityInternal
if (minCapacity > 0)
ensureCapacityInternal(minCapacity);
} /*
内部私有方法,确保列表容量足够
*/
private void ensureCapacityInternal(int minCapacity) {
//fast-fail机制标识加1
modCount++;
// overflow-conscious code
//参数minCapacity比当前列表容量大,则调用私有方法grow
if (minCapacity - elementData.length > 0)
grow(minCapacity);
} /*
内部私有方法,
*/
private void grow(int minCapacity) {
// overflow-conscious code
//记录当前列表容量大小
int oldCapacity = elementData.length;
//计划扩容大小为原列表容量大小的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
//如果计划扩容的值 比 参数minCapacity小,则用minCapacity的值作为扩展的大小
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity; //检查扩容的容量是否大于 列表允许的最大容量
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//调用java.util.Arrays的copyOf方法对原数组elementData进行复制,复制的长度为newCapacity
elementData = Arrays.copyOf(elementData, newCapacity);
} private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
(3)void trimToSize()
功能:将此列表的容量调整为列表的当前元素个数
源代码如下:
public void trimToSize() {
//fast-fail机制标识加1
modCount++;
//记录原列表容量大小
int oldCapacity = elementData.length;
//如果列表中元素个数 小于 列表容量带下,则对列表容量进行缩小
if (size < oldCapacity) {
elementData = Arrays.copyOf(elementData, size);
}
}
(4)Object[] toArray()
功能:按适当顺序返回包含此列表中所有元素的数组
源代码如下:
public Object[] toArray() {
return Arrays.copyOf(elementData, size);
}
(5)<T> T[] toArray(T[] a)
功能:按适当顺序返回包含此列表中所有元素的数组
源代码如下:
@SuppressWarnings("unchecked")
public <T> T[] toArray(T[] a) {
if (a.length < size)
// Make a new array of a's runtime type, but my contents:
return (T[]) Arrays.copyOf(elementData, size, a.getClass());
System.arraycopy(elementData, 0, a, 0, size);
if (a.length > size)
a[size] = null;
return a;
}
-------------------------------------------------------------------------------------------------------------
java.util.ArrayList系列文章
java.util.ArrayList<E>(1) java.util.ArrayList<E>(2) java.util.ArrayList<E>(3)
java.util.ArrayList<E>(4) java.util.ArrayList<E>(5) java.util.ArrayList<E>(6)
相关知识
java.util.Collection<E> java.util.AbstractCollection<E> java.util.List<E>
java.util.AbstractList<E> java.util.Iterator<E> java.util.ListIterator<E>
Java中的标记接口 迭代器模式 Java中的深拷贝和浅拷贝 java.util.Arrays
内功心法 -- java.util.ArrayList<E> (6)的更多相关文章
- 内功心法 -- java.util.ArrayList<E> (1)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (2)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (3)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (4)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (5)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
一.背景 最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回Lis ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)
package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...
- java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)
一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...
随机推荐
- MySQL 索引的使用
一.or 的使用 (1)MySQL版本大于 5.x 的会使用 index merge 功能,即可以将多个单列索引集合起来使用,不过在查询时使用 or 的话,引擎为 myisam 的会开启 index ...
- opencv图像特征检测之斑点检测
前面说过,图像特征点检测包括角点和斑点,今天来说说斑点,斑点是指二维图像中和周围颜色有颜色差异和灰度差异的区域,因为斑点代表的是一个区域,所以其相对于单纯的角点,具有更好的稳定性和更好的抗干扰能力. ...
- 内层div的margin-top影响外层div——引出外边距合并Collapsing margins
内层div的margin-top影响外层div——引出外边距合并Collapsing margins 作者:zccst 今天才算是了解边距合并.正如一位前辈所言,每一个CSS的坑,都让你学到不少知识. ...
- POJ 2373 Yogurt factory
简单DP. 这周所用的实际花费是上一周的花费+S与这周费用的较小值. #include<cstdio> #include<cstring> #include<cmath& ...
- select取值问题
全栈攻城狮们给挖了各种坑..其中一个典型是select控件取值.直接上代码: <!DOCTYPE html> <html lang="en"> <he ...
- ios开发中全局变量设置和调用方法
ios开发中,全局变量设置和调用方法如下:在AppDelegate.h文件中设置全局变量:@interface ***AppDelegate{NSString *myName;}@property ( ...
- 关于mysql中触发器old和new如何更好的区别我有话要说?
1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示: 2.当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说 ...
- ubuntu 安装chrome浏览器
对于一个一直用chrome的人来说,真的很不习惯用firefox,虽然firebug很好用.. 好吧,心情不佳,直接上命令: 下载命令(有墙,下不下来,多试几次): wget https://dl.g ...
- MySQL5.6多实例部署
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://suifu.blog.51cto.com/9167728/1850560 无论是迫 ...
- js原生设计模式——9外观模式封装2(小型代码库YJ)
<script type="text/javascript"> //小型代码库YJ封装 var YJ = { //根据id获取元素 ...