1、Primitive vs Reference variable
primitive变量有默认值
primitive变量存储值,reference变量存储对象在heap中的handle
primitive变量赋值是值的拷贝(互不影响),reference变量赋值是handle的拷贝(操作会影响另一方)
primitive变量使用==比较,reference变量使用equals()比较
primitive变量作为参数传递的是值,reference变量作为参数传递的是handle的拷贝
primitive变量参数的值在方法内被修改不影响原有值,reference变量参数修改handle不影响原有值但使用handle可以修改内部的值
primitive变量作为方法的返回值时返回的是值,返回reference变量时返回的是handle可以继续在方法外使用
primitive变量存储在stack,reference变量存储在heap
2、Static vs Non Static class
类分为顶级类和嵌套内部类(还有特殊的匿名类)
顶级类不能被定义为static,嵌套内部类可以选择是否为static
嵌套内部类如果是static的话一般叫嵌套类,非static的叫内部类
嵌套类和内部类的创建方法不同:
Outer.Nested nested = new Outer.Nested();
Outer.Inner inner = new Outer().new Inner();
嵌套类可以被看做外部类的一个静态成员,可以在static方法中被使用
嵌套类不可以访问外部类的非static成员,内部类可以
3、Interface vs Abstract Class
抽象类只能extend一个,接口可以implement多个
抽象类中可以定义非抽象方法,接口中不能定义非抽象方法(JDK8默认方法除外)
抽象类中即使没有抽象方法也可以标记为abstract
抽象类可以添加方法不影响子类,接口中添加方法需要修改所以它的实现类
抽象类适合代码重用,接口适合类型同一
接口没有方法实现更易于解耦
接口可以实现依赖注入
接口里的变量默认是public final
接口不可实例化,抽象类不可实例化但可以invoked
4、Error vs Exception
常见Error:OutOfMemoryError
Error不需要try-catch即使catch了也无法解决,Exception异常catch后可做后续处理
RuntimeException表示的是程序代码的错误,Erro多为系统环境上致命错误
5、ArrayList vs LinkedList
ArrayList后台通过数组实现,LinkedList通过链表实现(嵌套类存储前后节点)
LinkedList不只是实现了List还实现了Deque(FIFO)。add(),poll()
添加元素:ArrayList-O(1) LinkedList-O(1)
删除元素:ArrayList-O(n) LinkedList-O(n/2)
获取元素:ArrayList-O(1) LinkedList-O(n/2)