内功心法 -- 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, ...
随机推荐
- shell之crontab
一 crontab高级用法 Crontab 主要是在做排程, 通常一般寫法大概都是如下: 0 0 * * * /usr/local/www/awstats/cgi-bin/awstats.sh 這種 ...
- HUST 1353 Dartboard
构造.应该有多种构造方法.做的时候WA了好几发,怀疑做法是错的,事实上是代码写搓了.. 我是这样构造的:先从上往下左右放奇数,再从下往上左右填偶数 (一)如果n/2是偶数(以12为例) 左边列是内环, ...
- object - c 在URL中截取特定参数的值
#pragma mark - 获取url特定的参数 -(NSString *) jiexi:(NSString *)CS webaddress:(NSString *)webaddress { NSE ...
- iOS开发——自定义进度圆环
1.在DrawCircle.h文件中 提供了接口,在使用的时候,可以设定圆心.半径.角度.圆环的宽度.圆环的背景底色.圆环的进度条颜色,当然后面三个有自定义的值. // // DrawCircle. ...
- Spring学习---JPA配置和使用
理论的东西如果不实践,永远不会变成自己的东西.本文将介绍用maven管理,用Hibernate作为JPA供应商,使用MYSQL数据库,配置和使用JPA. 以下代码已经上传至GITHUB. ...
- LPC1768的usb使用--硬件篇
LPC1768芯片带有USB设备控制器,前面写的文章都是在说比较简单的设备驱动,今天来说复杂一点的 首先是硬件层的配置 #ifndef __USBHW_H__ #define __USBHW_H__ ...
- tornado 增加日志模块
log类 #!/usr/bin/env python # -*- coding:utf-8 -*- import logging.handlers class Logger(logging.Logge ...
- pcommlite串口通讯库使用
MFC下串口编程使用最多的两种方法是读取注册表和使用mscomm组件,都有着或多或少的缺陷,调用系统SDK比较麻烦,而MSCOMm组件最多支持16个串口,串口号大于16的时候无法打开,遇到这种情况,可 ...
- Intent的概念及应用(一)
------siwuxie095 1.显式Intent (1)先创建一个项目:LearnIntent,选择API:21 Android 5.0, 选择Empty Activity,完成 (2)创建一个 ...
- css清除浮动float的三种方法总结
原文地址: http://my.oschina.net/leipeng/blog/221125 张大神的解析: http://www.zhangxinxu.com/wordpress/2010/01/ ...