Java基础题

"区别” 类的问题时指导思想:

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 和 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 内部则采用 数组 + 链表 实现
  • 对元素位置的计算方法不同

    • 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之前为方法区)堆区中
  • 相同点
  • 不同点
  1. 有无static修饰
  2. 存储位置
  3. 初始化与生命周期
  4. 调用规则使用方式

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(优缺点)呢?

  1. 如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
  2. 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
  3. 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
  4. 如果你以键和值的形式进行数据存储那么 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的异同

  • 相同点:
  1. TreeMap和TreeSet都是有序的集合,也就是说他们存储的值都是排好序的。
  2. TreeMap和TreeSet都是非同步集合,因此他们不能在多线程之间共享,不过可以使用方法Collections.synchroinzedMap()来实现同步
  3. 运行速度都要比Hash集合慢,他们内部对元素的操作时间复杂度为O(logN),而HashMap/HashSet则为O(1)。
  • 不同点:
  1. 最主要的区别就是TreeSet和TreeMap分别实现Set和Map接口
  2. TreeSet只存储一个对象,而TreeMap存储两个对象Key和Value(仅仅key对象有序)中不能有重复对象,而TreeMap中可以存在
  3. TreeMap的底层采用红黑树的实现,完成数据有序的插入,排序。

18、int与Integer的区别

区别的根据intInteger
相同1都用于存储整形数据
2都可以存储42亿个整数,表示范围是正负21亿
区别1应用场景大部分使用int
2功能不同临时存储基本类型与引用类型的桥梁
3效率不同基本数据类型。运行和开发效率高OOP的时候
4按数据类型分基本数据类型是引用数据类型,是int的包装类
5默认值0null
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对象之间的转换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 建立三个线程,并且同时运行它们。当运行时输出线程的名称。 实验步骤: (1)、创建类sy6_1 (2)、创建三个线程,调用start()方法启动这三个线程 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 2. 实现3个类:Storage、Counter和Printer。 Storage类应存储整数。 Counter应创建线程,线程从0开始计数(0,1,2,3…)并将每个值存储到Storage类中。 Printer类应创建一个线程,线程读取Storage类中的值并打印值。编写程序创建Storage类的实例,并创建一个Counter对象和Printer对象操作此实例。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、保存文件,调试并编译运行程序。 参考程序运行效果: 3. 修改实验1第2的程序,添加适当代码,以确保每个数字都恰好只被打印一次。 实验步骤: (1)、创建三个类Counter, Printer,Storage (2)、 创建TestCounter类,在该类中定义main函数,在main函数中定义Storage对象、Counter1对象和 Printer对象,创建Counter线程和Printer线程并启动 (3)、在定义Storage类中的setValue(int i) 和getValue ()方法时使用synchronized关键字,将其定义为同步方法 (4)、保存文件,调试并编译运行程序。 参考程序运行效果:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值