当前位置:首页 > 编程教程 > java技术文章 > 详谈Array和ArrayList的区别与联系

学习Array和ArrayList的区别与联系

  • 发布时间:
  • 作者:码农之家
  • 点击:118

这篇文章主要知识点是关于Array、ArrayList、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Effective Java
Effective Java中文第2版
  • 类型:java大小:56 MB格式:PDF作者:布洛克
立即下载

详谈Array和ArrayList的区别与联系

昨天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和ArrayList的区别和联系之后,却让博主一脸懵。好吧,不多说,现在特此整理。

首先, Array是java中的数组,我们声明java的数组有三种方式:

int[] a = new int[10]; 
int a[] = new int[10]; //这种方式同c语言一样
int a[] = {1,2,3,4}; 

从上面的声明中可以看出来,我们在定义了一个数组的时候,必须指定这个数组的数据类型,也就是说,数组是相同数据类型的集合。另外,在数组声明的时候,我们也声明了数组的大小,数组的元素个数是固定的。

下面,我们看看数组的应用:

import java.util.Arrays;

/**
 * @author jy
 * @time 下午7:59:26
 */
public class ArrayAndArrayList {
  public static void main(String[] args) {
    
   int a[] = new int[4];
   System.out.println(a.length); //数组的长度属性
   
   int b[] = {1,2};
   int c[] = {1,2};
   System.out.println(b.equals(c)); //输出为false,可见数组并没有重写hashcode()和equals()方法
   System.out.println(Arrays.equals(b, c)); //利用java.util.Array的equals()来判断数组是否相等,这里输出true
   System.out.println(isEquals(b,c));
   
  }

  /**
   * 重写方法来手动实现数组之间的比较方法
   */
  public static boolean isEquals(int[] b, int[] c) {
    
    if(b.length != c.length){
      return false;
    }
    if(b == null ||c == null){
      return false;
    }
    for (int i = 0; i < c.length; i ++) {
      if(b[i] != c[i]){
        return false;
      }
    }
    return true;
  }
  
}

可见,数组的长度是固定的,不可变的。数组并未重写object的hashcCode()和equals()方法。

我们都知道,数组还可以是二维的,下面我们看看二维数组是如何声明的:

 int[][] da = new int[2][3]; //推荐用这种声明方式,更能表明数组的类型
 int db[][] = new int[4][3];

但是,有一种变长的二维数组:

 int[][] dc = new int[2][]; //第一维的大小不能空缺,第二维的大小可以是不一样的。
 dc[0] = new int[2];
 dc[1] = new int[3];

好了,数组这个基本的数据结构的应用我们就说到这里,为了突出主题,其余的一些不相干的应用我们就不扯了。

下面,我们再来看看ArrayList这个集合:

ArrayList是动态数组,也就是数组的复杂版本,它可以动态的添加和删除元素,ArrayList实现了java.util.Collections.Collection.List接口。下面我们来看一下最基本的声明:

ArrayList list = new ArrayList(10); 
ArrayList<Integer> list1 = new ArrayList<Integer>();

第一种声明中,在不使用泛型的情况下,这个list是可以添加进不同类型的元素的,而且arraylist是可以不用指定长度的。在使用泛型时,我们就只能添加一种类型的数据了。

ArrayList的重要方法和属性如下代码所示:

ArrayList<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.remove(1);
    Object[] p = list.toArray(); //转化成数组
    System.out.println(p[0]);
    System.out.println(list.contains(4)); //是否包含某个元素
    System.out.println(list.size()); //list的长度
    System.out.println(list.get(0)); //按位获取list中的元素
    list.trimToSize(); //这个方法用于将ArrayList固定到实际元素的大小,当动态数组元素确定不在添加的时候,可以调用这个方法来释放空余的内存

上面显示了ArrayList的一些重要的方法。下面我们就这两个集合类进行对比:

(1)ArrayList是Array的复杂版本

ArrayList内部封装了一个Object类型的数组,从一般的意义来说,它和数组没有本质的差别,甚至于ArrayList的许多方法,如Index、IndexOf、Contains、Sort等都是在内部数组的基础上直接调用Array的对应方法。

(2)存储的数据类型

ArrayList可以存储异构对象,而Array只能存储相同数据类型的数据。

(3)长度的可变

Array的长度实际上是不可变的,二维变长数组实际上的长度也是固定的,可变的只是其中元素的长度。而ArrayList的长度既可以指定(即使指定了长度,也会自动2倍扩容)也可以不指定,是变长的。

(4)存取和增删元素

对于一般的引用类型来说,这部分的影响不是很大,但是对于值类型来说,往ArrayList里面添加和修改元素,都会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率。另外,ArrayList是动态数组,它不包括通过Key或者Value快速访问的算法,所以实际上调用IndexOf、Contains等方法是执行的简单的循环来查找元素,所以频繁的调用此类方法并不比你自己写循环并且稍作优化来的快,如果有这方面的要求,建议使用Hashtable或SortedList等键值对的集合。

好了,关于这两个数据结构的对比我们就到这里,如果有觉得不妥的地方,欢迎大家指正。

以上这篇详谈Array和ArrayList的区别与联系就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

Java 相关电子书
学习笔记
网友NO.403511

Java源码解析CopyOnWriteArrayList的讲解

本文基于jdk1.8进行分析。 ArrayList和HashMap是我们经常使用的集合,它们不是线程安全的。我们一般都知道HashMap的线程安全版本为ConcurrentHashMap,那么ArrayList有没有类似的线程安全的版本呢?还真有,它就是CopyOnWriteArrayList。 CopyOnWrite这个短语,还有一个专门的称谓COW. COW不仅仅是java实现集合框架时专用的机制,它在计算机中被广泛使用。 首先看一下什么是CopyOnWriteArrayList,它的类前面的javadoc注释很长,我们只截取最前面的一小段。如下。它的介绍中说到,CopyOnWriteArrayList是ArrayList的一个线程安全的变种,在CopyOnWriteArrayList中,所有改变操作(add,set等)都是通过给array做一个新的拷贝来实现的。通常来看,这花费的代价太大了,但是,当读取list的线程数量远远多于写list的线程数量时,这种方法依然比别的实现方式更高效。 /** * A thread-safe variant of {@li……

网友NO.535932

java 中ArrayList迭代的两种实现方法

java 中ArrayList迭代的两种实现方法 Iterator与for语句的结合来实现,代码很简单,大家参考下。 实现代码: package cn.us; import java.util.ArrayList; import java.util.Iterator; //ArrayList迭代的两种方法 //Iterator与for语句的结合 public class Test1 { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("b"); arrayList.add("z"); arrayList.add("f"); arrayList.add("m"); System.out.println("以下是ArrayList迭代的第一种方法……………………………………………………"); Iterator ite=arrayList.iterator(); while(ite.hasNext()){ System.out.println(ite.next()); } System.out.println("以下是ArrayList迭代的第二种方法……………………………………………………"); for (Iterator iterator = arrayList.iterator(); iterator.hasNext();) { System.out.println(iterator.next()); } } } 以上就是java 中ArrayList迭代的方法,如有疑问请留言或者到本站社区交……

网友NO.233596

Java ArrayList底层实现代码分析

如下所示: package com.soto.collection; /** * 自己实现一个ArrayList,帮助我们更好地理解ArrayList的底层结构; * @author 王 * */public class SxtArrayList {private Object[] elementData;private int size;public int size(){return size;}public boolean isEmpty(){return size == 0;}public SxtArrayList(){this(10);}public SxtArrayList(int initialCapacity){if(initialCapacity0){try {throw new Exception();} catch (Exception e) {e.printStackTrace();}}elementData = new Object[initialCapacity]; //初始化 容量为10 }public void add(Object obj){elementData[size++] = obj; //若超过容量了,那么..数组扩容if(size==elementData.length){//实质:搞个新数组Object[] newarray = new Object[size*2+1];//数组的copy:System.arraycopy(elementData, 0, newarray, 0, elementData.length);elementData = newarray;}}public Object get(int index){rangeCheck(index);return elementData[index];}public void remove(int index){ rangeCheck(index); //删除指定位置对象,删除某位置,……

<
1
>

Copyright 2018-2020 www.xz577.com 码农之家

版权投诉 / 书籍推广 / 赞助:520161757@qq.com