通过前面的博客我们已经大致了解了关于java的基本知识,而下面的几篇博客我们着重开始对于数据结构的知识进行学习,这篇博客我们就了解关于顺序表和arraylist的相关知识,从名字上我们就可以看到arraylist是数组链表,也就是我们总说的顺序表。这是java内置的,因此不需要我们写,这也方便了程序员的使用。那么面我们就来了解一下arraylist顺序表的相关知识。
在学习顺序表之前呢,我们需要了解几个概念。
问题: 我们在之前学习顺序表的时候,只能保存int类型的元素,如果现在我们需要保存person类型对象的引用顺序表,那么我们该如何解决呢?
回答:
首先,我们在学习多态过程中已知一个前提,基类的引用可以指向子类的对象。其次,我们也已知object是 java 中所有类的祖先类。那么,解决这个问题我们就想到一个办法,我们将顺序表数组种元素类型定义为object类型,这样我们的object类型的引用可以指向int类型的对象,也可以指向person类型的对象。举个例子:
public class myarraylist {private object[] array; // 保存顺序表的元素,即 object 类型的引用private int size; // 保存顺序表内数据个数public void add(object o) { 尾插 }public object get(int index) { 获取 index 位置的元素 }...}
现在的 myarraylist 虽然可以做到添加任意类型的引用到其中了,但遇到以下代码就会产生问题。
person person = (person)books.get(0);// 将 object 类型转换为 person 类型,需要类型转换才能成功// 这里编译正确,但运行时会抛出异常 classcastexception
此时的book对象的get()方法的返回值是object类型因此我们需要强制转化为person类型才可以赋值给person对象,但是这只是编译上通过,但是运行仍会报错,因此引入了泛型这个概念。
泛型分为两类:
泛型类泛型方法什么是泛型类呢?我们来看一个例子:
public class myarraylist<e> {private e[] array;private int size;...}
在这个myarraylist类中,我们可以看到后面跟了一个尖括号,这就是泛型的标志。有以下几点需要注意:
尖括号 <> 是泛型的标志。e 是类型变量(type variable),变量名一般要大写。e 在定义时是形参,代表的意思是 myarraylist 最终传入的类型,但现在还不知道。也就是说我们在用这个类创建对象时,我们可以在类的尖括号中告诉编译器你使用的是什么对象。比如:
// 定义了一个元素是 book 引用的 myarraylistmyarraylist<book> books = new myarraylist<book>();books.add(new book());// 会产生编译错误,person 类型无法转换为 book 类型books.add(new person());// 不需要做类型转换book book = book.get(0);// 不需要做类型转换// 会产生编译错误,book 类型无法转换为 person 类型person person = book.get(0);
我们可以看到,myarraylist存放的是book类型的引用,这是编译器就可以达到类似object的效果,存储book类型的对象,如果在里面又想放入person类型的对象就会报错。
总结
泛型是为了解决某些容器、算法等代码的通用性而引入,并且能在编译期间做类型检查。泛型利用的是 object 是所有类的祖先类,并且父类的引用可以指向子类对象的特定而工作。泛型是一种编译期间的机制,即 myarraylist< person > 和myarraylist< book > 在运行期间是一个类型。泛型是 java 中的一种合法语法,标志就是尖括号 <>。我们知道object引用可以指向任意类型的对象,但是8种基本数据类型又不是对象,那么泛型就无法对这8种基本数据类型失效了。因此为了解决这个问题java 引入了一类特殊的类,即这 8 种基本数据类型的包装类,在使用过程中,会将类似int这样的值包装到一个对象中去。
基本就是类型的首字母大写,除了 integer 和 character。
简单了解了泛型和包装类的知识,下面我们就正式学习arraylist的相关知识。
在集合框架中,arraylist是一个普通的类,实现了list接口,具体框架图如下:
说明:
arraylist实现了randomaccess接口,表明arraylist支持随机访问。arraylist实现了cloneable接口,表明arraylist是可以clone的。arraylist实现了rializable接口,表明arraylist是支持序列化的。和vector不同,arraylist不是线程安全的,在单线程下可以使用,在多线程中可以选择vector或者copyonwritearraylist。arraylist底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表。举个例子:
public static void main(string[] args) {// arraylist创建,推荐写法// 构造一个空的列表list<integer> list1 = new arraylist<>();// 构造一个具有10个容量的列表list<integer> list2 = new arraylist<>(10);list2.add(1);list2.add(2);list2.add(3);// list2.add("hello"); // 编译失败,list<integer>已经限定了,list2中只能存储整形元素// list3构造好之后,与list中的元素一致arraylist<integer> list3 = new arraylist<>(list2);// 避免省略类型,否则:任意类型的元素都可以存放,使用时将是一场灾难list list4 = new arraylist();list4.add("111");list4.add(100);}
代码示例:
public static void main(string[] args) {list<string> list = new arraylist<>();list.add("java");list.add("javaweb");list.add("javaee");list.add("jvm");list.add("测试课程");system.out.println(list);// 获取list中有效元素个数system.out.println(list.size());// 获取和设置index位置上的元素,注意index必须介于[0, size)间system.out.println(list.get(1));list.t(1, "javaweb");system.out.println(list.get(1));// 在list的index位置插入指定元素,index及后续的元素统一往后搬移一个位置list.add(1, "java数据结构");system.out.println(list);// 删除指定元素,找到了就删除,该元素之后的元素统一往前搬移一个位置list.remove("jvm");system.out.println(list);// 删除list中index位置上的元素,注意index不要超过list中有效元素个数,否则会抛出下标越界异常list.remowin7电脑配置怎么看ve(list.size()-1);system.out.println(list);// 检测list中是否包含指定元素,包含返回true,否则返回falif(list.contains("测试课程")){list.add("测试课程");}// 查找指定元素第一次出现的位置:indexof从前往后找,lastindexof从后往前找list.add("java");system.out.println(list.indexof("java"));system.out.println(list.lastindexof("java"));// 使用list中[0, 4)之间的元素构成一个新的arraylist返回list<string> ret = list.sublist(0, 4);system.out.println(ret);list.clear();system.out.println(list.size());}
运行结果:
arraylist 可以使用三方方式遍历:for循环+下标、foreach、使用迭代器
代码示例:
public static void main(string[] args) {list<integer> list = new arraylist<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);// 使用下标+for遍历for (int i = 0; i < list.size(); i++) {system.out.print(list.get(i) + " ");}system.out.println();// 借助foreach遍历for (integer integer : list) {system.out.prin历史文化遗产t(integer + " ");}system.out.println();//使用迭代器iterator<integer> it = list.listiterator();while(it.hasnext()){system.out.print(it.next() + " ");}system.out.println();}
运行结果:
关于arraylist顺序表的相关知识就是这么多,arraylist使用起来是比较简单的,但是细节上也是非常多的,而且还有一些其他的方法,我们可以通过源码分析来看如何使用.
到此这篇关于java中arraylist与顺序表的文章就介绍到这了,更多相关javaarraylist与顺序表内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 13:45:23,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/229ef68199255ba8362b255ca9c4ac3a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Java中ArrayList与顺序表的概念与使用实例.doc
本文 PDF 下载地址:Java中ArrayList与顺序表的概念与使用实例.pdf
留言与评论(共有 0 条评论) |