Java中为何要使用ArrayList

 更新时间:2020年09月07日 10:26:35   作者:小强Zzz  
这篇文章主要介绍了Java中为何要使用ArrayList,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下

前言

当我们用于获取一组数据的时候,我们总是通过下面的格式定义变量。

private List<Tag> tags = new ArrayList<>();

我们熟悉的数组去哪了?

回顾数组

我们学习c语言,c++,会学到数组是存储同类型的一组数据。后来学习指针,知道了两种结构,链式结构与顺序结构。再后来学习数据结构。知道了两种结构的优缺点。

链式结构方便删除,添加。
顺序结构方便查找。

但是我们在实际使用中逐渐感受到数组在使用上的缺点。不仅仅是在定义时就要规定数组大小。

我们通过一个实例来说明

Enemy[] enemys = new Enemy[3];

enemys[0].name = name1;
enemys[1].name = name2;
enemys[2].name = name3;

// 通过名字击杀对方
public void kill(string name) {
  for (Enemy enemy : this.enemys) {
    if (enemy.name === name) {
      enemy.death();
      System.out.println("击杀成功");
      break;
    }
  }
}

比如我们玩游戏,现在面前有三个敌人。我们可以通过名字击杀对方(通过什么方法击杀对方并不是我们的重点)。
但是代码有一些问题。如果我们总是传入一个名字,比如name1,此时代码总是会显示击杀成功,一个敌人只有一条命。现在显然与实际不符。如何解决呢。
这时我们想到了一个传统的解决办法。在enemy类里增加增加一个Boolean类型属性alive,默认值为true。此时改写kill方法代码。

public void kill(string name) {
  for (Enemy enemy : this.enemys) {
    if (enemy.name === name && enemy.alive === true) {
      enemy.death();
      enemy.alive = false;
      System.out.println("击杀成功");
      break;
    }
  }
}

就很好的解决了一个敌人可以被击杀多次的bug。
但是,问题解决了,还有一些不足。

我们虽然不会显示一个敌人多次击杀成功。但是还是要搜寻一遍。有没有更好的办法呢。

ArrayList

如果我们能在成功击杀的时候。能够将这个敌人移除数组,并将数组长度减一。将会变得完美。但是,通过数组是实现不了的。

这时ArrayList很好的解决了这个问题。

ArrayList并不是一个数组。而是Java函数库的一个类。我们通过ArrayList来改写一下我们的代码。

ArrayList<Enemy> enemys = new ArrayList<Enemy>();

Enemy enemy1 = new Enemy();
enemy1.name = name1;
enemys.add(enemy1);

Enemy enemy2 = new Enemy();
enemy2.name = name2;
enemys.add(enemy2);

Enemy enemy3 = new Enemy();
enemy3.name = name3;
enemys.add(enemy3);

// 通过名字击杀对方
public void kill(string name) {
  for (Enemy enemy : this.enemys) {
    if (enemy.name === name) {
      enemy.death();
      this.enemys.remove(enemy);
      System.out.println("击杀成功");
      break;
    }
  }
}

这时,当我们成功击杀敌人时,将敌人移除。就会使得下次遍历时次数变少,并且也避免了重复杀死一个敌人的bug。

List与ArrayList

上边的代码中,我们在定义时是声明的ArayList变量类型为ArrayList类型

ArrayList<Enemy> enemys = new ArrayList<Enemy>();

但是回到我们的实际项目中为什么是List类型呢

我们刚才说到ArrayList是一个类。我们看一下ArrayList类的继承关系

而List是一个接口

public interface List<E> extends Collection<E> {
}

所以说ArrayList是List的一个实现类。
而我们在实际项目中写

List<Subject> usedSubjects = new ArrayList<>();

也就实现了以下格式代码

接口 变量名 = new 接口实现类();

能够实现此写法的一个原因就是面向对象的三大特点之一——多态。
什么是多态?
举个例子,对于以下Dog类

class Animal {
}

class Gog extends Animal {
}

我们在定义对象时总是通过这样来定义

Dog dog = new Dog();

而多态允许我们可以使用这种方式定义

Animal dog = new Dog ();

多态不仅支持子类与父类之间,也支持接口与他的实现类之间。

那么这么写有什么好处呢?

List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。

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

以上就是Java中为何要使用ArrayList的详细内容,更多关于Java ArrayList的资料请关注脚本之家其它相关文章!

相关文章

  • 分享一个安卓的内置多种工具类的Activity

    分享一个安卓的内置多种工具类的Activity

    这篇文章主要介绍了分享一个安卓的内置多种工具类的Activity的相关资料,需要的朋友可以参考下
    2015-04-04
  • Java面向对象基础,类,变量,方法

    Java面向对象基础,类,变量,方法

    这篇文章主要介绍了Java面向对象基础,类,变量,方法,需要的朋友可以参考下
    2020-10-10
  • Java使用NIO优化IO实现文件上传下载功能

    Java使用NIO优化IO实现文件上传下载功能

    IO 是基于流来读取的,而NIO则是基于块读取,面向流 的 I/O 系统一次一个字节地处理数据,这篇文章主要介绍了Java使用NIO优化IO实现文件上传下载功能,需要的朋友可以参考下
    2022-07-07
  • Java 数据结构与算法系列精讲之贪心算法

    Java 数据结构与算法系列精讲之贪心算法

    我们可能在好多地方都会听到贪心算法这一概念,并且它的算法思想也比较简单就是说算法只保证局部最优,进而达到全局最优。但我们实际编程的过程中用的并不是很多,究其原因可能是贪心算法使用的条件比较苛刻,所要解决的问题必须满足贪心选择性质
    2022-02-02
  • Spring Security 密码验证动态加盐的验证处理方法

    Spring Security 密码验证动态加盐的验证处理方法

    小编最近在改造项目,需要将gateway整合security在一起进行认证和鉴权,今天小编给大家分享Spring Security 密码验证动态加盐的验证处理方法,感兴趣的朋友一起看看吧
    2021-06-06
  • SpringMVC文件上传及查看的示例代码

    SpringMVC文件上传及查看的示例代码

    本篇文章主要介绍了SpringMVC文件上传及查看的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • java使用socket实现一个多线程web服务器的方法

    java使用socket实现一个多线程web服务器的方法

    今天小编就为大家分享一篇java使用socket实现一个多线程web服务器的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-10-10
  • java并发高的情况下用ThreadLocalRandom来生成随机数

    java并发高的情况下用ThreadLocalRandom来生成随机数

    如果我们想要生成一个随机数,通常会使用Random类。但是在并发情况下Random生成随机数的性能并不是很理想,本文主要介绍了java并发高的情况下用ThreadLocalRandom来生成随机数,感兴趣的可以了解一下
    2022-05-05
  • 深入jetty的使用详解

    深入jetty的使用详解

    本篇文章是对jetty的使用进行了详细的分析解释。需要的朋友参考下
    2013-05-05
  • Java序列化的原理分析及解决

    Java序列化的原理分析及解决

    文章介绍了Java中的序列化机制,包括Serializable和Externalizable接口的区别,以及serialVersionUID的作用,Serializable接口可以序列化的所有子类型本身都是可序列化的,如果要序列化的类有父类,父类也应该实现Serializable接口
    2024-11-11

最新评论