特点:

在内存中分配连续的空间,只存储数据,不存储地址信息。位置就隐含着地址。

1

优点:

1.节省存储空间,因为分配给数据的存储单元全用存放结点的数据(不考虑c/c++语言中数组需指定大小的情况), 结点之间的逻辑关系没有占用额外的存储空间。

2. 索引查找效率高,即每一个结点对应一个序号,由该序号可以直接计算出来结点的存储地址。 假设线性表的每个数据元素需占用K个存储单元,并以元素所占的第一个存储单元的地址作为数据元素的存储地址。 则线性表中序号为i的数据元素的存储地址LOC(a i )与序号为i+1 的数据元素的存储地址LOC(a i+1 )之间的关系为

LOC(a i+1 ) = LOC(a i ) + K

通常来说,线性表的i号元素a i 的存储地址为

LOC(a i ) = LOC(a 0 ) + i×K

其中LOC(a 0 )为 0 号元素a 0 的存储地址,通常称为线性表的起始地址。

缺点:

1.插入和删除操作需要移动元素,效率较低。

2.必须提前分配固定数量的空间,如果存储元素少,可能导致空闲浪费。

3.按照内容查询效率低,因为需要逐个比较判断

无参构造(一开始如果用户没设置集合大小,初始值就为10)

public ArrayList(){this(10); //数组大小初始为10

}

有参构造(给用户设置大小)

public ArrayList(intlen){

elementData= newObject[len];

}

集合容量不足时,每次扩容增加50%

voidgrow(){//创建新的数组

Object []newArr= new Object[elementData.length + (elementData.length >> 1)];//扩容1.5倍

for(int i = 0; i < size; i++){//将原来数组的内容存到新数组里

newArr[i]=elementData[i];

}

elementData=newArr;

}

定义List接口

public interface List {//------- 添加 -------

voidadd(Object object);//------- 根据坐标删除 -------

void remove(intindex);//------- 根据内容删除 -------

voidremoveobj(Object object);//------- 取出数据 -------

Object get(intindex);//------- 求集合的长度 -------

intsize();//------- 判断集合是否为空 -------

booleanisEmpty();//------- 根据内容找到元素坐标 -------

intIndexOf(Object object);//------- 判断元素是否存在 -------

booleancontions(Object object);//------- 根据坐标位置插入元素 -------

void add(intindex, Object object);//------- 修改元素 -------

void replase(intindex, Object object);//------- toString -------

String toString();//------- arraylist迭代器 -------

ArrayList.Ite iterator();

}

定义Iterator接口

public interface Iterator {booleanhasNext();

T next();

}

ArrayList实现类

public class ArrayList implements List {

public Object []elementData;//数组的引用

privateint size; //集合的大小,并非elementData.length

//如果用户没设置大小就初始为10

public ArrayList(){this(10); //数组大小初始为10

}//集合的大小等于用户设置的大小

public ArrayList(intlen){

elementData= newObject[len];

}//数组的扩容

voidgrow(){//创建新的数组

Object []newArr= new Object[elementData.length + (elementData.length >> 1)];//扩容1.5倍

for(int i = 0; i < size; i++){//将原来数组的内容存到新数组里

newArr[i]=elementData[i];

}

elementData=newArr;

}//在集合的尾部添加元素

publicvoidadd(Object object) {//如果数组长度不够就调用扩容

if(elementData.length <=size){

grow();

}

elementData[size]=object;//大小增加一位

size++;

}//根据坐标删除元素

publicvoid remove(intindex) {//判断用户是否输入错误

if(index<0|| index >size-1){throw new IndexOutOfBoundsException("索引越界"+index);

}

Object element=elementData[index];//向前移动元素

for (int i = index; i

elementData[i]=elementData[i+1];

}//最后一个元素置为空

elementData[size-1]=null;

size--;

}//根据元素删除

publicvoidremoveobj(Object object) {int index =IndexOf(object);//判断用户是否输入错误!

if(index<0){throw newNullPointerException();

}

remove(index);

}//根据坐标得到元素

public Object get(intindex) {returnelementData[index];

}//求集合的长度

publicintsize() {returnsize;

}//判断是否为空

publicbooleanisEmpty() {return size == 0;

}//根据元素找到坐标

publicintIndexOf(Object object) {int i = 0;while(i

}

i++;

}returni;

}//判断元素是否存在

publicbooleancontions(Object object) {boolean flag = false;for(int i = 0; i < size; i++){if(elementData[i].equals(object)){

flag= true;break;

}

}returnflag;

}//根据坐标位置添加元素

publicvoid add(intindex, Object object) {if(size >=elementData.length){

grow();

}for(int i = size; i > index; i--){

elementData[i]= elementData[i - 1];

}

elementData[index]=object;

size++;

}//修改元素

publicvoid replase(intindex, Object object) {

elementData[index]=object;

}//重写toString

public String toString(){

StringBuilder str= new StringBuilder("[");for(int i = 0; i < size; i++){//判断是否到了最后一位,如果到了就不添加,

if(i == size - 1){

str.append(elementData[i]);break;

}else{

str.append(elementData[i]+ ",");

}

}

str.append("]");returnstr.toString();

}//------- 迭代器 -------

public Ite iterator(){return newIte();

}

public class Iteimplements Iterator{int cursor = 0; //指向当前元素,默认是0

public ArrayList arr= newArrayList();

publicbooleanhasNext() {return cursor !=size;

}

public T next() {int i = cursor; //保留当前值

cursor++;//自增

//进行判断,防止越界

if (i >size) {throw new RuntimeException("没有元素");

}return(T) elementData[i];

}

}

}

自定义异常(不自定义也没关系,java自带也有)

public class IndexOutOfBoundsException extends RuntimeException{

public IndexOutOfBoundsException() { }

public IndexOutOfBoundsException(String message) {

super(message);

}

}

Java数据结构与算法之ArrayList

原文:https://www.cnblogs.com/xiewangfei123/p/12933568.html

java contions_Java数据结构与算法相关推荐

  1. java基础----数据结构与算法----Java API:集合 以及 排序相关API

    概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map   ...

  2. java有趣的技术分享ppt,java面试数据结构与算法高频考

    前言 本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同 ...

  3. Java版数据结构与算法笔记

    文章目录 一.数据结构与算法概述及题目 1.数据结构和算法的关系 2.线性结构与非线性结构 Ⅰ-线性结构 Ⅱ-非线性结构 3.经典面试题 Ⅰ-字符串匹配问题: Ⅱ-汉诺塔游戏 Ⅲ-八皇后问题: Ⅳ-马 ...

  4. 猎豹网校JAVA语言数据结构与算法视教程

    -------------------课程目录------------------- 01.NetBeans_下载和安装.mp4 02.JavaDS_数据结构和算法的概述.mp4   03.JavaD ...

  5. Java描述 数据结构与算法

    算法:NonextremeElement(S[], n) 输入:由n个整数构成的集合S 输出:其中的任一非极端元素 { 任取的三个元素x, y, z ∈ S; //既然S是集合,这三个元素必互异 通过 ...

  6. java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合

    今天,我们来简单介绍一下深度优先搜索(DFS)的概念和使用. 在百度词条中,对深搜的解释是这样的. 百度词条中的解释 由此,我们可知,深搜是广泛运用到 图 中的搜索方法之一. 用深度优先搜索遍历图的基 ...

  7. Java版数据结构与算法——线性表

    *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...

  8. 四叉树 java实现,数据结构与算法--四叉树(javascript实现)

    最近想要研究研究webgl地形的渲染,然后就想起了四叉树,在网上看了一篇相关的文章,准备拿javascript实现一下备用. 四叉树原理 (这部分就直接抄了,见参考)四叉树(Q-Tree)是一种树形数 ...

  9. 数据结构与算法入门(Java)

    数据结构与算法(Java) 1. 数据结构与算法概述 1.1 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科. 大白话: ...

最新文章

  1. ubuntu 下mysql导入出.sql文件
  2. 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
  3. LINQ to SQL 之DataContext用法
  4. 关于selinux模式更改警告模式
  5. 在git项目误上传了本地idea配置文件,如何解决?
  6. JS 数字左补零函数
  7. SAP CRM WebClient UI Text 可编辑与否的控制逻辑
  8. nssl1162-农夫约的假期【中位数,贪心】
  9. 有什么是你追了很多女生都失败后才知道的?
  10. web-http协议-请求协议-响应协议
  11. 地壳中元素含量排名记忆口诀_高中化学短周期元素推断题的常见题眼
  12. 使用XLocalizer进行ASP.NET Core本地化
  13. Java初学者需掌握的30个概念
  14. UVA11752 The Super Powers —— 数论、枚举技巧
  15. WAF Bypass数据库特性(Oracle探索篇)
  16. 让用户输入一个月份,判断这个月是哪个季节?
  17. 微积分 --- 以e为底的指数函数(个人学习笔记)
  18. Random随机数和for循环,实现猜数游戏和双色球
  19. linux内存的优化大师,Linux性能优化大师(调整操作系统参数)
  20. Laravel Eloquent 必备的实用技巧

热门文章

  1. 我的第一个Scrapy 程序 - 爬取当当网信息
  2. JBuilder中光标错位的解决办法
  3. 创建与合并分支-git入门教程
  4. maven发碰到的问题
  5. Leetcode402 remove-k-digits贪心+vector模拟栈的思想
  6. Linux信号 二 信号处理函数注册
  7. linux udp套接字编程获取报文源地址和源端口(二)
  8. linux信号掩码线程,20.10 信号掩码(阻塞信号传递)
  9. python找人脚本_Python找出微信上删除你好友的人脚本写法
  10. 开发者账号申请完多久可以用_苹果开发者从0到发布app到apple store