答 "区别” 类的问题时指导思想:
1、答区别之前,先答相同点
2、不论是相同点还是区别,都要分类答(分若干个小点)
1、在Java异常体系种,Error 与 Exception 的区别是什么?
相同
- 都是 java.lang.Throwable 类的子类
- 都用于处理程序运行中发生的特殊情况
区别
- 处理方式不同
- Error 通常无法在程序中予以处理,需要交给JVM来处理
- Exception 通常由程序员通过 throw 或 catch 等方式告知JVM如何处理
- 严重程度不同
- Error 表示由 JVM所无法预期的错误,是一种可能能恢复但恢复起来很困难的问题
- Exception 表示JVM可预期的,是一种可以捕获并由在程序中做出处理的特殊情况
2、简述 ArrayList 、Vector 、LinkedList 的异同
相同
- 都是 java.util.List 接口的实现类
- 都是有序、可排序、可重复的集合
- 都支持迭代器操作
区别
-
实现接口不同
- ArrayList 和 Vector 未实现 Queue 接口、Deque 接口,不支持队列操作
- LinkedList 实现了 Queue 接口 和 Deque 接口,支持队列操作,同时支持栈操作
- 自己翻看API查看 Queue 、Deque 接口中声明的方法
- 自己翻看API查看 LinkedList 中对栈操作的支持
-
内部实现不同
- ArrayList 内部采用数组来存储元素
- Vector 内部采用数组来存储元素
- LinkedList 内部采用 链表 来存储元素
-
线程安全
- ArrayList 非线程安全,适用于单线程环境
- Vector 线程安全,适用于多线程环境
- LinkedList 非线程安全,适用于单线程环境
-
扩容方式不同
- ArrayList 内部采用
倍数增长
的方式扩容 - Vector 内部采用
增加固定增量
的方式扩容 - LinkedList 内部采用链表实现,不需要扩容
- ArrayList 内部采用
-
增删效率不同
- ArrayList 和 Vector 内部采用数组实现,因此增删慢 (想想为什么?)
- LinkedList 内部采用链表实现,因此增删块 (想想为什么?)
-
是否支持随机访问
- ArrayList 和 Vector 内部采用数组实现,因此随机访问效率较高 (想想为什么?)
- LinkedList 内部采用链表实现,因此随机访问效率较低 (想想为什么?)
3、final 、finally 、finalize 的区别
相同
- 这三个词除了长的像,没有任何关系
区别
- final 关键字是个修饰符表示最终的、不可更改
- 被 final 修饰的类,没有子类
- 被 final 修饰的方法,不能被重写
- 被 final 修饰的变量,在初始化后不能再次赋值 (不能二次赋值)
- finally 关键字用于异常处理
- finally 不能单独使用,必须跟 try … 语句 或 try … catch 语句连用
- 程序运行时,不论是否发生异常,finally 代码块都会执行
- 除非遇到 System.exit 方法,否则 finally 代码块一定会执行
- finalize 是 Object 类中定义的一个实例方法
- finalize 方法是 Java 语言诞生之初为了向C++程序员妥协而提供的一个类似于C++中析构函数的方法
- finalize 方法不是析构函数!finalize 方法不是析构函数!finalize 方法不是析构函数!
- 当垃圾回收器(GC)执行垃圾回收操作时,可能会通过调用某个对象的 finalize 方法
- 当垃圾回收器(GC)调用某个对象的 finalize 方法时,可能导致该对象重新恢复到可触及状态,从而无法回收该对象所占用的内存
- 当垃圾回收器(GC)调用某个对象的 finalize 方法后,仍然没有任何引用变量再引用该对象,则GC会回收该对象所占用的内存
4、this 和 super 的区别
在 Java 语言中, 实例 和 对象 是一个概念。
相同
-
this 和 super 都表示实例的引用
- 因此 this 和 super 都不能出现在 static 区域
- this 和 super 都可以用于调用构造方法
- 当通过 this( [arguments] ) 或 super( [arguments] ) 调用构造方法时,它们必须位于构造方法的第一行
- 同一个构造方法内部 this( [arguments] ) 或 super( [arguments] ) 不能同时出现
区别
-
所表示实例不同
- this 表示本类的实例 ( 也就是当前实例 )
- super 表示父类的实例
-
调用的构造方法不同
- this 用于调用本类内部的其它重载的构造方法
- super 用于调用父类中的构造方法
-
访问的成员不同
- 通过
this.
可以访问本类中以及从父类中继承的、可见的 成员 ( 方法 和 属性(字段) ) - 通过
super.
可以访问从父类中继承的、可见的成员 ( 方法、字段(属性) )
- 通过
-
使用方式不同
this
关键字可以单独使用,比如 直接输出 this 或当作返回值this
关键字在本类中可以省略 ( 比如 getName 方法 中,return this.name;
可以写作return name ;
)super
关键字不可以单独使用,必须通过super( [arguments] )
或super.
形式来使用
5、HashMap 和 Hashtable 的区别
相同
- 两者都实现 Map 接口,用于存放
键-值对
- 内部都采用 哈希表 实现,都采用 哈希算法计算
键-值对
的存放位置
区别
-
是否支持线程安全
- HashMap 非线程安全,理论上效率较高
- Hashtable 线程安全,理论上效率较低
-
内部实现不同
- 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
- 当链表长度大于8时会自动转换成红黑树
- 当链表长度小于6时,红黑树重新转换成链表
- 而 Hashtable 内部则采用 数组 + 链表 实现
- 从 JDK 1.8 ( Java 8 ) 开始,HashMap 内部采用 数组 + 链表 + 红黑树 方式存储
-
对元素位置的计算方法不同
- HashMap 内部采用一个单独的方法根据 key.hashCode() 重新计算一个哈希值后再确定元素存放位置
- Hashtable 内部直接采用 key.hashCode() 来确定元素存放位置
-
两者所继承的类不同
- HashMap 类继承 AbstraceMap 类
- Hashtable 类继承 Dictionary 类
-
是否支持 null
- HashMap 支持 null 键 和 null 值
- Hashtable 不支持 null 键 和 null 值
6、String,StringBuffer与StringBuilder的异同
相同点
-
三者都继承自
java.lang.Object
类 -
StringBuilder与StringBuffer有公共父类AbstractStringBuilder(抽象类)
-
三者底层实现都是用数组实现的
-
都是CharSequence 的实现类
-
三者都是被final所修饰的类,不能被继承
不同点
-
可变与不可变
①String类中使用字符数组保存字符串,因为有“final”修饰符,所以可以知道string对象是不可变的。
②StringBuilder与StringBuffer都实现自AbstractStringBuilder类AbstractStringBuilder中也是使用字符数组保存字符串,可知这两种对象都是可变的。 -
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
-
是否多线程安全
①String中的对象是不可变的,也就可以理解为常量,显然线程安全。
②StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。③StringBuilder是线程不安全的
-
初始化上的区别
- String可以空赋值,StringBuilder与StringBuffer不可以,报错
7、队列Queue与栈Stack的异同
栈与队列的相同点:
1.都是线性结构。
2.插入操作都是限定在表尾进行。
3.都可以通过顺序结构和链式结构实现。、
4.插入与删除的时间复杂度都是O(1),在空间复杂度上两者也一样。
5.多链栈和多链队列的管理模式可以相同。
栈与队列的不同点:
1.删除数据元素的位置不同,栈的删除操作在表尾进行,队列的删除操作在表头进行。
2.应用场景不同;常见栈的应用场景包括括号问题的求解,表达式的转换和求值,函数调用和递归实现,深度优先搜索遍历等;常见的队列的应用场景包括计算机系统中各种资源的管理,消息缓冲器的管理和广度优先搜索遍历等。
3.顺序栈能够实现多栈空间共享,而顺序队列不能。
8、overload与voerride有何异同
9、类成员与实例成员有什么区别
异同 | 分类 | 类成员 | 实例成员 |
---|---|---|---|
相同点 | |||
不同点 | static修饰 | ||
调用规则 | |||
使用方式 | |||
初始化与生命周期 | 随着类的生死而生死 | 随着对象的生死而生死 | |
存储位置 | 元空间(1.8之前为方法区) | 堆区中 |
- 相同点
- 不同点
- 有无static修饰
- 存储位置
- 初始化与生命周期
- 调用规则使用方式
10、UDP与TCP的区别
1、连接方面区别
TCP面向连接(如打电话要先拨号建立连接)。
UDP是无连接的,即发送数据之前不需要建立连接。
2、安全方面的区别
TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达。
UDP尽最大努力交付,即不保证可靠交付。
3、传输效率的区别
TCP传输效率相对较低。
UDP传输效率高,适用于对高速传输和实时性有较高的通信或广播通信。
4、连接对象数量的区别
TCP连接只能是点到点、一对一的。
UDP支持一对一,一对多,多对一和多对多的交互通信。
TCP与UDP区别总结:
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。
3、UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
4.每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP对系统资源要求较多,UDP对系统资源要求较少。
扩展资料
TPC的可靠性
1.应用数据被分割成TCP认为最适合发送的数据块。这和UDP完全不同,应用程序产生的数据长度将保持不变。由TCP传递给IP的信息单位称为报文段或段(segment)。
2.当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段。当TCP收到发自TCP连接另一端的数据,它将发送一个确认。TCP有延迟确认的功能,在此功能没有打开,则是立即确认。功能打开,则由定时器触发确认时间点。
3.TCP将保持它首部和数据的检验和。这是一个端到端的检验和,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段(希望发端超时并重发)。
4.既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。如果必要,TCP将对收到的数据进行重新排序,将收到的数据以正确的顺序交给应用层。
11、iterator与iterable的区别
区别就是Iterable接口是专门创建新的迭代器的,Iterator接口是一个专门设计迭代器的。
12、List、Set、Map的区别
- List:
- 1.可以允许重复的对象。
- 2.可以插入多个null元素。
- 3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
- 4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。
- Set:
- 1.不允许重复对象
- 2.无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
- 3.只允许一个 null 元素
- 4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。
- Map:
- 1.Map不是collection的子接口或者实现类。Map是一个接口。
- 2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。
- 3.TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
- 4.Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
- 5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
13、什么场景下使用List,Set,Map(优缺点)呢?
- 如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
- 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
- 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
- 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
14、抽象类与接口的区别
异同 | 分类 | 抽象类 | 接口 |
---|---|---|---|
相同点 | 实例化 | 两者均不能实例化 | 两者均不能实例化 |
数据类型 | 两者都是引用类型 | 两者都是引用类型 | |
抽象方法 | 都可以包含抽象方法 | 都可以包含抽象方法 | |
不同点 | 有无构造 | 有 | 无 |
继承方式 | 单继承 | 多实现 | |
有无顶层父类 | 顶层父类为Object | 无顶层 | |
子类抽象方法访问权限 | 子类不能降低抽象方法的访问权限 | 子类抽象方法的访问权限必须为public |
15、throw与throws的区别
- throws`总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。
throw
总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的括号内的语句执行不到。throws
表示出现异常的一种可能性,并不一定会发生这些异常;throw
则是抛出了异常,执行throw则一定抛出了某种异常对象。
16、运行时异常和检查时异常的区别
- 运行时异常 ( Runtime Exception )
- 直接 或 间接 继承过
java.lang.RuntimeException
类的 异常类型 就都是 运行时异常 。 - 运行时异常 不会在编译阶段被编译器所检查,只有在运行阶段才有可能发生。
- 直接 或 间接 继承过
- 受检查异常 ( Checked Exception )
- 凡是没有继承过
java.lang.RuntimeException
类 异常类型都属于 受检查异常 。( 不论是直接还是间接,总之从来都没有继承过 ) - 受检查异常 是 编译器 在编译阶段就检查 程序员是否将这些异常正确处理的异常 ( 处理方式可以是 捕获 或 为方法添加 throws 声明 )。
- 如果在编译阶段存在尚未正确处理的 受检查异常 ,编译器会拒绝编译。
- 凡是没有继承过
17、TreeMap和TreeSet的异同
- 相同点:
- TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是排好序的。
- TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
- 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。
- 不同点:
- 最主要的区别就是TreeSet和TreeMap分别实现Set和Map接口
- TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)中不能有重复对象,而TreeMap中可以存在
- TreeMap的底层采用红黑树的实现,完成数据有序的插入,排序。
18、int与Integer的区别
区别的根据 | int | Integer | ||
相同 | 1 | 都用于存储整形数据 | ||
2 | 都可以存储42亿个整数,表示范围是正负21亿 | |||
区别 | 1 | 应用场景 | 大部分使用int | |
2 | 功能不同 | 临时存储 | 基本类型与引用类型的桥梁 | |
3 | 效率不同 | 基本数据类型。运行和开发效率高 | OOP的时候 | |
4 | 按数据类型分 | 基本数据类型 | 是引用数据类型,是int的包装类 | |
5 | 默认值 | 0 | null | |
6 | 存储空间 | 4字节 | 大于4字节 | |
扩展 |
19、Java流被分为字节流、字符流两大流类,两者有什么区别?
字节流的两个基类是InputStream和OutputStream,字符流的两个基类是Reader和Writer,它们都是Object类的直接子类,字节流是处理以8位字节为基本单位的字节流类;Reader和Writer类是专门处理16位字节的字符流类。
分类 | 字节流 | 字符流 | |
相同点 | 1、对文件读写 | ||
不同点 | 1、处理方式 | ||
20、Date和Calender类有什么区别和联系?
Date类用来表示某个特定的瞬间,能够精确到毫秒。而在实际应用中,往往需要把一个日期中的年、月、日等信息单独返回进行显示或处理,这个类中的大部分方法都已被标记过时。Calender类基本取代了Date类,该类中定义了一系列用于完成日期和时间字段操作的方法。
Calendar的getTime()方法,getTime()返回一个表示Calendar时间值的Date对象,同时Calendar有一个setTime(Date date)方法,setTime()方法接收一个Date对象,将Date对象表示的时间值设置给Calendar对象,通过这两个方法就可以完成Date和Calendar对象之间的转换。