Java基础(十)数据结构
一、数据结构
1、数据结构的定义
数据结构是计算机存储,组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或存储效率。数据结构往往同高效的检索算法和索引技术有关。(来源于百度百科)
2、存储数据的方式
1、变量
变量声明格式: 数据类型 变量名
示例:int age
变量赋值:int age = 22;
注意事项:
- 需要注意值和类型的匹配问题。
- 在使用局部变量之前必须要赋值。
- 成员变量有默认值,但都没有多大意义,在做项目时,要给它赋值。
变量的特点:只能存放一个值。
2、数组
数组的声明格式:数组中元素的类型[] 数组名
示例:int[] ages = new int[3];
数组特点:长度固定,只能存储同种类型数据。
3、自定义类存储
自定义一个可以自动增长,可以存储任意多个 int 元素的数据结构。
实现步骤:
1、自定义一个容器类 intArray。
2、先做到可以储存多个 int 值,内部使用 int 数组。
3、类中创建一个 int 数组,当 int 数组满了之后,创建一个新的数组,并把老的数组中的值拷贝到新的数组中(实现自动扩容)。
具体代码实现:
import java.util.Arrays; /**
* 自定义可以自动扩容的数组
*/
public class IntArray {
private int[] data;
private int index = 0; //构造方法,初始化大小为2
public IntArray() {
this.data = new int[2];
} /**
* 添加数据,自动扩容
* add添加数据的函数
*
* @param i
*/
public void add(int i) {
if (index >= data.length) {
//如果索引大于数组长度,需要新建数组
int[] dataNew = new int[data.length + 2];
System.arraycopy(data, 0, dataNew, 0, data.length); //拷贝数据
data = dataNew;
data[index] = i; //存值
index += 1;
} else {
//如果索引小于数组长度,直接存值
data[index] = i;
index += 1;
}
} /**
* 通过索引删除数据
*
* @param indexId
*/
public void del(int indexId) {
int length = data.length;
System.arraycopy(data, indexId + 1, data, indexId, length - indexId - 1);
} /**
* 通过索引查找元素
*
* @param indexId
*/
public int select(int indexId) {
return data[indexId];
} /**
* 通过索引修改数据
*
* @param indexId
* @param value
*/
public void update(int indexId, int value) {
data[indexId] = value;
} /**
* 返回当前数组长度
*
* @return
*/
public int getLength() {
return data.length;
} /**
* 查找第一个相同元素的索引
*
* @param value
* @return
*/
public Integer queryByValue(int value) {
Integer result = null;
for (int i = 0; i < data.length; i++) {
if (data[i] == value) {
result = i;
}
}
return result;
} //覆写toString方法
@Override
public String toString() {
// TODO Auto-generated method stub
//把元素数组的值,拷贝到新数组里面
int[] newArr = new int[index];
System.arraycopy(data, 0, newArr, 0, index);
return Arrays.toString(newArr);
}
}
测试自定义扩容的数组:
public class TestIntArray {
/**
* 测试自定义的扩容数组
*/
@Test
public void test2(){
IntArray intArray = new IntArray();
intArray.add(11);
intArray.add(22);
intArray.add(33);
intArray.add(44);
intArray.add(55);
//根据索引删除
intArray.del(2);
int select = intArray.select(1);
System.out.println(select);
//更新
intArray.update(1, 2333);
int select1 = intArray.select(1);
System.out.println(select1);
//通过值查询第一个索引
Integer index = intArray.queryByValue(55);
System.out.println("index: " + index);
//返回数组长度
int length = intArray.getLength();
System.out.println("length: " + length);
System.out.println(intArray);
}
}
二、链表
1、链表定义
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。(来源于百度百科)
2、基于类实现链表
1、实现步骤
1、定义容器类。
2、定义Node(口袋类),类里面定义两个字段,一个Object类型存放值,一个Node类型字段,存放下一个值。
3、在容器里面有个字段,在容器类里面还应该提供添加、查找、删除方法。
自定义Node类的代码:
/**
* 自定义Node类
*/
public class Node {
// 存放值
private Object value;
//存放下一个值
private Node next; public Node() { } public Node(Object value) {
this.value = value;
} public Object getValue() {
return value;
} public void setValue(Object value) {
this.value = value;
} public Node getNext() {
return next;
} public void setNext(Node next) {
this.next = next;
}
}
具体实现链表代码:
/**
* 实现链表
*/
public class LinkList {
private Node first;
private int size; //链表大小,默认值为0 /**
* 添加节点的方法
*
* @param obj
*/
public void add(Object obj) {
//1、把用户传入的数据打包
Node node = new Node(obj); //2、把打包好的数据挂在first上面
if (first == null) {
//如果是第一次添加,直接挂在first上面
first = node;
} else {
Node temp = first;
//不是第一次添加,寻找最后一个节点,挂在上面
while (temp.getNext() != null) {
temp = temp.getNext();
}
temp.setNext(node);
}
size++;
} public Node getFirst() {
return first;
} public void setFirst(Node first) {
this.first = first;
} public int getSize() {
return size;
} public void setSize(int size) {
this.size = size;
} //覆写toString方法
@Override
public String toString() {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("[");
Node temp = first; //使用一个临时变量存储
if (temp != null) {
//当为第一个元素的时候
if (temp.getNext() == null) {
//没有下一个节点
stringBuffer.append(temp.getValue());
} else {
stringBuffer.append(temp.getValue()).append(",");
}
} while (temp.getNext() != null) {
//指针向下移动一个位置
temp = temp.getNext();
if (temp.getNext() == null) {
//最后一个节点
stringBuffer.append(temp.getValue());
} else {
stringBuffer.append(temp.getValue()).append(",");
}
}
stringBuffer.append("]");
return stringBuffer.toString();
}
}
测试链表:
import org.junit.Test;
public class TestLink {
/**
* 测试链表
*/
@Test
public void testLink() {
LinkList linkList = new LinkList();
linkList.add(11);
linkList.add(22);
linkList.add(33);
linkList.add(44);
linkList.add(55);
linkList.add(66);
int size = linkList.getSize();
System.out.println("size: " + size); //size: 6
System.out.println(linkList); //[11,22,33,44,55,66]
}
}
Java基础(十)数据结构的更多相关文章
- Java基础十二--多态是成员的特点
Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...
- Java基础十--接口
Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...
- Java基础(十二)--clone()方法
Clone在Java中就是用来复制对象,通过分配一个和源对象相同大小的内存空间,然后创建一个新的对象,那么他和=的区别在哪? 通过=实现对象拷贝: @Data @NoArgsConstructor @ ...
- java基础(十六)----- equals()与hashCode()方法详解 —— 面试必问
本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) publi ...
- java基础(十五)----- Java 最全异常详解 ——Java高级开发必须懂的
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所 ...
- JAVA基础之——数据结构
JAVA数据结构有8种,如下所示,本文从使用场景,优缺点方面讲解. 1 数组Array ArrayList 使用场景:有序的存储同一类型数据的集合,固定大小 优点:通过索引查找方便 缺点:插入或删除一 ...
- java基础十[包、Jar存档文件和部署](阅读Head First Java记录)
将Java的class文件生成为可执行的Java应用程序.Java应用程序有三种:完全在本机执行的Jar(例如本机的GUI可执行程序):完全在服务器端远程执行的(例如浏览器来进行存取):介于两者之间的 ...
- 黑马程序员 Java基础<十八>---> 网路编程
--------------- ASP.Net+Android+IO开发S..Net培训.期待与您交流! --------------- 第一 概述 一.概述: 1.网络模型:OSI参考模型和TCP ...
- java基础(十八)----- java动态代理原理源码解析
关于Java中的动态代理,我们首先需要了解的是一种常用的设计模式--代理模式,而对于代理,根据创建代理类的时间点,又可以分为静态代理和动态代理. 静态代理 1.静态代理 静态代理:由程序员创建或特定工 ...
- java基础(十)-----Java 序列化的高级认识
将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ...
随机推荐
- Java_内存泄漏_实例1
版权声明:本文为博主原创文章,转载请注明出处. 记一次压测时Java内存泄漏问题的发现过程(2017-08-14) [前篇] ①20170811进行A系统与B系统之间的会话功能进行压测,加上脚本准备期 ...
- UDF-Java提取身份证内信息
1.使用方法 #获取省份ID create temporary function getProvIdByCardIdUDF as 'com.st.PersonInfoByCardIdUDF.getPr ...
- 阿里VS华为-开源镜像站体验及评测
最近对阿里和华为的开源镜像站做了深度体验,并将评测结果分享给大家: 一.评测产品: 华为开源镜像站(https://mirrors.huaweicloud.com/)以下简称 华为 阿里开源镜像站(h ...
- C#获取当前程序集的完整路径
//获取当前程序集的完整路径加上EXE的名称 string binPath = Assembly.GetExecutingAssembly().Location; Console.WriteLine( ...
- 使用 WebClient 來存取 GET,POST,PUT,DELETE,PATCH 網路資源
WebClient 基本資訊 提供通用方法使用 WebRequest 類別傳送及接收 URI (支援 http:, https:, ftp:,和 file: ) 的資源 Namespace:Syste ...
- Ubuntu16.04安装视觉SLAM环境(ceres-solver)
1.先在github上下载ceres-solver git clone https://github.com/ceres-solver/ceres-solver.git 2.安装ceres-solve ...
- Python解释器的配置
1.准备工作 安装好Pycharm2017版本 电脑上安装好Python解释器 2.本地解释器配置 配置本地解释器的步骤相对简洁直观: (1)单击工具栏中的设置按钮. (2)在Settings/Pre ...
- 网络编程- 解决黏包现象方案二之struct模块(七)
上面利用struct模块与方案一比较,减少一次发送和接收请求,因为方案一无法知道client端发送内容的长度到底有多长需要和接收OK.多一次请求防止黏包,减少网络延迟
- url传递参数带 + ,解决办法
修改客户端,将客户端带“+”的参数中的“+”全部替换为“%2B”,这样参数传到服务器端时就能得到“+”了.
- 20190430-PPK大佬的三个Viewport
写在前面的乱七八糟:在知识的海洋里狗刨,越刨会越自我膨胀,膨胀过后的自己,又会发现自己的渺小~ 目录 1.viewport 2.css的1px 3.三个viewport 参考文献: https://b ...