天天看点

Java面试之数组如何权衡是使用无序的数组还是有序的数组怎么判断数组是 null 还是为空Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList数组和链表数据结构描述,各自的时间复杂度数组有没有length()这个方法? String有没有length()这个方法

整理了一些网上的面试经,若有不足之处,希望大佬们多多指点~

如何权衡是使用无序的数组还是有序的数组

  • 有序数组查询容易插入难,无序数据插入容易,查询难
  • 查找时间复杂度:有序数组O(log n),无序数组O(n)
  • 插入时间复杂度:有序数组O(n),无序数组O(1)

怎么判断数组是 null 还是为空

可以判断该数组长度是否为0和它是否为null

Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList

Array

:它是数组,申明数组的时候就要初始化并确定长度,长度不可变,而且它只能存储同一类型的数据,比如申明为String类型的数组,那么它只能存储S听类型数据

ArrayList

:它是一个集合,需要先申明,然后再添加数据,长度是根据内容的多少而改变的,ArrayList可以存放不同类型的数据,在存储基本类型数据的时候要使用基本数据类型的包装类

当能确定长度并且数据类型一致的时候就可以用数组,其他时候使用ArrayList

数组和链表数据结构描述,各自的时间复杂度

数组和链表是两种基本的数组结构,他们在内存存储上的表现不一样各自特点不同

  • 数组的特点:
  1. 在内存中,数组是一块连续的区域
  2. 数组需要预留空间,在使用前要申请好内存空间,可能会造成内存空间的浪费
  3. 插入数组和删除数组效率低,插入数组的时候这个位置后面的数组在内存中都要向后移。删除数据的时候,这个数据的后面的数据都要向前面移动
  4. 随机读取效率高,因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据
  5. 并且不利于扩展,数组定义的空间不够的时候要重新定义数组
  • 链表的特点:
  1. 在内存中可以存在任何地方,不要求连续
  2. 在每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据
  3. 增加数据和删除数据很容易
  4. 查找数据的时候效率比较低,因为不具有随机访问型,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,依次类推
  5. 不指定大小,扩展方便,链表大小不用定义,数据随意增减
  • 各自的优缺点:

数组的优点:随机访问性强、查找数据快

数组的缺点:插入和删除效率低、可能浪费内存、内存空间要求高,必须有足够的连续内存空间、数组大小固定,不能动态拓展

链表的优点:插入和删除速度快、内存利用率高,不会浪费内存、大小没有固定,拓展很灵活

链表的缺点:不能随机查找,必须要从第一个开始遍历,查找效率低、

  • 以下为数组和链表操作的时间复杂度
Java面试之数组如何权衡是使用无序的数组还是有序的数组怎么判断数组是 null 还是为空Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList数组和链表数据结构描述,各自的时间复杂度数组有没有length()这个方法? String有没有length()这个方法

链表和数组个操作时间复杂度

数组有没有length()这个方法? String有没有length()这个方法

数组没有length()这个方法,只有length属性,String有length()这个方法

备注:问题整理来源于唐尤华

当然,复习光靠这些还是不够的,还是要多加代码练习以及专业书籍阅读量的,加油!