整理了一些网上的面试经,若有不足之处,希望大佬们多多指点~
如何权衡是使用无序的数组还是有序的数组
- 有序数组查询容易插入难,无序数据插入容易,查询难
- 查找时间复杂度:有序数组O(log n),无序数组O(n)
- 插入时间复杂度:有序数组O(n),无序数组O(1)
怎么判断数组是 null 还是为空
可以判断该数组长度是否为0和它是否为null
Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList
Array
:它是数组,申明数组的时候就要初始化并确定长度,长度不可变,而且它只能存储同一类型的数据,比如申明为String类型的数组,那么它只能存储S听类型数据
ArrayList
:它是一个集合,需要先申明,然后再添加数据,长度是根据内容的多少而改变的,ArrayList可以存放不同类型的数据,在存储基本类型数据的时候要使用基本数据类型的包装类
当能确定长度并且数据类型一致的时候就可以用数组,其他时候使用ArrayList
数组和链表数据结构描述,各自的时间复杂度
数组和链表是两种基本的数组结构,他们在内存存储上的表现不一样各自特点不同
- 数组的特点:
- 在内存中,数组是一块连续的区域
- 数组需要预留空间,在使用前要申请好内存空间,可能会造成内存空间的浪费
- 插入数组和删除数组效率低,插入数组的时候这个位置后面的数组在内存中都要向后移。删除数据的时候,这个数据的后面的数据都要向前面移动
- 随机读取效率高,因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据
- 并且不利于扩展,数组定义的空间不够的时候要重新定义数组
- 链表的特点:
- 在内存中可以存在任何地方,不要求连续
- 在每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据
- 增加数据和删除数据很容易
- 查找数据的时候效率比较低,因为不具有随机访问型,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据,依次类推
- 不指定大小,扩展方便,链表大小不用定义,数据随意增减
- 各自的优缺点:
数组的优点:随机访问性强、查找数据快
数组的缺点:插入和删除效率低、可能浪费内存、内存空间要求高,必须有足够的连续内存空间、数组大小固定,不能动态拓展
链表的优点:插入和删除速度快、内存利用率高,不会浪费内存、大小没有固定,拓展很灵活
链表的缺点:不能随机查找,必须要从第一个开始遍历,查找效率低、
- 以下为数组和链表操作的时间复杂度
链表和数组个操作时间复杂度
数组有没有length()这个方法? String有没有length()这个方法
数组没有length()这个方法,只有length属性,String有length()这个方法
备注:问题整理来源于唐尤华
当然,复习光靠这些还是不够的,还是要多加代码练习以及专业书籍阅读量的,加油!