我的集合学习笔记--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的基础知识四
一.Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出需要的类.所有这些流类代表了输入源和输出目标. Java.io 包中的流支持很多种格式,比如:基 ...
- June 15. 2018 Week 24th Friday
If at first you don't succeed, then dust yourself off and try again. 失败了没关系,重振旗鼓,从头再来. From Aaliyah, ...
- voinc+vue实现级联选择
需求: vonic中实现级联选择 <!DOCTYPE html> <html> <head> <title>下拉框</title> < ...
- 025k个一组翻转链表
#include "000库函数.h" struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), n ...
- python3编写网络爬虫16-使用selenium 爬取淘宝商品信息
一.使用selenium 模拟浏览器操作爬取淘宝商品信息 之前我们已经成功尝试分析Ajax来抓取相关数据,但是并不是所有页面都可以通过分析Ajax来完成抓取.比如,淘宝,它的整个页面数据确实也是通过A ...
- JS页面打印
平常浏览网页和文档的时候,随处可见打印两个字,有时候不小心点到或者快捷键触发到,就会弹出一个打印的页面,上边显示的打印机是GoldGrid Virtual Printer,这是计算机的虚拟打印机,打印 ...
- uva 11728 - Alternate Task(数论)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u011328934/article/details/36409469 option=com_onli ...
- Rancher学习笔记----在UI界面添加主机页面无法正常显示
今天在学习rancher添加主机的时候,遇到了一个小问题,但是困扰老娘一上午 问题描述:在点击添加主机的时候,页面有跳转,但是页面显示为空,没有任何可选项.如下正常界面: 解决办法是:请换个浏览器
- [matlab] 22.matlab图论实例 最短路问题与最小生成树 (转载)
最短路问题之 Floyd 某公司在六个城市 c1c1,c2c2,….,c6c6 中有分公司,从 cici 到 cjcj 的直接航程票价记在下述矩阵的 (ii,jj) 位置上. (∞∞表示无直接航路), ...
- 5-servlet简介
一.servlet1.是什么:java程序来处理页面请求和响应2.实现方式: a.实现Servlet接口 b.继承HttpServlet类 3.步骤: a.创建一个java程序实现Servlet或者继 ...