目录
前言
最近在进行Java的数据结构学习,在学习过程和查阅资料中,我对以下问题有了更深一层的理解。
- 什么是List的继承体系?(list接口继承自哪里?collection的接口又继承自哪里?)
- 在collection中元素是怎么组织起来的?它们有什么样的特征和能力?
- 元素与元素之间出现线性结构时,有一个特殊的关联是什么?
- List元素的相关操作有哪些呢?
- 泛型的本质是什么?在Java中泛型是用来做什么的?如何定义一个泛型?类型转换到底指的是什么?
如果你在Java数据结构的学习中也想对这些问题有一个更深的理解,请阅读这篇文章,或许会对你有所启发。
一、List继承体系的介绍
首先我们对list和collection的接口继承进行了解:
我们知道list接口继承自collection,collection接口又继承自iterable,而在这两个接口中,hasNext() 用boolean类型表示, 还有没有下一个元素,而next() 元素类型表示要进行取下一个元素
二、collection的组织
我们疑惑于collection并没有规定元素,那么元素到底是怎么组织起来的,但其实无论元素是怎么样的组织方式,一个集合(容器)都具备一些公共的特征,比如:添加元素,取出元素,元素是否存在等等,与此同时,它还具备一定迭代的能力。
我们要格外注意的是,
在编写代码时,empty表示集合是空的,null表示集合不存在,若返回值是true,则表示还存在下一个元素,若返回值是false,则表示不存在下一个元素,清楚了这些基础知识,我们再来看下一个知识点。
三、线性表
元素和元素之间会出现线性的结构,每个元素都有一个独一无二的位置与其关联,称它为位置,也就是下标,当我们问到一个List一共有多少个元素,通常会出现size来表示,那么它的下标一定有一个合法的取值范围,这个范围便是[0,size]。
一般情况下,我们将出现的第一个元素称为头,用head来表示,下标是0,自然就可以引申出最后一个元素称为尾,用tail或者last都可以表示,下标要用他的最大范围减去1。除了第一个元素和最后一个元素,其余的元素都有逻辑上的前一个元素,也就是前驱元素,用previous表示,也有逻辑上的后一个元素,后继元素,用next表示。根据以上内容,我们可以知道线性结构独有的三个特性。
- 排序的能力是线性结构独有的
- 下标概念是线性结构独有的
- 根据下标获取元素(根据下标设置元素)
四、List元素的相关操作
在List中,最为重要的便是元素的相关操作,下面,我将最常见的相关操作列举出来,进行巩固牢记。
- 若用add将元素放到集合的最后,这一操作叫尾插,在线性表的OJ题中,我们常常会用到尾插的操作。
- get(int index,元素) 表示获取index位置所在的元素(,此时这个元素一定还在集合中
- set(int index,元素) 表示替换index位置所在的元素
- add(int index,元素)表示将元素添加到index位置
[e1,e2,e3,e4]
add(3,e7);//[e1,e2,e3,e7,e4]
- remove(int index)表示将index位置的元素移除
[e1,e2,e3,e4]
remove(2);//[e1,e2,e4]
- 使用indexOf 时,线性表中的元素可以重复
[A,B,A,C,A,D]
indecOf(A);//[0]
lastindexOf(A);//[4]
- subList(起始位置,结束位置)使用subList时,包含起始位置但不包含结束位置
[A,B,C,D,E]
subList(1,3);
[A,B,C,D,E];//[B,C]
五、泛型
泛型的本质是类型参数化或参数化类型,在不创建新的类型情况下,通过泛型指定的不同类型来控制形参具体限制的类型。泛型可以定义在类、接口。方法中,分别表示为泛型类,泛型接口,泛型方法。泛型的使用需要先声明,声明通过尖括号<……>的方式。
泛型的类型只能为类,不能为基本数据类型,尖括号也有固定的位置,只能在类名之后或方法返回值之前。
1.Object[]
“Object[]”定义了一个一维的对象,是所有类,包括接口的祖先类,也就是说可以转换成任何类型。简单点说,就是可以用上层引用来指向下层对象。
2.java的泛型
java的泛型只在编译阶段起作用,它也是只支持引用,不支持基本数据类型。
3.包装类
包装类是基本数据类型对应的引用数据类型,将基本数据类型进行包装,变成引用数据类型,栈到堆的一个变化,这样就有属性和方法了,每种基本类型都对应一个包装类。
byte——>Byte;short——>Short;int——>Integer;
long——>Long;float——>Float;double——>Double;
boolean——>Boolean;char——>Char
4.定义泛型
泛型是用来执行本次的具体类型,如果是字符串,就只能是string类型
List<String> l1=new ArrayList<>();
List<Integer> l1=new ArrayList<>();
List<Boolean> l1=new ArrayList<>();
5.类型转换
装箱(栈——>堆):基本类型——>引用类型
Integer a=100;
int b=10;
拆箱(堆——>栈):引用类型——>基本类型
Integer a=10;
int b=20;
inc=a+b;
自动装箱拆箱:
int a=20;
//自动装箱
Integer integer=a;
//自动拆箱
int a=integer;
按照对象的生存性,包装类类型已经是对象了,不能使用==比较,比较的时候应该用equals,integer和integer比较必须用equals;int和integer比较可以用==,也可以用equals。总结来说,==代表了同一性,用来比较值是否相等;equals代表了相等性,用来比较两个对象的引用是否相等,即是否指向同一个对象。
6.小彩蛋
X类型:a;Y类型:b
a=(X)b;这个语法满足以下条件才可以成功
- 隐式转换:可以成功的情况
- 基本类型:double>float>long>int>char>short>byte
- 引用类型:必须在继承链上,从上往下转
总结
以上就是今天所讲的内容,数据结构在Java的学习中占极为重要的地位,其中涉及了很多代码题,在以后的笔试中也是必不可少的一部分,自然要打好牢固的基础,笔者也只是一个正在学习Java等编程知识的萌新,欢迎和我一样学习Java的同伴们一起交流。笔者会继续在后续学习过程中将所学知识进行系总结,希望大家多多支持!