Java中为何要使用ArrayList
前言
当我们用于获取一组数据的时候,我们总是通过下面的格式定义变量。
privateListtags=newArrayList<>();
我们熟悉的数组去哪了?
回顾数组
我们学习c语言,c++,会学到数组是存储同类型的一组数据。后来学习指针,知道了两种结构,链式结构与顺序结构。再后来学习数据结构。知道了两种结构的优缺点。
链式结构方便删除,添加。
顺序结构方便查找。
但是我们在实际使用中逐渐感受到数组在使用上的缺点。不仅仅是在定义时就要规定数组大小。
我们通过一个实例来说明
Enemy[]enemys=newEnemy[3]; enemys[0].name=name1; enemys[1].name=name2; enemys[2].name=name3; //通过名字击杀对方 publicvoidkill(stringname){ for(Enemyenemy:this.enemys){ if(enemy.name===name){ enemy.death(); System.out.println("击杀成功"); break; } } }
比如我们玩游戏,现在面前有三个敌人。我们可以通过名字击杀对方(通过什么方法击杀对方并不是我们的重点)。
但是代码有一些问题。如果我们总是传入一个名字,比如name1,此时代码总是会显示击杀成功,一个敌人只有一条命。现在显然与实际不符。如何解决呢。
这时我们想到了一个传统的解决办法。在enemy类里增加增加一个Boolean类型属性alive,默认值为true。此时改写kill方法代码。
publicvoidkill(stringname){ for(Enemyenemy:this.enemys){ if(enemy.name===name&&enemy.alive===true){ enemy.death(); enemy.alive=false; System.out.println("击杀成功"); break; } } }
就很好的解决了一个敌人可以被击杀多次的bug。
但是,问题解决了,还有一些不足。
我们虽然不会显示一个敌人多次击杀成功。但是还是要搜寻一遍。有没有更好的办法呢。
ArrayList
如果我们能在成功击杀的时候。能够将这个敌人移除数组,并将数组长度减一。将会变得完美。但是,通过数组是实现不了的。
这时ArrayList很好的解决了这个问题。
ArrayList并不是一个数组。而是Java函数库的一个类。我们通过ArrayList来改写一下我们的代码。
ArrayListenemys=newArrayList (); Enemyenemy1=newEnemy(); enemy1.name=name1; enemys.add(enemy1); Enemyenemy2=newEnemy(); enemy2.name=name2; enemys.add(enemy2); Enemyenemy3=newEnemy(); enemy3.name=name3; enemys.add(enemy3); //通过名字击杀对方 publicvoidkill(stringname){ for(Enemyenemy:this.enemys){ if(enemy.name===name){ enemy.death(); this.enemys.remove(enemy); System.out.println("击杀成功"); break; } } }
这时,当我们成功击杀敌人时,将敌人移除。就会使得下次遍历时次数变少,并且也避免了重复杀死一个敌人的bug。
List与ArrayList
上边的代码中,我们在定义时是声明的ArayList变量类型为ArrayList类型
ArrayList
enemys=newArrayList ();
但是回到我们的实际项目中为什么是List类型呢
我们刚才说到ArrayList是一个类。我们看一下ArrayList类的继承关系
而List是一个接口
publicinterfaceListextendsCollection { }
所以说ArrayList是List的一个实现类。
而我们在实际项目中写
ListusedSubjects=newArrayList<>();
也就实现了以下格式代码
接口变量名=new接口实现类();
能够实现此写法的一个原因就是面向对象的三大特点之一——多态。
什么是多态?
举个例子,对于以下Dog类
classAnimal{ } classGogextendsAnimal{ }
我们在定义对象时总是通过这样来定义
Dogdog=newDog();
而多态允许我们可以使用这种方式定义
Animaldog=newDog();
多态不仅支持子类与父类之间,也支持接口与他的实现类之间。
那么这么写有什么好处呢?
List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如LinkedList或者Vector等等,这时你只要改变这一行就行了:Listlist=newLinkedList();其它使用了list地方的代码根本不需要改动。
假设你开始用ArrayListalist=newArrayList(),这下你有的改了,特别是如果你使用了ArrayList实现类特有的方法和属性。
以上就是Java中为何要使用ArrayList的详细内容,更多关于JavaArrayList的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。