内功心法 -- 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, ...
随机推荐
- php 中的魔术方法-----“事件方法”
来源:http://lornajane.net/posts/2012/phps-magic-__invoke-method-and-the-callable-typehint php 中的这个对象 , ...
- javascript模拟鼠标双击事件
通常我们在做开发的时候需要通过单击切换对立事件,简单做了一个模型. <!DOCTYPE html> <html> <head> <title>javas ...
- [Unity Socket]在Unity中如何实现异步Socket通信技术
在刚刚开发Unity项目的过程中,需要用到即时通信功能来完成服务器与客户端自定义的数据结构封装. 现在将部分主要功能的实现代码抽取出来实现了可以异步Socket请求的技术Demo. 客户端脚本Clie ...
- CodeForces 652B z-sort
先对序列排个序. 例如:1 2 3 4 5 6 7 我们把序列分成两半,前一半是1 2 3 4,后一半是5 6 7 然后,我们从前一半取最小的一个,再从后一半取最小的一个..一直操作下去就能构造出答案 ...
- IIS Default Web Site : The service did not response to the start or control request in a timely fashion
IIS Default Web Site无法启动,提示错误:The service did not response to the start or control request in a time ...
- CSS判断不同分辨率显示不同宽度布局CSS3技术支持IE6到IE8
CSS判断不同分辨率浏览器(显示屏幕)显示不同宽度布局CSS3技术支持IE6到IE8.将用到css3 @media样式进行判断,但IE9以下版本不支持CSS3技术,这里DIVCSS5给大家介绍通过JS ...
- CodeSmith批量生成实体
保存以下文件为ModelBatch.cst <%@ Register Name="Model" Template="D:\Q\web\LHWYVISIT\trunk ...
- 如何开发一个微信小程序
一.概述 特点:对商家来说,小程序的开发成本低(有丰富的组件.api等).运营成本低(有数据日志等).稳定.互动流畅,便于分享.传播(基本微信平台的大量用户).对用户来说,扫码即可获取服务,随 ...
- chkdsk
通过 Microsoft 的相关帮助就可以明白,例如对D盘进行操作,则: 示例1:chkdsk /? 显示帮助信息. 示例2:chkdsk d: 检查D盘的磁盘状态,报告磁盘错误. 示例3:chkds ...
- Repository 设计模式介绍(转)
在DDD设计中大家都会使用Repository pattern来获取domain model所需要的数据. 1.什么事Repository? "A Repository mediates b ...