java contions_Java数据结构与算法
特点:
在内存中分配连续的空间,只存储数据,不存储地址信息。位置就隐含着地址。
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数据结构与算法相关推荐
- java基础----数据结构与算法----Java API:集合 以及 排序相关API
概述: 基本数据结构与算法在jdk中都有相应的API 数组+java.util.Arrays java中的集合类 Collection-->List+Set-->接口的实现类 Map ...
- java有趣的技术分享ppt,java面试数据结构与算法高频考
前言 本文涵盖了阿里巴巴.腾讯.字节跳动.京东.华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同 ...
- Java版数据结构与算法笔记
文章目录 一.数据结构与算法概述及题目 1.数据结构和算法的关系 2.线性结构与非线性结构 Ⅰ-线性结构 Ⅱ-非线性结构 3.经典面试题 Ⅰ-字符串匹配问题: Ⅱ-汉诺塔游戏 Ⅲ-八皇后问题: Ⅳ-马 ...
- 猎豹网校JAVA语言数据结构与算法视教程
-------------------课程目录------------------- 01.NetBeans_下载和安装.mp4 02.JavaDS_数据结构和算法的概述.mp4 03.JavaD ...
- Java描述 数据结构与算法
算法:NonextremeElement(S[], n) 输入:由n个整数构成的集合S 输出:其中的任一非极端元素 { 任取的三个元素x, y, z ∈ S; //既然S是集合,这三个元素必互异 通过 ...
- java dfs_Java数据结构与算法 深搜(DFS)的简单使用(一)之排列组合
今天,我们来简单介绍一下深度优先搜索(DFS)的概念和使用. 在百度词条中,对深搜的解释是这样的. 百度词条中的解释 由此,我们可知,深搜是广泛运用到 图 中的搜索方法之一. 用深度优先搜索遍历图的基 ...
- Java版数据结构与算法——线性表
*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如 ...
- 四叉树 java实现,数据结构与算法--四叉树(javascript实现)
最近想要研究研究webgl地形的渲染,然后就想起了四叉树,在网上看了一篇相关的文章,准备拿javascript实现一下备用. 四叉树原理 (这部分就直接抄了,见参考)四叉树(Q-Tree)是一种树形数 ...
- 数据结构与算法入门(Java)
数据结构与算法(Java) 1. 数据结构与算法概述 1.1 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科. 大白话: ...
最新文章
- ubuntu 下mysql导入出.sql文件
- 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
- LINQ to SQL 之DataContext用法
- 关于selinux模式更改警告模式
- 在git项目误上传了本地idea配置文件,如何解决?
- JS 数字左补零函数
- SAP CRM WebClient UI Text 可编辑与否的控制逻辑
- nssl1162-农夫约的假期【中位数,贪心】
- 有什么是你追了很多女生都失败后才知道的?
- web-http协议-请求协议-响应协议
- 地壳中元素含量排名记忆口诀_高中化学短周期元素推断题的常见题眼
- 使用XLocalizer进行ASP.NET Core本地化
- Java初学者需掌握的30个概念
- UVA11752 The Super Powers —— 数论、枚举技巧
- WAF Bypass数据库特性(Oracle探索篇)
- 让用户输入一个月份,判断这个月是哪个季节?
- 微积分 --- 以e为底的指数函数(个人学习笔记)
- Random随机数和for循环,实现猜数游戏和双色球
- linux内存的优化大师,Linux性能优化大师(调整操作系统参数)
- Laravel Eloquent 必备的实用技巧
热门文章
- 我的第一个Scrapy 程序 - 爬取当当网信息
- JBuilder中光标错位的解决办法
- 创建与合并分支-git入门教程
- maven发碰到的问题
- Leetcode402 remove-k-digits贪心+vector模拟栈的思想
- Linux信号 二 信号处理函数注册
- linux udp套接字编程获取报文源地址和源端口(二)
- linux信号掩码线程,20.10 信号掩码(阻塞信号传递)
- python找人脚本_Python找出微信上删除你好友的人脚本写法
- 开发者账号申请完多久可以用_苹果开发者从0到发布app到apple store