1、ArrayList及LinkedList实现
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable
2、RandomAccess:RandomAccess 是一个标志接口,表明实现这个这个接口的 List 集合是支持快速随机访问的。也就是说,实现了这个接口的集合是支持 快速随机访问 策略的。
ArrayList实现了一个叫做 RandomAccess
的接口,而 LinkedList 是没有的,如果是实现了这个接口的 List,那么使用for循环的方式获取数据会优于用迭代器获取数据。
(一)cloneable接口有什么用
我们都知道想要实现拷贝需要实现Cloneable接口并在类中实现clone()方法,不过比较神奇的是,clone()方法并不是Cloneable接口中的方法。
Cloneable接口是一个空接口,里面没有任何内容
但是如果没有实现Cloneable接口,就会导致clone()方法报CloneNotSupportException错误,所以你可以把Cloneable接口看成实现clone()方法必须要的一个因素。
(二)什么是深拷贝和浅拷贝
开发过程中,有时会遇到把现有的一个对象的所有成员属性拷贝给另一个对象的需求。这个时候就会用到拷贝这个概念。我们把原对象定义成A,拷贝后的对象定义成B,如果只是单纯使用clone方法进行拷贝,你会发现:
1、对于八个基本类型,会拷贝其值,并且B的改变不会影响A。
2、如果是一个对象,拷贝的是地址引用,也就是说此时新拷贝出的对象与原有对象共享该实例变量,不受访问权限的限制。B对该值的改变会影响A。
3、对于String字符串,这个比较特殊,虽然拷贝的也是引用,但是在修改的时候,它会从字符串池中重新生成新的字符串,原有的字符串对象保持不变。
这种只单纯拷贝引用地址的动作就是浅拷贝。
相反,如果拷贝一个对象时不是简单的将地址引用拷贝出来,而是新建了一个对象,这种方式就是深拷贝。
Java左移与右移
我们都知道对于有符号数据类型,二进制最左端的数字为符号位,0代表正,1代表负,这里先介绍几个概念
逻辑左移=算术左移:高位溢出,低位补0
逻辑右移:低位溢出,高位补0
算术右移:低位溢出,高位用符号位的值补
比如一个有符号位的8位二进制数10101010,[]是添加的数字
逻辑左移一位:0101010[0]
逻辑左移两位:101010[00]
算术左移一位:0101010[0]
算术左移两位:101010[00]
逻辑右移一位:[0]1010101
逻辑右移两位:[00]101010
算术右移一位:[1]1010101
算术右移两位:[11]101010
算术左移和算术右移主要用来进行有符号数的倍增、减半
逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半
(Java中是没有无符号数据类型的,C和C++中有)
符号 例子 解释
<< num<< n 相当于 num×2nnum×2n,算数左移(逻辑左移)
>> num>>n 相当于num2nnum2n,算数右移
>>> num>>>n 逻辑右移,当num为正数和算术右移一个效果
public static void main(String[] args) {
// 20
System.out.println(10 << 1);
// -20
System.out.println(-10 << 1);
// 5
System.out.println(10 >> 1);
// -5
System.out.println(-10 >> 1);
// 5
System.out.println(10 >>> 1);
// 2147483643
System.out.println(-10 >>> 1);
}