我的集合学习笔记--ArrayList
一,ArrayList
实现自己的ArrayList:主要是添加方法,理解自动扩容机制
代码+注释
package com.amazing.jdk.learn2List.list_08_13; /**
* 1.实现ArrayList接口的增删改查方法
* 2.理解自动扩容机制
*参考:http://blog.csdn.net/u011240877/article/details/52802849
*/
public class MyArrayList<E> {
//需要扩容的数组
transient Object[] elementData;
//数组里的元素个数
private int size; public boolean add(E o) {
/*
1.先判断一下,不然会报空指针
*/
if(elementData==null){
elementData=new Object[]{};
size=0;
}
/*
2.再判断当数组被元素填满时,扩容
*/
if(size==elementData.length){
//3.定义一个数组接收原来数组的元素
Object[] oldData=elementData;
//4.扩容1.5倍
int newCapacity=(elementData.length*3)/2;
if(newCapacity<size) newCapacity=size;
//5.定义一个新长度的数组
elementData=new Object[newCapacity];
//6.复制
System.arraycopy(oldData,0,elementData,0,size);
}
elementData[size++] = o;
return true;
} public int size(){
return size;
} public E get(int index){
return (E) elementData[index];
} public void clear(){
for(int i=0;i<size();i++){
elementData[i]=null;
}
size=0;
} /*
System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:
public static void arraycopy(Object src,
int srcPos,
Object dest,
int destPos,
int length)
src:源数组; srcPos:源数组要复制的起始位置;
dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。
注意:src and dest都必须是同类型或者可以进行转换类型的数组.
有趣的是这个函数可以实现自己到自己复制,比如:
int[] fun ={0,1,2,3,4,5,6};
System.arraycopy(fun,0,fun,3,3);
则结果为:{0,1,2,0,1,2,6};
实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos
到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3). */ }
注意:elementData是用transient修饰的
先说一下:
transient关键字:一个对象中有些属性不需要被默认序列化,可以用transient关键子修饰。
用transient修饰的元素,该元素不会进行jvm默认的序列化。也可以自己完成这个元素的序列化
有两个方法签名可以实现。可以参考ArrayList里的两个方法 :
序列化方法:writeObject(java.io.ObjectOutputStream s),
反序列化方法:readObject(java.io.ObjectInputStream s)
那arrayList中的elementData 为什么被这个关键字修饰呢?难道不需要这个属性序列化吗?
其实是这样的,一个arrayList的容量一般是比它的size要大的,比方我的容量是10,但的存进去的值就只有3,也就是size()只有3.
那如果elementData 不被transient修饰的话,就相当于整个容量为10的list全部被序列化了,
那我们知道其实list里面就只有3个有效值,其它都是空的,这样会造成资源浪费。
那怎么做呢?transient就发挥作用了,那个变量修饰为transient,使其不能被序列化。
那有的人会问,那不是那三个有效值也不能序列化了。不是的,arrayList提供了一个方法writeObject,
源码:
private void writeObject(java.io.ObjectOutputStream s)
throws java.io.IOException{
// Write out element count, and any hidden stuff
int expectedModCount = modCount;
s.defaultWriteObject(); // Write out size as capacity for behavioural compatibility with clone()
s.writeInt(size); // Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
} if (modCount != expectedModCount) {
throw new ConcurrentModificationException();
}
}
源码分析:
s.defaultWriteObject(); // 默认的属性进行了序列化
// Write out all elements in the proper order.
for (int i=0; i<size; i++) {
s.writeObject(elementData[i]);
} //只有transient修饰的元素才进行了序列化,空的没有序列化
参考博客:http://blog.csdn.net/qq_18416057/article/details/73136936?locationNum=10&fps=1
如果对序列化和反序列化有疑问,可以看我另一篇博客,对象的序列化和反序列化:http://www.cnblogs.com/inspred/p/7552690.html
我的集合学习笔记--ArrayList的更多相关文章
- Java集合学习笔记
在Java中,我们经常听到Collections框架.Collection类以及Collections类.这三者名字相似,但是从概念上讲却是不同的.Collections框架泛指Java中用于存储 ...
- java 集合学习笔记
1.Collection(单列结合) List(有序,数据可重复) ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高. Vector:底层数据结构是数组,查询快,增删慢,线程 ...
- JDK源码学习笔记——ArrayList/Vector
一.类定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, Random ...
- python --->字典 集合 学习笔记
1.字典--->创建空字典:dict={} broa=["李宁",”耐克“,“阿迪达斯”,“鱼c工作室”] sloga=[“A”,“B”,“C”,“D”] dict={&qu ...
- python之 集合 学习笔记
""" 集合内的元素是无序的,集合内的元素必须是可哈希的集合内元素的唯一的,不存在重复列表和字典不能存在集合里面,因为列表字典可变 可哈希集合也是不可哈希的 unhash ...
- 我的集合学习笔记--LinkedList
一,Node节点: /** * 存储元素基本单位 */ public class Node { Object data; Node pre; Node next; public Node(Node p ...
- 大数据学习笔记——Java篇之集合框架(ArrayList)
Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...
- Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)
横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...
- JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序
前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...
随机推荐
- JAVA API的下载和中文查看API
一.JAVA API的下载 1.1 JAVA由SUN公司开发,2006年SUN公司宣布将Java技术作为免费软件对外发布,标志着JAVA的公开免费.2009年,SUN公司被甲骨文公司收购,因此我们现在 ...
- PATH_SEPARATOR
PATH_SEPARATOR是一个常量,在Linux系统中是一个" : "号,Windows上是一个";"号.所以编写程序时最好用常量 PATH_SEPARAT ...
- 【Teradata】并行操作工具
1.psh并行shell //单机模式 psh date psh pdestate -a psh verify_pdisks //交互模式 psh psh.>help psh.>selec ...
- nginx基本配置与参数说明
user nobody; #启动进程,通常设置成和cpu的数量相等 worker_processes 1; #全局错误日志及PID文件 #error_log logs/error.log; # ...
- Integer判断大于 == 127时的坑
在一次判断返回Interger类型的code, 用==结果, 没进去 Integer的值在-128到127时,Integer对象是在IntegerCache.cache产生,会复用已有对象,也就是说 ...
- Shiro+JWT+Spring Boot Restful简易教程
序言 我也是半路出家的人,如果大家有什么好的意见或批评,请务必issue下. 项目地址:https://github.com/Smith-Cruise/Spring-Boot-Shiro . 如果想要 ...
- iptables 从一台机到另一台机端口转发
启用网卡转发功能#echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问192.168.0.211:1521端 ...
- PyCharm 中使用 Pylint 控制代码质量
1) Pylint安装 - Windows下: 直接在 cmd 下使用 pip install pylint 即可(如果 pip 不可用,首先安装最新版 Python,会默认安装 pip,或者找到 p ...
- 深入理解 Object.defineProperty 及实现数据双向绑定
Object.defineProperty() 和 Proxy 对象,都可以用来对数据的劫持操作.何为数据劫持呢?就是在我们访问或者修改某个对象的某个属性的时候,通过一段代码进行拦截行为,然后进行额外 ...
- Java入门篇(五)——字符串/String类
前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...