博主今天去了一个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 == null || c == null){
return false;
}
if(b.length != c.length){
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中的元素
11 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的区别与联系的更多相关文章

  1. Java面试题之Array和ArrayList的区别

    Array和ArrayList的区别: 1.Array类型的变量在声明的同时必须进行实例化(至少得初花数组的大小),而ArrayList可以只是先声明: 2.Array始终是连续存放的:而ArrayL ...

  2. java数据结构--array与ArrayList的区别

    ArrayList 内部是由一个array 实现的. 如果你知道array 和 ArrayList 的相似点和不同点,就可以选择什么时候用array 或者使用ArrayList , array 提供 ...

  3. C# array与arraylist区别及获取sql字段名

    array与arraylist的区别: 1.  Array 的容量是固定的,而 ArrayList 的容量是根据需要自动扩展的.如果更改了 ArrayList.Capacity 属性的值,则自动进行内 ...

  4. Array和ArrayList有什么区别?

    Array和ArrayList的区别: 1.Array可以包含基本数据类型和对象类型,而ArrayList只能包含对象类型 2.Array有固定的大小,而ArrayList是动态变化的. 3.Arra ...

  5. Array和ArrayList的异同点【转】

    相信数组是大家在编程最常使用的,不论任何语言都存在数组这样的数据结构,由于C#语言是完全面向对象的,所以在C#中的数组也是对象,实际上就是Array类的实例,Array类的使用可以说是使用最频繁的,只 ...

  6. Java ArrayList和Vector、LinkedList与ArrayList、数组(Array)和列表集合(ArrayList)的区别

    ArrayList和Vector的区别ArrayList与Vector主要从二方面来说.  一.同步性:   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步 ...

  7. Array、List和ArrayList的区别(推荐: 浅显易懂)

    数组.List和ArrayList的区别(推荐: 浅显易懂)   有些知识点可能平时一直在使用,不过实际开发中我们可能只是知其然不知其所以然,所以经常的总结会对我们的提高和进步有很大的帮助,这里记录自 ...

  8. Java-杂项: Java中Array和ArrayList区别

    ylbtech-Java-杂项: Java中Array和ArrayList区别 1.返回顶部 1. 1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array( ...

  9. java中Array和ArrayList区别

    1)精辟阐述:可以将 ArrayList想象成一种“会自动扩增容量的Array”. 2)Array([]):最高效:但是其容量固定且无法动态改变:     ArrayList:  容量可动态增长:但牺 ...

随机推荐

  1. Java中的Classpath

    classpath实际上就是编译后的,以classes文件夹为起点的路径各种path获取到的路径的区别 Demo.class.getResource("");//得到的是Demo类 ...

  2. springboot(二):web综合开发

    上篇文章介绍了spring boot初级教程:spring boot(一):入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续为大家介绍spring boot的其它 ...

  3. Eclipse常用的6个Debug技巧

    1. Ctrl+Shift+i: Person father = new Person(); father.setName("father"); System.out.printl ...

  4. React入门---可复用组件-10

    主要对props更多重要的特性进行学习; 还是用之前代码, index.js代码为: var React = require('react'); var ReactDOM = require('rea ...

  5. 【JAVAWEB学习笔记】21_多条件查询、attr和prop的区别和分页的实现

    今天主要学习了数据库的多条件查询.attr和prop的区别和分页的实现 一.实现多条件查询 public List<Product> findProductListByCondition( ...

  6. 集群/分布式环境下5种session处理策略

    转载自:http://blog.csdn.net/u010028869/article/details/50773174?ref=myread 前言 在搭建完集群环境后,不得不考虑的一个问题就是用户访 ...

  7. java zip4j 内存文件和磁盘文件 压缩和加密

    经常服务器需要对文件进行压缩,网络上流传较多的是从磁盘文件中来压缩成zip文件.但是常常服务器的文件存放在内存中,以byte[]形式存储在内存中.这个时候就不能使用网络上流传的常用方法了,这里就需要对 ...

  8. DATA VISUALIZATION – PART 1

    Introduction to Data Visualization – Theory, R & ggplot2 The topic of data visualization is very ...

  9. spring MVC 乱码问题

    (转) spring的字符集过滤通过用于处理项目中的乱码问题,该过滤器位于org.springframework.web.filter包中,指向类CharacterEncodingFilter,Cha ...

  10. 同步中的四种锁synchronized、ReentrantLock、ReadWriteLock、StampedLock

    目录 1.synchronized同步锁 2.ReentrantLock重入锁 3.ReadWriteLock读写锁 4.StampedLock戳锁(目前没找到合适的名字,先这么叫吧...) 5.总结 ...