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案例 ...
随机推荐
- Kali linux vim使用命令笔记
Kali Linux系统的vi编辑器/vim编辑器的使用和CentOS有很多不同.基本使用方法如下 1.vi的基本概念 基本上vi可以分为三种状态,分别是命令模式(command mode).插入模式 ...
- C调用java JNI_CreateJavaVM只能调用成功一次
https://bbs.csdn.net/topics/392264971 再使用c语言调用java代码的时候,选择使用JNI,根据网上的提示已经能够正常跑了,int mask_name( char* ...
- Python小项目四:实现简单的web服务器
https://blog.csdn.net/u010103202/article/details/74002538 本博客是整理在学习实验楼的课程过程中记录下的笔记形成的,参考:https://www ...
- PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比
公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把 ...
- mysql常用的操作命令
在mysql中以半角分号;作为命令的结束符 查看当前系统包含的数据库:mysql> show databases [like ' ']; 从一个数据库切换到另一个:mysql>use ol ...
- VMware Workstation Pro14安装
1. 下载VMware Workstation Pro14,注意,这个链接支持win7 64及以上系统 2. 点击进入安装 3. 接受许可协议 4. 选择安装目录,是否选择增强型键盘驱动程序 5. ...
- Python爬虫(一)——豆瓣下图书信息
爬虫目的: 随着近年互联网的发展,网络上的信息飞速数量增长.在庞大的数据面前想要获得期望的信息往往如同大海捞针.通过合理的筛选,在百万甚至数亿计的数据中找到所需信息,无疑有着非常大的意义. 在豆瓣网下 ...
- 对浏览器攻击:MS10-002
对浏览器攻击:MS10-002 MS10-002漏洞介绍 针对微软Internet Explorer"极光"内存损坏的攻击,当用户查看特制网页时允许远程执行代码. 实践过程 命令行 ...
- uniGUI试用笔记(一)
通过向导创建一个uniGUI应用服务器,工程中有三个文件: TUniServerModule = class(TUniGUIServerModule) TUniMainModule = class(T ...
- Python3 tkinter基础 Label pack 设置控件在窗体中的位置
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...