数据类型和链表结构

本文介绍了数据结构的基础,包括基本数据类型、引用类型数组和自定义容器类的实现。重点讲解了如何通过自定义容器类实现动态数组,包括自动扩容、存储任意类型数据的功能,并探讨了链表结构在数据存储中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

						数据类型和链表结构

一:基本的数据结构
数据结构是计算机对数据存储的一种安排。
2. 存储数据的方式:
基本类型:
int a =10;
存储数据的方式单一,依次只能存储一个值。
值和类型匹配问题:数据类型限定了变量可以存储的数据类型
成员变量和局部变量问题:在使用局部变量之前,必须赋值
成员变量有默认值. 但是默认值都没有多大意义,在做项目的时候,给它赋一些值.
引用类型数组:
数组的声明格式: 数组中元素的类型[] 数组名
比如说 int[] ages = new int[3]
数组的作用:可以存储多个数据;
数组操作:存值 ages[0] = 10,取值 ages[0]
特点:长度固定,只能够是存储同种类型;
Interget i=10;
Integer类 里面有个int value 变量存储值,
String类 里面有个 char[] value 字符数组变量存储值.
自动装箱,可以把基本数据类型包装起来,可以通过包装去调用方法转换类型。
3 自定义容器类
目的:自定义容器类的作用是为了满足可以存放不同类型的长度,和任意类型的值。

① 定义一个自定义容器类 IntArray
② 创建一个存放数据的数组 比如 int[] data= new int[10];
③ 定义一个添加方法 add ,调用一次给当前容器对象添加一个元素
④ 创建自定义容器类对象,调用add方法,添加元素
自定义容器类的增删改查
//自定义的容器类增加元素:
/**

  • v1.0
  • 1.定义一个字段(固定类型),装用户传过来的数据
  •   固定类型 -int
    
  •   固定长度-10
    
  • 2.对外提供一个方法 用来添加数据
  •   每次都会覆盖   定义一个字段记录添加数据的位置
    
  •   data[size++]=i; 解决方案
    

*/
public class list {
private int[] arr=new int[10]; //创建一个动态数组
public int size=0; //定义一个计数器
public void add(int c){ //对外一个一个方法
arr[size]=c; //这个存放的长度由用户调用的次数依次存储
size++;
}
@Override
public String toString() {
return “list [arr=” + Arrays.toString(arr) + “]”;
}

}
测试:
public class list1 {
public static void main(String[] args) {
list t1 = new list();
t1.add(4);
t1.add(6);
t1.add(7);
System.out.println(t1);
//list [arr=[4, 6, 7, 0, 0, 0, 0, 0, 0, 0]]
}
}
这儿我们为了美观去掉后边的几个0;进行追加的方法:
v2.0

  • 目前打印的结果:DataList [data=[1, 2, 2, 2, 2, 0, 0, 0, 0, 0]]
  • 期望的结果:添加多少数据就是打印多少数据
  • 方案一:循环遍历+拼接字符串
  • 方案二:System.arraycopy(data, 0, temp, 0, size);

*修改tostring方法
*/public String toString() {
int[] temp=new int[size];
System.arraycopy(arr, 0, temp, 0, size);
return “list [arr=” + Arrays.toString(arr) + “]”;
}
}
测试:
public static void main(String[] args) {
list t1 = new list();
t1.add(4);
t1.add(6);
t1.add(7);
//t1.add(7); //报错,过长
System.out.println(t1);
}
}
3超过存储长度自动扩容
*v3.0

  • 长度可以发生改变
  • 对于使用者:有两种情况
  •  1.知道有多少个数据
    
  •  	提供一个构造方法 传入 size 用于创建容器的长度
    
  •  		可以自动扩容--长度增加的方案--倍数、 每次固定长度增长、百分比(推荐)
    
  •  		1.数组已经被定义了   -重新定义一个数组(长度扩容后)
    
  •  		2.要原来的数据里面的数据拷贝过去
    
  •  		3.把新的数组的地址给data
    
  •  2.不知道要放多少个数据
    
  •  	提供一个无参数构造方法 默认创建一个长度为10的数组
    

*/
public class list {
private int[] arr=new int[3]; //创建一个动态数组
public int size; //定义一个计数器
//无参构造器给对象创建一个长度
public list(){
arr=new int[7];
}
//有参构造器通过用户传入的数据来决定长度;
public list(int length){
arr=new int[length];
}
//在提供一个共外界查看的size传入参数的长度
public int size(){
return size;
}
public void add(int c){
if(size==arr.length){ //先判断一下size用户传入的参数是否已经达到原来数组的长度了,如果是的话我们就给他扩容
int[] temp=new int[(size+1)*2]; //扩容的话添加到一个新的数组里边
System.arraycopy(arr, 0, temp, 0, size);
arr=temp;
}

	arr[size]=c;			//这个存放的长度由用户调用的次数依次存储
	size++;
}
@Override
public String toString() {
	int[] temp=new int[size];
	System.arraycopy(arr, 0, temp, 0, size);
	return "list [arr=" + Arrays.toString(arr) + "]";
}

}
测试:
public static void main(String[] args) {
list t1 = new list(10); //传入一个9的话就报错,传入数组过长了,怎么解决?
t1.add(4);
t1.add(6);
t1.add(7);
t1.add(6); //Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
t1.add(7); //报错,过长,存不下了怎么解决?
t1.add(7);
//System.out.println(t1); //java.lang.ArrayIndexOutOfBoundsException: 7
System.err.println(t1.size()); //看到了我的传入的长度为多少
System.err.println(t1);
}
}
4可以存放任意类型:
v4.0 :最终版

  •  类型的问题--Object
    
  •  把int 换成Object
    

*public class list {
private Object[] arr; //创建一个动态数组
public int size; //定义一个计数器
//无参构造器给对象创建一个长度
public list(){
arr=new Object[7];
}
//有参构造器通过用户传入的数据来决定长度;
public list(int length){
arr=new Object[length];
}
//在提供一个共外界查看的size传入参数的长度
public int size(){
return size;
}
public void add(Object c){
if(size==arr.length){ //先判断一下size用户传入的参数是否已经达到原来数组的长度了,如果是的话我们就给他扩容
Object[] temp=new Object[(size+1)*2]; //扩容的话添加到一个新的数组里边
System.arraycopy(arr, 0, temp, 0, size);
arr=temp;
}

	arr[size]=c;			//这个存放的长度由用户调用的次数依次存储
	size++;
}
@Override
public String toString() {
	Object[] temp=new Object[size];
	System.arraycopy(arr, 0, temp, 0, size);
	return "list [arr=" + Arrays.toString(arr) + "]";
}

}
测试:
public class list1 {
public static void main(String[] args) {
list t1 = new list(10); //传入一个9的话就报错,传入数组过长了,怎么解决?
t1.add(4);
t1.add(6);
t1.add(7);
t1.add(6); //Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 3
t1.add(7); //报错,过长,存不下了怎么解决?
t1.add(“sasdasdasdas”);
//System.out.println(t1); //java.lang.ArrayIndexOutOfBoundsException: 7
System.err.println(t1.size()); //看到了我的传入的长度为多少
System.err.println(t1);
}
}
v1.0 1.定义一个字段(固定类型),装用户传过来的数据 固定类型 -int 固定长度-10 2.对外提供一个方法 用来添加数据 每次都会覆盖

  • 定义一个字段记录添加数据的位置 data[size++]=i; 解决方案 v2.0 目前打印的结果:DataList [data=[1, 2, 2, 2,
  • 2, 0, 0, 0, 0, 0]] 期望的结果:添加多少数据就是打印多少数据 方案一:循环遍历+拼接字符串
  • 方案二:System.arraycopy(data, 0, temp, 0, size);

** v3.0 长度可以发生改变 对于使用者:有两种情况 1.知道有多少个数据 提供一个构造方法 传入 size 用于创建容器的长度

  • 可以自动扩容–长度增加的方案–倍数、 每次固定长度增长、百分比(推荐) 1.数组已经被定义了 -重新定义一个数组(长度扩容后)
  • 2.要原来的数据里面的数据拷贝过去 3.把新的数组的地址给data 2.不知道要放多少个数据 提供一个无参数构造方法 默认创建一个长度为10的数组
  • v4.0 :最终版 类型的问题–Object 把int 换成Object 1.数据的查找 a.根据索引位置找数据 b.查找数据第一次出现的索引
  • 2.数据删除(最难)
  • 3.修改(最简单) a.根据索引该数据

*/
public class list {
private Object[] arr; // 创建一个动态数组
public int size; // 定义一个计数器
// 无参构造器给对象创建一个长度

public list() {
	arr = new Object[7];
}

// 有参构造器通过用户传入的数据来决定长度;
public list(int length) {
	arr = new Object[length];
}

// 在提供一个共外界查看的size传入参数的长度
public int size() {
	return size;
}

public void add(Object c) {
	if (size == arr.length) { // 先判断一下size用户传入的参数是否已经达到原来数组的长度了,如果是的话我们就给他扩容
		Object[] temp = new Object[(size + 1) * 2]; // 扩容的话添加到一个新的数组里边
		System.arraycopy(arr, 0, temp, 0, size);
		arr = temp;
	}
	arr[size] = c; // 这个存放的长度由用户调用的次数依次存储
	size++;
}

// a.根据索引位置找数据 //查找
public Object getIndex(int index) { // 传入的数据有要求的
	if (index > 0 || index > size - 1) { // 为什么减1
		throw new NullPointerException("空指针异常");
	}
	return arr[index];
}

// b.查找数据第一次出现的索引 //查找
public Object getOb(Object obj) {
	// 循环我的数组依次比对数据
	for (int a = 0; a < size; a++) {
		if (obj.equals(arr[a])) {
			return a;
		}
	}
	return -1;
}

// a.根据索引数据 //删除指定索引
public void updata(int index, Object obj) {
	//  
	if (index < 0 || index > size - 1) {//
		throw new ArrayIndexOutOfBoundsException("参数不合法!");
	}
	arr[index] = obj;
}
// a.根据索引该数据
public void  deleteByIndex(int index){
	if (index < 0 || index > size - 1) {
		throw new ArrayIndexOutOfBoundsException("参数不合法!");
	 }
	//										
	System.arraycopy(arr,index+1 , arr, index,size-1-index);
	size--;
}
@Override
public String toString() {
	Object[] temp = new Object[size];
	System.arraycopy(arr, 0, temp, 0, size);
	return "list [arr=" + Arrays.toString(arr) + "]";
}

}
数据结构:链表结构
变量:存储一个值;
数组:存储多个值;
自定义容器类: 在类中封装一个数组;
![在这里插入图片描述](https://img-在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值