一,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的更多相关文章

  1. Java集合学习笔记

      在Java中,我们经常听到Collections框架.Collection类以及Collections类.这三者名字相似,但是从概念上讲却是不同的.Collections框架泛指Java中用于存储 ...

  2. java 集合学习笔记

    1.Collection(单列结合) List(有序,数据可重复) ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高. Vector:底层数据结构是数组,查询快,增删慢,线程 ...

  3. JDK源码学习笔记——ArrayList/Vector

    一.类定义 public class ArrayList<E> extends AbstractList<E> implements List<E>, Random ...

  4. python --->字典 集合 学习笔记

    1.字典--->创建空字典:dict={} broa=["李宁",”耐克“,“阿迪达斯”,“鱼c工作室”] sloga=[“A”,“B”,“C”,“D”] dict={&qu ...

  5. python之 集合 学习笔记

    """ 集合内的元素是无序的,集合内的元素必须是可哈希的集合内元素的唯一的,不存在重复列表和字典不能存在集合里面,因为列表字典可变 可哈希集合也是不可哈希的 unhash ...

  6. 我的集合学习笔记--LinkedList

    一,Node节点: /** * 存储元素基本单位 */ public class Node { Object data; Node pre; Node next; public Node(Node p ...

  7. 大数据学习笔记——Java篇之集合框架(ArrayList)

    Java集合框架学习笔记 1. Java集合框架中各接口或子类的继承以及实现关系图: 2. 数组和集合类的区别整理: 数组: 1. 长度是固定的 2. 既可以存放基本数据类型又可以存放引用数据类型 3 ...

  8. Java学习笔记——浅谈数据结构与Java集合框架(第一篇、List)

    横看成岭侧成峰,远近高低各不同.不识庐山真面目,只缘身在此山中. --苏轼 这一块儿学的是云里雾里,咱们先从简单的入手.逐渐的拨开迷雾见太阳.本次先做List集合的三个实现类的学习笔记 List特点: ...

  9. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

随机推荐

  1. Spring容器技术内幕之BeanWrapper类介绍

    引言 org.springframework.beans.BeanWrapper是Spring框架中重要的组件类.BeanWrapper相当于一个代理器,Spring委托BeanWrapperwanc ...

  2. 【Teradata】配置PE和AMP(congfig和reconfig工具、vprocmanager)

    The Reconfiguration and Configuration utilities are used to define the AMPs and PEs that operate tog ...

  3. NGINX Load Balancing - HTTP Load Balancer

    This chapter describes how to use NGINX and NGINX Plus as a load balancer. Overview Load balancing a ...

  4. Nginx使用教程(六):使用Nginx缓存之FastCGI缓存

    启用FastCGI缓存 <br\>编辑必须启用缓存的虚拟主机配置文件. nano /etc/nginx/sites-enabled/vhost 将以下行添加到server{}指令之外的文件 ...

  5. 8.02-json_use

    import json # 1.字符串和 dic list转换 # 字符串(json)----dict list data = '[{"name":"张三",& ...

  6. P2068 统计和(树状数组模板)

    这是一道树状数组题 #include<iostream> using namespace std; ; int tree[maxn], n, m; char h; int x, y; vo ...

  7. Python:Day48 Jquery

    引用方式: <script src="jquery-3.3.1.js"></script> jQuery就是一个jQuery对象,可以简写成$ 基本语法:$ ...

  8. PAT A1055 The World's Richest (25 分)——排序

    Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...

  9. Can 't connect to local MySQL server through socket '/tmp/mysql.sock '(2) "

    安装了mysql, 使用命令mysql -u root -p 弹出Can 't connect to local MySQL server through socket '/tmp/mysql.soc ...

  10. 一本通 1212:LETTERS

    题目描述 给出一个roe×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母.问最多可以经过几个字母. 输入 第一行,输入字母矩阵行数R和列数S,1≤ ...