JAVA SE ArrayList 底层实现
Array 查询效率高,增删效率低(
Link 增删效率高
Vector 线程安全
List 列表
源代码:
package com.littlepage.test; /**
* 基于底层实现ArrayList
* @author Littlepage
* @reference bjsxt.com
*/
public class LittlePagesArrayList<E> {
// the array of element
private Object[] elementData;
private int size;// the size of SxtArrayList private static final int DEFALT_CAPACITY = ;// the initial capacity public LittlePagesArrayList() {
elementData = new Object[DEFALT_CAPACITY];
} public LittlePagesArrayList(int capacity) {// set the capacity of SxtArrayList
if (capacity < ) {
throw new RuntimeException("the capacity is negative");
} else if (capacity == ) {
elementData = new Object[DEFALT_CAPACITY];
} else {
elementData = new Object[capacity];
}
} public void add(E element) {
if (elementData.length == size) {
/**
* enlarge the capacity by 1.5 times
**/
Object[] newArray = new Object[elementData.length
+ (elementData.length >> )];
// use the system method copy the array
System.arraycopy(elementData, , newArray, , elementData.length);
elementData = newArray;
}
elementData[size++] = element;
} public E getElement(int index) {
checkRange(index);
return (E) elementData[index];// get element by index
} public void setElement(int index, E element) {
/**
* set element by index
*/
checkRange(index);
elementData[index] = element;
} public void removeElement(int index) {
/**
* remove by index
*/
int numMoved=elementData.length-index-;
if(numMoved>){
System.arraycopy(elementData, index+, elementData, index, numMoved);
}
elementData[size-]=null;
size--;
} public void removeElement(E element){
/**
* remove by element
*/
Object objElement=(Object)element;
for (int i=;i<size;i++) {
if(objElement.equals(elementData[i])){
removeElement(i);//remove by index
}
}
} public void checkRange(int index) {
/**
* check the index range
*/
if (index >= size || index < ) {
throw new IndexOutOfBoundsException(
"the index of SxtArrayList is out of Bounds:" + index);
}
} public int size(){
return size;
} public boolean isEmpty(){
return size==;
}
@Override
public String toString() {// the toString method
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i=;i<size;i++) {
sb.append(elementData[i] + ",");
}
sb.setCharAt(sb.length() - , ']');
return sb.toString();
} /**
* test method
*
* @param args
*/
public static void main(String[] args) {
LittlePagesArrayList s1 = new LittlePagesArrayList();
System.out.println(s1.isEmpty());
for (int i = ; i < ; i++) {
s1.add("littlepage"+i);
}
s1.removeElement();
s1.removeElement();
s1.removeElement("littlepage0");
System.out.println(s1.getElement());
System.out.println(s1);
System.out.println(s1.size());
System.out.println(s1.isEmpty());
} }
JAVA SE ArrayList 底层实现的更多相关文章
- Java——ArrayList底层源码分析
1.简介 ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问.数组的缺点是每个元素之间不能有间隔, 当数组大小不满足时需要增加存储能力,就要将已经有数 ...
- Java SE教程
第0讲 开山篇 读前介绍:本文中如下文本格式是超链接,可以点击跳转 >>超链接<< 我的学习目标:基础要坚如磐石 代码要十份规范 笔记要认真详实 一.java内容介绍 ...
- Java SE基础知识
Java SE面试题 目录 Java SE基础 基本语法 数据类型 关键字 面向对象 集合 集合类概述 Collection接口 List Set Map Java SE基础 基本语法 数据类型 Ja ...
- Java复习总结(二)Java SE 面试题
Java SE基础知识 目录 Java SE 1. 请你谈谈Java中是如何支持正则表达式操作的? 2. 请你简单描述一下正则表达式及其用途. 3. 请你比较一下Java和JavaSciprt? 4. ...
- Java SE 8 新增特性
Java SE 8 新增特性 作者:Grey 原文地址: Java SE 8 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new_ ...
- 初涉java库--ArrayList
我的车就差一个轮子啦,造好轮子,我就飞上天与太阳肩并肩啦,想想都激动.什么你要自己造轮子,是不是傻,商店里不都是别人造好的吗,又好又方便,只需一点money,你没有money,那你只能做个安静的美男子 ...
- Java Se : Java NIO(服务端)与BIO(客户端)通信
Java目前有三种IO相关的API了,下面简单的说一下: BIO,阻塞IO,最常用的Java IO API,提供一般的流的读写功能.相信学习Java的人,都用过. NIO,非阻塞IO,在JDK1.4中 ...
- java 16-2 ArrayList的练习2
需求:去除集合中自定义对象的重复值(对象的成员变量值都相同 注意: 我们按照和字符串一样的操作,发现出问题了. 为什么呢? 我们必须思考哪里会出问题? 通过简单的分析,我们知道问题出现在了判断上. ...
- Java API —— ArrayList类 & Vector类 & LinkList类
1.ArrayList类 1)ArrayList类概述 · 底层数据结构是数组,查询快,增删慢 · 线程不安全,效率高 2)ArrayList案例 ...
随机推荐
- Spring MVC 编程流程步骤
Spring MVC 编程流程步骤 1. 建立Maven工程 2. 添加Spring MVC依赖 <dependencies> <dependency> <groupId ...
- c++ STL中的set和multiset
1.结构 set和multiset会根据特定的排序原则将元素排序.两者不同之处在于,multisets允许元素重复,而set不允许重复. set中的元素可以是任意类型的,但是由于需要排序,所以元素必须 ...
- Golang闭包入门了解
概念闭包就是一个函数与其相关的引用环境组成的一个整体.闭包本质其实是一个函数,但是这个函数会用到函数外的变量,它们共同组成的整体我们叫做闭包. 简单举例说明 package main import ( ...
- 论文阅读笔记 Improved Word Representation Learning with Sememes
论文阅读笔记 Improved Word Representation Learning with Sememes 一句话概括本文工作 使用词汇资源--知网--来提升词嵌入的表征能力,并提出了三种基于 ...
- python基础--概念性问题
面试其他篇 目录: 头条面试题:https://blog.csdn.net/m0_37947204/article/details/80103151 1.1 python常见基础题 1.遍历文件夹 # ...
- linux日常管理
1.压缩和解压 tar压缩tar -czf hxl_product.tar.gz ./product tar解压tar -xzvf hxl_app.tar.gz z选项会将该压缩文件直接解压到目录,要 ...
- 2018-2019-1 20189206 《Linux内核原理与分析》第六周作业
linux内核分析学习笔记 --第五章 系统调用的三层机制 学习重点--深入理解系统调用的过程 给MenuOS添加命令 添加命令的方式较为简单,在LinuxKernel/menu/test.c目录下, ...
- opencv学习之路(3)、批量读取图片、视频分解、视频合成
一.批量有序读取图片 #include<opencv2/opencv.hpp> using namespace cv; void main() { //批量读取图片(有序) ]; ]; M ...
- Ymodem协议(参考STM32)
相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootload设计.所以就仔细的去了研究了一翻.以前都是用的stm32官 ...
- GDPR
http://column.caijing.com.cn/20180523/4457753.shtml