自己实现数据结构系列一---ArrayList
1.先上代码:
public class ArrayList<E> {
private E[] data;
private int size;
/**
* 构造方法,初始化容量capacity
* @param capacity
*/
public ArrayList(int capacity){
data = (E[]) new Object[capacity];
size = 0;
}
/**
* 默认的构造方法,默认capacity=10
*/
public ArrayList(){
this(10);
}
/**
* 获取数组中元素的个数
* @return
*/
public int getSize(){
return size;
}
/**
* 获取数组的容量
* @return
*/
public int getCapacity(){
return data.length;
}
/**
* 判断数组是否为空
* @return
*/
public boolean isEmpty(){
return size == 0;
}
/**
* 在第index位置插入一个新元素
* @param index
* @param e
*/
public void add(int index,E e){
if(index < 0 || index > size){
throw new IllegalArgumentException("Add Failed");
}
//扩容
if (size == data.length){
resize(2*data.length);
}
//index后的元素都向后移动一位,注意:先移动后面的
for (int i = size; i > index;i--){
data[i+1] = data[i];
}
data[index] = e;
size++;
}
/**
* 扩容
* @param newCapacity
*/
private void resize(int newCapacity){
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++){
newData[i] = data[i];
}
data = newData;
}
/**
* 向所有元素后添加一个新元素
* @param e
*/
public void addLast(E e){
add(size,e);
}
/**
* 向所有元素前添加一个新元素
* @param e
*/
public void addFirst(E e){
add(0,e);
}
/**
* 获取index索引位置的元素
* @param index
* @return
*/
public E get(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get Failed");
}
return data[index];
}
/**
* 修改index位置的元素
* @param index
* @param e
*/
public void set(int index,E e){
if(index < 0 || index >= size){
throw new IllegalArgumentException("Get Failed");
}
data[index] = e;
}
/**
* 判断数组中是否有元素e
* @param e
* @return
*/
public boolean contains(E e){
for (int i = 0; i < size; i++){
if(data[i].equals(e)){
return true;
}
}
return false;
}
/**
* 查找元素e在数组中的位置,不存在返回-1
* @param e
* @return
*/
public int find(E e){
for (int i = 0; i < size; i++){
if(data[i].equals(e)){
return i;
}
}
return -1;
}
/**
* 从数组中删除index位置的元素,返回删除的元素
* @param index
* @return
*/
public E remove(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("remove Failed");
}
E ret = data[index];
//删除后,index后面的元素向前都移动一位,从index+1开始移动
for (int i = index+1; i < size; i++){
data[i-1] = data[i];
}
size --;
if(size == data.length/4 && data.length != 0){
resize(data.length/2);
}
return ret;
}
/**
* 从数组中删除第一个元素,
* @return
*/
public E removeFirst(){
return remove(0);
}
/**
* 从数组中删除最后一个元素
* @return
*/
public E removeLast(){
return remove(size-1);
}
/**
* 删除数组中元素e
* @param e
*/
public void removeElement(E e){
int index = find(e);
if(index != -1){
remove(index);
}
}
@Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size = %d, capacity = %d \n",size,data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if(i != size-1){
res.append(",");
}
}
res.append(']');
return res.toString();
}
}
自己实现数据结构系列一---ArrayList的更多相关文章
- Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例
java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...
- <数据结构系列3>队列的实现与变形(循环队列)
数据结构第三课了,今天我们再介绍一种很常见的线性表——队列 就像它的名字,队列这种数据结构就如同生活中的排队一样,队首出队,队尾进队.以下一段是百度百科中对队列的解释: 队列是一种特殊的线性表,特殊之 ...
- <数据结构系列2>栈的实现与应用(LeetCode<有效的的括号>)
首先想要实现栈,就得知道栈为何物,以下一段摘抄至百度百科: 栈(stack)又名堆栈,它是一种运算受限的线性表.其限制是仅允许在表的一端进行插入和删除运算.这一端被称为栈顶,相对地,把另一端称为栈底. ...
- JAVA数据结构系列 栈
java数据结构系列之栈 手写栈 1.利用链表做出栈,因为栈的特殊,插入删除操作都是在栈顶进行,链表不用担心栈的长度,所以链表再合适不过了,非常好用,不过它在插入和删除元素的时候,速度比数组栈慢,因为 ...
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
java基础解析系列(十)---ArrayList和LinkedList源码及使用分析 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder jav ...
- 【C#数据结构系列】查找
一:查找 1.1 基本概念和术语 查找(Search)是在数据结构中确定是否存在关键码等于给定关键码的记录的过程.关键码有主关键码和次关键码.主关键码能够唯一区分各个不同的记录,次关键码通常不能唯一区 ...
- java集合系列之ArrayList源码分析
java集合系列之ArrayList源码分析(基于jdk1.8) ArrayList简介 ArrayList时List接口的一个非常重要的实现子类,它的底层是通过动态数组实现的,因此它具备查询速度快, ...
- java数据结构--array与ArrayList的区别
ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...
- Java源码系列1——ArrayList
本文简单介绍了 ArrayList,并对扩容,添加,删除操作的源代码做分析.能力有限,欢迎指正. ArrayList是什么? ArrayList 就是数组列表,主要用来装载数据.底层实现是数组 Obj ...
随机推荐
- 如何取得select结果数据集的前10条记录。postgresql
我用的是POSTGRESQL.select name from t_personal order by personal_id desc 我想取得上面结果数据的,前10条记录.SQL语句怎么改. 我记 ...
- Java 浅拷贝,深拷贝
从Java 强引用.软引用,弱引用http://blog.csdn.net/jltxgcy/article/details/35558465一文中,我们看到把一个对象赋值给另一个对象,本质上 ...
- IDEA多线程调试设置
转至:http://blog.csdn.net/kevindai007/article/details/71412324 使用idea调试多线程的时候发现多线程无法调试,后来经过搜索发现,idea的断 ...
- Qt 编程指南 3 信号和槽沟通
https://qtguide.ustclug.org/ 1 信号和槽 所谓信号槽,简单来说,就像是插销一样:一个插头和一个插座.怎么说呢?当某种事件发生之后,比如,点击了一下鼠标,或者按了某个按键, ...
- Linux -- 利用 ptrace 进行代码注入
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...
- ARM汇编语言基础
ARM 与 Thumb 寄存器对应关系 PC寄存器: ARM状态为R15,Thumb状态为PC LR寄存器: ARM状态为R14,Thumb状态为LR SP寄存器: ARM状态为R13,Thumb状态 ...
- 1-STM32物联网开发WIFI(ESP8266)+GPRS(Air202)系统方案升级篇(方案总揽)
我的这个升级篇的代码适用于自己所有的带WIFI和GPRS模块的开发板,升级功能实质上是通过MQTT把数据发给WIFI和GPRS模块,然后模块进行保存和运行. 这个升级程序是当时自己花了两个星期的时间写 ...
- mqtt 客户端 基于Python
这几天一直在搞安全通信,微信小程序,反向代理等等,为了能让自己对整个系统做到把控,主要是需要了解每一个细节的地方,所以今天花了3个小时的时间学习了Python,因为我要用它来做Http和WebSock ...
- 11-51单片机ESP8266学习-AT指令(ESP8266作为TCP客户端,连接TCP服务器,用串口调试助手和手机TCP调试助手测试)
写完题目刚想起来一件事情,如果手机作为客户端(不连接路由器的情况下),手机连接模块的无线会分配一个IP地址,,,这个IP地址事先我也不知道....我先看看AT指令里面有没有一个指令可以打印一下连接自己 ...
- Attention[Content]
0. 引言 神经网络中的注意机制就是参考人类的视觉注意机制原理.即人眼在聚焦视野区域中某个小区域时,会投入更多的注意力到这个区域,即以"高分辨率"聚焦于图像的某个区域,同时以&qu ...