Android JAVA知识点

126 阅读2分钟

数组和链表的区别

数组的特点

在内存中,数组是一块连续的区域。数组需要预留的空间,在使用前需要申请占内存的大小(可能会浪费空间)。

插入数据和删除数据效率低,插入数据前,这个位置后面的数据在内存中都要向后移。删除数据时,这个数据后面的数据都要往前移动。

随机读取效率很高。因为数组是连续的,知道每一个数据的内存地址,可以直接找到该地址的数据。

不利于扩展,数组定义的空间不够时要重新定义数组。

链表的特点

在内存中可以存在任何地方,不要求连续。(电影院随便坐) 每一个数据都保存了下一个数据的内存地址,通过这个地址找到下一个数据。 增加数据和删除数据很容易。 查找数据时效率低,因为不具有随机访问行,所以访问某个位置的数据都要从第一个数据开始访问,然后根据第一个数据保存的下一个数据的地址找到第二个数据。 不指定大小,扩展方便。链表大小不用定义,数据随意增删。

优缺点

数组的优点

随机访问性强 查找速度快

数组的缺点

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

链表的优点

插入速度快 内存利用率高,不会浪费内存 大小没有规定,扩展很灵活

链表的缺点

不能随机查找,必须从第一个开始遍历,查找效率低

volatile和synchronized的区别

volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

volatile仅能使用在变量级别; synchronized则可以使用在变量、方法、和类级别的

volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性

volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译器优化