热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java中arraylist与其他_Java中List和ArrayList的区别

下文转自https:www.cnblogs.comzcscnnp7743507.html转载自:http:www.cnblogs.comaisiteruarticle

下文转自https://www.cnblogs.com/zcscnn/p/7743507.html

转载自:http://www.cnblogs.com/aisiteru/articles/1151874.html

第一次看这篇文章时,是在CSDN博客中看到的,作者写的初衷还是蛮好的,但是确实有错误的地方和不是很明

白的地方。于是就很想去看看原文,废了半天的功夫终于找到了,原文还是一样有出错和我不理解的地方,我也把原

文的地址贴在上面了。三月份学习的Java集合框架这部分,这几天拿出来整理就想再深入一点,因此也看了很多的关

于Java集合框架的文章,这篇我算是有一点点的体会,我只是改了一些我认为错误的地方和不通顺的地方。

改过的原文:

List是一个接口,而ArrayList是List接口的一个实现类。

ArrayList类继承并实现了List接口。

因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指

向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。

个人见解:

要是你已经学过了OOP,上面的部分是不难理解的,这是面向对象重要的知识点,面向对象最重要的就是多态,

我们都知道接口和抽象不能被实例化,但是它们可以创建一个指向自己的对象引用,它们的实现类或子类就在充当这

样的角色,我想这就是面向对象编程中多态的优势。前些日子在学习UML建模语言和Java设计模式的时候,深深地的

体会到了面向对象编程的好处,Java集合框架中用到也不足为奇,Java本身就是面向对象的编程语言。

上面的理解可能有点难度,但是我们找一个具体的实例,就会理解起来比较容易。我们定义一个动物的抽象类

Animal,再定义一个继承自Animal基类的Dog类,看下面的代码就会理解抽象类和接口不能被实例化:

public class Test{

public static void main(String[] args){

Animal a1 = new Animal();//编译出错

Animal a2 = new Dog();

}

}

abstract class Animal{

//动物名字

String name;

//动物叫声

public void shout(){

System.out.println("叫声...");

}

}

class Dog extends Animal{

//狗类独有的方法

public void guard(){

System.out.println("狗有看门的独特本领!");

}

}

编译结果:

7b2f39ac086874154a6e460665f703a0.png

List list;//正确,list = null;

List list = new List();//是错误的用法

List list = new ArrayList();这句创建了一个ArrayList实现类的对象后把它上溯到了List接口。此时它就是一个List对

象了。有些属性和方法,如果ArrayList类具有,但是List接口没有,它就不能再用了这些属性和方法了。 而ArrayList list=newArrayList();

创建一对象则保留了ArrayList的所有属性和方法。

个人见解

我们继续上面的例子,如果我们创建的是抽象类的对象引用,那么这个对象只能调用自己的非抽象方法,下面的

是shout()方法,不能调用继承它的子类的独有的方法,在下面的就是guard()方法不能被a1调用,继续测试代码:

public class Test{

public static void main(String[] args){

Animal a1 = new Dog();

a1.shout();//编译通过

//a1.guard();//编译出错

}

}

abstract class Animal{

//动物名字

String name;

//动物叫声

public void shout(){

System.out.println("叫声...");

}

}

class Dog extends Animal{

//狗类独有的方法

public void guard(){

System.out.println("狗有看门的独特本领!");

}

}

编译结果:

f7f8e7ade65f979b3e4a62fa813400c1.png

如果我们采用Dog d1 = new Dog();那么d1可以调用抽象类和子类的所有属性和方法,这里不再测试。

这是一个例子:

import java.util.*;

public class Demo{

public static void main(String[] args){

List list = new ArrayList();

ArrayList arrayList = new ArrayList();

list.trimToSize();//错误,没有该方法。

arrayList.trimToSize();//ArrayList里有该方法。

}

}

编译一下就知道结果了。

个人见解

我刚在前面的文章里面把Java API中List接口和ArrayList实现类的方法都列出来了,可以看到List接口中并没有

trimToSize()方法,但这个方法在它的实现类ArrayList中有。因此编译的结果为:

ebe80bb973cc85b7e3d7bb8e1cbf7218.png

如果是下面这个样子的:

List a=new ArrayList();

则a拥有List的所有属性和方法,不会拥有其实现类ArrayList的独有的属性和方法。

如果List与ArrayList中有相同的属性(如int i),有相同的方法(如void f()),

则a.i是调用了List中的i

a.f()是调用了ArrayList中的f();

----------------------------------------------------------------------------------------------------------------

问题的关键:

为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?

问题就在于List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如

LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根

本不需要改动。

假设你开始用ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了ArrayList实现类特有的方法

和属性。

个人见解

上面的说明,我是在看了设计模式才恍然大悟的,设计模式的原则和理念果然是强大的,只有好好学习了面向对

象原则和设计模式,那么理解上面的就不再是难度,这样的好处是为了代码的可维护性,可复用性,可扩展性以及灵

活性,再者就是这符合了里氏代换原则和开闭原则。看来学习设计模式好处是大大的。

地区用List arr = new ArrayList();定义;行业用ArrayList arr = new ArrayList();定义;则说明,行业里用到了ArrayList的

特殊的方法.

另外的例子就是,在类的方法中,如下声明:

private void doMyAction(List list){}

这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.

如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制

你的自定义类.

个人见解

正因为List是接口,所以它的扩展性是良好的,这是面向对象编程最大的改变,也是它的核心,在这里我是体会

到了一句话,就是Java集合框架的学习最难体现你学习Java语言的程序都多深,看来我以前学习的程度只是停留在入

门级别了,这几天可要好好再温习重新认识一番Java集合框架了。

可能理解不是很深,对于原文的理解也就这些了,不对的地方自己会及时更正。

回顾一下List的框架图

c675d5779c0eb1b7de7c2ac525382e4d.png

(01) List 是一个接口,它继承于Collection的接口。它代表着有序的队列。

(02) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。

(03) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了“链表中,根据index索引值操作链表的全部函数”。

(04) ArrayList, LinkedList, Vector, Stack是List的4个实现类。

ArrayList 是一个数组队列,相当于动态数组。它由数组实现,随机访问效率高,随机插入、随机删除效率低。

LinkedList 是一个双向链表。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList随机访问效率低,但随机插入、随机删除效率低。

Vector 是矢量队列,和ArrayList一样,它也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,而Vector是线程安全的。

Stack 是栈,它继承于Vector。它的特性是:先进后出(FILO, First In Last Out)。



推荐阅读
  • 结对编程 地铁最短路径 张波朱新远
    结对编程地铁最短路径一、任务:实现一个帮助进行地铁出行路线规划的命令行程序。PSP2.1PersonalSoftwareProcessStagesTimePlanni ... [详细]
  • 什么是API接口?给大家举例说明
    Api接口也就是所谓的应用程序接口,api接口的全称是ApplicationProgramInterface,通过API接口可以实现计算机软件之间的相互 ... [详细]
  • 下载器,就是一种网络工具,从网络中接收自己想要的数据。下载器是一个网络客户端。它的下载流程无非就是客户端连接服务器端,然后发送资源下载请求 ... [详细]
  • 本文整理了Java中org.assertj.core.api.AbstractCharSequenceAssert.hasSize()方法的一些代码示例,展示了 ... [详细]
  • 编译lib手动编译cmake编译gtest测试程序断言和caseFixture使用gmock编译gmock测试程序参考GtestGithub使用gtest(gmock)方便我们编写 ... [详细]
  • 日期:2012-4-7来源:GBin1.com在线演示本地下载今天我们介绍一个超棒的创建快速动态互动HTML5可视化图形效果的javascript类库-Envision.j ... [详细]
  • 1、对于List而言,要不然就使用迭代器,要不然就从后往前删除,从前往后删除会出现角标越界。因为我List有两个remove方法,一个是int作为形参(删除指定位置的元素),一个是 ... [详细]
  • springboot系列(二)创建springboot工程
    https:www.cnblogs.commagicalSamp7171716.html简介SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spri ... [详细]
  • 一、概述ceph为k8s提供存储服务主要有两种方式,cephfs和cephrdb;cephfs方式支持k8s的pv的3种访问模式ReadWriteOnce,ReadOnlyMany ... [详细]
  • Mybatis源码解析——Executor
    ExecutorExecutor提供了数据库操作的一些方法以及Mybatis的缓存和事物管理功能。模板方法模式要实现某个方法,必须经过很多算法,但这些算法的顺序是固定的,将算法的运 ... [详细]
  • 服务器性能优化之网络性能优化
    hi,大家好,今天分享一篇后台服务器性能优 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
author-avatar
陈俊英围脖_687
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有