Java开发之——开发中容易混淆的几个概念

这篇文章主要记录在开发中容易混淆和使用出现错误的知识点,稍作整理,后续会持续更新

equals和==的区别

==

  • ==是一个运算符
  • ==比较两个对象的栈内存地址是否相同
  • 可以比较基本数据类型的值是否相等

    Equalse

  • string对象的方法
  • 比较两个对象的栈内存地址是否相同
  • 既可以表示两个对象的内存地址是否相同,又可以表示值是否相同

NULL和“”的区别

NULL

  • 代表一个空对象
  • 除了=和==,一般不执行其他操作
  • String s=null;只是定义了一个句柄,也就是说你有了引用,但引用并未任何内存空间

“”

  • 代表一个对象实例,这个对象实例的值是一个长度为0的空字符串
  • 是一个空字符串,可以执行字符串里的方法
  • String s=””;这个引用已经指向了一块是空字符串的内存空间,可以对其进行任何操作

单引号和双引号

单引号

  • 单引号的数据是char类型
  • 只能引一个字符

双引号

  • 双引号的数据是string类型
  • 可以引0个及其以上

wait、sleep和Yield的区别

wait

  • Condition/Object的方法
  • 执行环境:同步代码块内
  • 是否释放持有的锁:释放
  • 调用后何时恢复:某个线程调用对应的nofity/signal方法唤醒后进入就绪状态

sleep

  • Thread的方法
  • 执行环境:任意位置
  • 是否释放持有的锁:不释放
  • 调用后何时恢复:指定时间后

Yield

  • Thread的方法
  • 执行环境:任意位置
  • 是否释放持有的锁:不释放
  • 调用后何时恢复:立即进入就绪状态

overload和override的区别

overload(重载)

  • 参数类型、个数、顺序至少有一个不相同;
  • 不能重载只有返回值不同的方法名;
  • 存在于父类和子类、同类中;

override(重写)

  • 方法名、参数、返回值相同
  • 子类方法不能缩小父类方法的访问权限
  • 子类方法不能抛出比父类更多的异常(但子类方法可以不抛出异常)
  • 存在于父类和子类之间
  • 方法被定义为final不能被重写

String、StringBuffer与StringBuilder之间区别

String

  • 字符串常量
  • 执行速度:最慢
  • 操作少量数据时使用

StringBuffer

  • 字符串变量
  • 执行速度:稍快
  • 多线程操作字符串缓冲区下大量数据时使用
  • 线程安全的

StringBuilder

  • 字符串变量
  • 执行速度:最快
  • 单线程操作字符串缓冲区下大量数据时使用
  • 线程非安全的

Collection 和 Collections的区别

Collection

  • 是一个集合接口(集合类的一个顶级接口)
  • 继承与他的接口主要有Set 和List
  • 它提供了对集合对象进行基本操作的通用接口方法

Collections

  • 是集合类的一个工具类/帮助类
  • 其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作

ArrayList,Vector, LinkedList的存储性能和特性

ArrayList

  • ArrayList 采用的是数组形式来保存对象的
  • 此数组元素数大于实际存储数据以便增加和插入元素
  • 允许直接用序号索引元素
  • 索引数据快而插入数据慢
  • 线程不安全的,不是同步的
  • 当需要增长时,ArrayList却是原来的一半

Vector

  • ArrayList 采用的是数组形式来保存对象的
  • 此数组元素数大于实际存储数据以便增加和插入元素
  • 允许直接用序号索引元素
  • 索引数据快而插入数据慢
  • 线程安全的,也就是说是同步的
  • 当需要增长时,Vector默认增长为原来一培

LinkedList

  • 使用双向链表方式存储数据
  • 按序号索引数据需要前向或后向遍历数据
  • 索引数据慢,插入的速度快

HashMap和Hashtable的区别

HashMap

  • 线程不安全
  • 允许有null的键和值
  • 效率高一点
  • 方法不是Synchronize的要提供外同步
  • 有containsvalue和containsKey方法
  • HashMap是Hashtable的轻量级实现

Hashtable

  • 线程安全
  • 不允许有null的键和值
  • 效率稍低
  • 方法是是Synchronize的
  • 有contains方法
  • Hashtable 比HashMap 要旧

final, finally, finalize的区别

final

  • 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承

finally

  • 是异常处理语句结构的一部分,表示总是执行

finalize

  • 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。

error和exception有什么区别?

error

  • Error类的父类都是throwable类
  • Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等
  • 对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

exception

  • Exception类的父类都是throwable类
  • Exception类表示程序可以处理的异常,可以捕获且可能恢复
  • 遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常

abstract class和interface有什么区别?

abstract class

  • 抽象类可以有构造方法
  • 抽象类中可以有普通成员变量
  • 抽象类中可以包含非抽象的普通方法
  • 抽象类中的抽象方法的访问类型可以是public,protected和默认类型
  • 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意
  • 抽象类类可以实现多个接口,但只能单继承

interface

  • 接口中不能有构造方法
  • 接口中没有普通成员变量
  • 接口中的所有方法必须都是抽象的,不能有非抽象的普通方法
  • 但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型
  • 但接口中定义的变量只能是public static final类型,并且默认即为public static final类型
  • 接口只可以继承一个或多个其它接口

正斜杠/和反斜杠\的区别

正斜杠/

  • 从右写到左(右倾)
  • 表示除法,如120/60 = 2;表示单位(除法的变形),如60km/h
  • 表示路径;Unix使用斜杆/ 作为路径分隔符;如果代表的是网络文件路径,则必须使用 正斜杠/

反斜杠\

  • 从左写到右(左倾)
  • 符表示转义字符,如\0表示“空字符”\r表示“回车”,\n表示“换行”等。
  • 表示路径;如果代表的是windows文件路径,则使用 正斜杠/和 反斜杠\是一样的