抽象类和接口的区别
- 抽象类使用abstract关键字修饰;接口使用interface修饰。
- 抽象类中有构造方法(不写会有隐式构造方法),但不能实例化;接口没有构造方法。
- 抽象类中可以有非抽象方法,接口中一般只有抽象方法。
- 抽象类中可以有变量;接口中只能是常量
- 抽象类只能单继承类;接口可以继承多个接口
- 实现类只能继承一个抽象类;但可以实现多个接口
==和equals的区别
(1)对于基本数据类型,只能使用==比较其数值大小,equals()是Object类中的方法,只有引用数据类型才能使用,基本数据类型无法使用
(2)对于引用数据类型
(2.1)使用==比较的是两个引用对象的地址是否相同,即两个引用变量是不是指向同一个对象
(2.2)equals()方法用来比较对象的内容是否相同,比较的前提条件是自定义的类要重写equals()方法,因为Object类的equals()方法默认比较的是引用变量的地址
String和StringBuffer的区别
(1)String是内容不可变类,但其指向可以改变
(2)StringBuffer是内容可变类,适合于对字符串的频繁修改操作
StringBuffer和StringBuilder的区别
(1)StringBuffer和StringBuilder都是内容可变的字符串缓冲区,都适合于对字符串的频繁修改操作
(2)StringBuffer是老类,线程安全的(同步的),执行效率低
StringBuilder是新类,非线程安全的(异步的),执行效率高
throw和throws的区别
(1)throw出现在方法内部真实抛出一个异常对象
(2)throws出现在方法原型后面,声明该方法可能抛出的异常类型,可以有多个,用逗号分隔
何时使用捕获异常,何时使用抛出异常
(1)只抛不try
定义功能方法的功能实现本身没有问题,只是由于调用者传递的参数导致的错误,需要将异常抛出给调用者处理,而不要自行处理,这种情况叫只抛不try
(2)只try不抛
(2.1)在继承关系中,子类重写父类方法时,子类方法抛出的异常类型要小于或者等于父类方法抛出的异常类型,因此对于非父类异常及其子类,只能自行捕获并处理,这种情况也是
Thread类的run()方法不会抛出任何异常 public void run()
HttpServlet类的doGet()方法,只能抛出ServletException和IOException异常
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
(2.2)如果抛出的异常会影响到和用户的交互,这时就应该自行捕获并处理异常,而不要将异常抛到用户界面上
(3)实际开发中,两种方式可以结合使用,既在方法中捕获异常,以便记录日志信息,又将异常重新封装,再抛出给调用方去处理
final,finally,finalize的区别
(1)final是Java中的修饰符,表示最终的,可以用在类,属性,方法,局部变量,方法形参上
(2)finally是异常处理中的关键字,无论是否产生异常,都要执行finally块中的代码
(3)finalize是Object类的方法,该方法会在垃圾回收器回收对象前被调用
数组和集合的区别
相同点---都是引用类型数据,都能存储多个数据
不同点
(1)数组只能存储相同数据类型的数据,集合可以存放任意类型的数据,使用了泛型后,可以限定集合元素的数据类型
(2)数组中的元素可以是基本数据类型,集合中的元素都是引用数据类型
(3)数组长度一经定义后固定不变,集合长度可以动态改变
Collection接口和Collections类的区别
Collection接口是List和Set的父接口,用来存放单个元素的容器
Collections类是集合的实用类,提供集合操作的各种实用的静态方法
List,Set,Map三个接口的区别
List接口---元素有序,允许重复,可以按照索引随机访问元素
Set接口---元素无序,不允许重复,只能通过迭代器遍历元素
Map接口---存放键-值对的集合,键不允许重复,值允许重复,可以对键,值,以及键-值对所对应的集合进行迭代遍历
ArrayList和LinkedList的区别
ArrayList类---内部使用容量可变的动态数组表示,查找指定元素方便,对元素进行增删改麻烦
LinkedList类---内部使用双向循环链表表示,对元素进行增删改方便,查找指定元素麻烦
ArrayList和Vector的区别
ArrayList类---新类,不保证线程同步,以1.5倍增容
Vecor类---老类,保证线程同步,以2倍增容
HashSet和HashMap的区别
HashSet内部组合了一个的HashMap,该map对象的Key存储HashSet中元素,而Value存储一个无意义的哑对象
HashSet类中的方法都委托给内部的map对象执行
Hash/哈希/散列查找---基于地址值的查找,而不是基于内容的查找
HashSet和HashMap如何保证集合中的元素没有重复
HashSet和HashMap进行存取元素时都是基于哈希查找机制的,插入新的元素时,先比较要插入元素的hashCode在集合中是否存在,如果存在,再比较二者的内容是否相同(即调用equals()方法返回true),如果也相同,则认为集合中存在此元素,则不允许插入,否则允许插入
因此,自定义的类,如果需要保存在HashSet中,则必须重写hashCode()和equals()方法,才能保证集合中的元素不允许重复
HashMap和Hashtable的区别
HashMap类---新类,不保证线程同步,允许null键和null值
Hashtable类---老类,保证线程同步,不允许null键和null值
HashSet和TreeSet的区别
HashSet是Set接口的实现类,是基于哈希查找算法的无序的集合类
SortedSet接口是Set的子接口,可以实现自然排序或按照指定的比较器排序的功能
TreeSet是SortedSet接口的实现类,是基于排序二叉树算法的可排序的集合类
HashMap和TreeMap的区别
HashMap是Map接口的实现类,是基于哈希查找算法的映射类
SortedMap接口是Map的子接口,可以实现自然排序或按照指定的比较器排序的功能
TreeMap是SortedMap接口的实现类,是基于排序二叉树算法的可排序的映射类
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序
HashSet和LinkedHashSet的区别
LinkedHashSet是具有可预知迭代顺序的Set接口的哈希表和链接列表实现
此实现与HashSet的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代
此实现可以让客户避免未指定的、由HashSet提供的通常杂乱无章的排序工作,而又不致引起与TreeSet关联的成本增加
HashMap和LinkedMap的区别
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序
此实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)进行迭代
此实现可以让客户避免未指定的、由HashMap提供的通常为杂乱无章的排序工作,而又不致引起与TreeMap关联的成本增加