爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      Java Web高级面试题(一)

      首页 知识中心 软件开发 文章详情页

      Java Web高级面试题(一)

      2025-01-14 09:12:33 阅读次数:14

      Java,字节,对象,异常,抽象类,接口,方法

      Q1. instanceof 关键字的作用

      instanceof其实是一种符号,它和我们常见的=、>、<等是同一类的,都是一种运算表达符号,但是它和其他的符号不同的就是他是一个由多个英文字母组成的,它是在java、php里面常用的一个二元操作符,是Java的保留关键字,主要作用就是来判断左边的对象是否是它右边对象的实例。

      Q2. try catch finally,try里有return,finally还执行么?

      执行,并且finally的执行早于try里面的return
      结论:
      1、不管有木有出现异常,finally块中代码都会执行;
      2、当try和catch中有return时,finally仍然会执行;
      3、finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,任然是之前保存的值),所以函数返回值是在finally执行前确定的;
      4、finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值。

      Q3. Excption与Error包结构

      Java可抛出(Throwable)的结构分为三种类型:被检查的异常(CheckedException),运行时异常(RuntimeException),错误(Error)。

      1、运行时异常
      定义:RuntimeException及其子类都被称为运行时异常。
      特点:Java
      编译器不会检查它。

      2、被检查异常
      定义:Exception类本身,以及Exception的子类中除了"运行时异常"之外的其它子类都属于被检查异常。
      特点 : Java编译器会检查它。 此类异常,要么通过throws进行声明抛出,要么通过try-catch进行捕获处理,否则不能通过编译。例如,CloneNotSupportedException就属于被检查异常。当通过clone()接口去克隆一个对象,而该对象对应的类没有实现Cloneable接口,就会抛出CloneNotSupportedException异常。被检查异常通常都是可以恢复的。

      3、错误
      定义 : Error类及其子类。
      特点 : 和运行时异常一样,编译器也不会对错误进行检查。

      当资源不足、约束失败、或是其它程序无法继续运行的条件发生时,就产生错误。程序本身无法修复这些错误的。例如,VirtualMachineError就属于错误。出现这种错误会导致程序终止运行。
      OutOfMemoryError、ThreadDeath。
      Java虚拟机规范规定JVM的内存分为了好几块,比如堆,栈,程序计数器,方法区等

      Q4. OOM你遇到过哪些情况,SOF你遇到过哪些情况

      OOM:
      1,OutOfMemoryError异常
      除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。
      Java Heap 溢出:
      一般的异常信息:java.lang.OutOfMemoryError:Java heap spacess。
      java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,就会在对象数量达到最大堆容量限制后产生内存溢出异常。
      出现这种异常,一般手段是先通过内存映像分析工具(如Eclipse Memory Analyzer)对dump出来的堆转存快照进行分析,重点是确认内存中的对象是否是必要的,先分清是因为内存泄漏(Memory Leak) 还是内存溢出(Memory Overflow)。
      如果是内存泄漏,可进一步通过工具查看泄漏对象到GCRoots的引用链。于是就能找到泄漏对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收。
      如果不存在泄漏,那就应该检查虚拟机的参数(-Xmx与-Xms)的设置是否适当。

      2,虚拟机栈和本地方法栈溢出
      如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError异常。
      如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常
      这里需要注意当栈的大小越大可分配的线程数就越少。

      3,运行时常量池溢出
      异常信息:java.lang.OutOfMemoryError:PermGenspace
      如果要向运行时常量池中添加内容,最简单的做法就是使用String.intern()这个Native方法。该方法的作用是:如果池中已经包含一个等于此String的字符串,则返回代表池中这个字符串的String对象;否则,将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用。由于常量池分配在方法区内,我们可以通过-XX:PermSize和-XX:MaxPermSize限制方法区的大小,从而间接限制其中常量池的容量。

      4,方法区溢出
      方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等。也有可能是方法区中保存的class对象没有被及时回收掉或者class信息占用的内存超过了我们配置。
      异常信息:java.lang.OutOfMemoryError:PermGenspace
      方法区溢出也是一种常 的内存溢出异常,一个类如果要被垃圾收集器回收,判定条件是很苛刻的。在经常动态生成大量Class的应用中,要特别注意这点。
      SOF(堆栈溢出StackOverflow):
      StackOverflowError 的定义:当应用程序递归太深而发生堆栈溢出时,抛出该错误。
      因为栈一般默认为1-2m,一旦出现死循环或者是大量的递归调用,在不断的压栈过程中,造成栈容量超过1m而导致溢出。
      栈溢出的原因:递归调用,大量循环或死循环,全局变量是否过多,数组、List、map数据过大。

      Q5. Java自动装箱与拆箱

      装箱就是自动将基本数据类型转换为包装器类型(int–>Integer);调用方法:Integer的 valueOf(int) 方法
      拆箱就是自动将包装器类型转换为基本数据类型(Integer–>int)。调用方法:Integer的intValue方法

      Q6. 重载和重写的区别

      方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的参数列表,有兼容的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求,不能根据返回类型进行区分。

      Q7. "深拷"和"浅拷"的区别是什么?

      浅拷 :被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅拷 仅仅复制所考虑的对象,而不复制它所引用的对象.

      深拷 :被复制对象的所有变量都含有与原来的对象相同的值.而那些引用其他对象的变量将指向被复制过的新对象.而不再是原有的那些被引用的对象.换言之.深拷 把要复制的对象所引用的对象都复制了一遍.

      Q8. Java IO与 NIO的区别

      NIO是以块的方式处理数据,但是IO是以最基础的字节流的形式去写入和读出的。所以在效率上的话,肯定是NIO效率比IO效率会高出很多。
      NIO不在是和IO一样用OutputStream和InputStream 输入流的形式来进行处理数据的,但是又是基于这种流的形式,而是采用了通道和缓冲区的形式来进行处理数据的。
      还有一点就是NIO的通道是可以双向的,但是IO中的流只能是单向的。
      还有就是NIO的缓冲区(其实也就是一个字节数组)还可以进行分片,可以建立只读缓冲区、直接缓冲区和间接缓冲区,只读缓冲区很明显就是字面意思,直接缓冲区是为加快 I/O 速度,而以一种特殊的方式分配其内存的缓冲区。

      补充一点:NIO比传统的BIO核心区别就是,NIO采用的是多路复用的IO模型,普通的IO用的是阻塞的IO模型,两个之间的效率肯定是多路复用效率更高

      Q9. Java 中 IO 流

      Java 中 IO 流分为:
      按照流的流向分,可以分为输入流和输出流;
      按照操作单元划分,可以划分为字节流和字符流;
      按照流的⻆色划分为节点流和处理流。

      InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
      OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。

      常用的IO流:
      1、字符流FileReader和FileWriter
      2、字符缓冲流BufferedReader和BufferedWriter
      3、字节流FileInputStream和FileOutputStream
      4、字节缓冲流BufferedInputStream和BufferedOutputStream
      5、转换流:InputStreamReader和OutputStreamWriter
      InputStreamReader和OutputStreamWriter是字符和字节的桥梁,也可称之为字符转换流。原理:字节流+编码。

      Q10. 获取Class对象的方法

      1)Class.forName(“类的路径”);
      2)类名.class
      3)对象名.getClass()
      4)基本类型的包装类,可以调用包装类的Type属性来获得该包装类的Class对象

      Q11. Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

      Java中的方法重载发生在同一个类里面两个或者是多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。覆盖者可能不会限制它所覆盖的方法的访问。

      Q12. Java中,什么是构造方法?什么是构造方法重载?什么是复制构造方法?

      当新对象被创建的时候,构造方法会被调用。每一个类都有构造方法。在程序员没有给类提供构造方法的情况下,Java编译器会为这个类创建一个默认的构造方法。
      Java中构造方法重载和方法重载很相似。可以为一个类创建多个构造方法。每一个构造方法必须有它自己唯一的参数列表。
      Java不支持像C++中那样的复制构造方法,这个不同点是因为如果你不自己写构造方法的情况下,Java不会创建默认的复制构造方法。

      Q13. Java支持多继承么?

      Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 但是java中的接口支持多继承,,即一个子接口可以有多个父接口。(接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能,当类实现接口时,类就扩展了相应的功能)。

      Q14. 接口和抽象类的区别是什么?也可以参考JDK8中抽象类和接口的区别。

      从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。
      Java提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:
      接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。
      类可以实现很多个接口,但是只能继承一个抽象类
      类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。
      抽象类可以在不提供接口方法实现的情况下实现接口。
      Java接口中声明的变量默认都是final的。抽象类可以包含非final的变量。
      Java接口中的成员函数默认是public的。抽象类的成员函数可以是private,protected或者是public。
      接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,但是,如果它包含main方法的话是可以被调用的。

      Q15. 抽象类(abstract class)和接口(interface)有什么异同?

      抽象类和接口都不能够实例化,但可以定义抽象类和接口类型的引用。一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类。接口比抽象类更加抽象,因为抽象类中可以定义构造器,可以有抽象方法和具体方法,而接口中不能定义构造器而且其中的方法全部都是抽象方法。抽 象类中的成员可以是 private、默认、protected、 public 的,而接口中的成员全都是 public 的 。抽象类中可以定义成员变量,而接口中定义的成员变量实际上都是常量。有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法。

      Q16. 抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被 synchronized修饰?

      都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如 C 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

      Q17. try{}里有一个 return 语句,那么紧跟在这个 try 后的finally{}里的代码会不会被执行,什么时候被执行,在 return前还是后?

      会执行,在方法返回调用者前执行。

      Q18. Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别如何使用?

      Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。 在 Java 中,每个异常都是一个对象,它是 Throwable 类或其子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并可以对其进行处理。 Java 的异常处理是通过 5 个关键词来实现的: try、 catch、 throw、 throws 和 finally。 一般情况下是用 try 来执行一段程序,如果系统会抛出( throw)一个异常对象,可以通过它的类型来捕获( catch)它,或通过总是执行代码块( finally)来处理; try 用来指定一块预防所有异常的程序;catch 子句紧跟在 try 块后面,用来指定你想要捕获的异常的类型; throw 语句用来明确地抛出一个异常; throws 用来声明一个方法可能抛出的各种异常(当然声明异常时允许无病呻吟); finally 为确保一段代码不管发生什么异常状况都要被执行; try 语句可以嵌套,每当遇到一个 try 语句,异常的结构就会被放入异常栈中,直到所有的 try 语句都完成。如 果下一级的 try 语句没有对某种异常进行处理,异常栈就会执行出栈操作,直到遇到有处理这种异常的 try 语句或者最终将异常抛给 JVM。

      Q19. 运行时异常与受检异常有何异同?

      异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误,只要程序设计得没有问题通常就不会发生。受检异常跟程序运行的上下文环境有关,即使程序设计无误,仍然可能因使用的问题而引发。Java 编译器要求方法必须声明抛出可能发生的受检异常,但是并不要求必须声明抛出未被捕获的运行时异常。异常和继承一样,是面向对象程序设计中经常被滥用的东西,在 Effective Java中对异常的使用给出了以下指导原则:

      1. 不要将异常处理用于正常的控制流(设计良好的 API 不应该强迫它的调用者为了正常的控制流而使用异常)
      2. 对可以恢复的情况使用受检异常,对编程错误使用运行时异常
      3. 避免不必要的使用受检异常(可以通过一些状态检测手段来避免异常的发生)
      4. 优先使用标准的异常
      5. 每个方法抛出的异常都要有文档
      6. 保持异常的原子性
      7. 不要在 catch 中忽略掉捕获到的异常

      Q20. 列出一些你常见的运行时异常?

      ArithmeticException(算术异常)
      ClassCastException (类转换异常)
      IllegalArgumentException (非法参数异常)
      IndexOutOfBoundsException (下标越界异常)
      NullPointerException (空指针异常)
      SecurityException (安全异常)

      Q21. Java 中有几种类型的流?

      字节流和字符流。 字节流继承于 InputStream、OutputStream,字符流继承于Reader、 Writer。 在 java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。关于 Java 的 I/O 需要注意的有两点:一是两种对称性(输入和输出的对称性,字节和字符的对称性);二是两种设计模式(适配器模式和装潢模式)。

      Q22. 什么是 DAO 模式?

      DAO( Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共 API 中。用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。 DAO 模式实际上包含了两个模式,一是 Data Accessor(数据访问器),二是 Data Object(数据对象),前者要解决如何访问数据的问题,而后者要解决的是如何用对象封装数据。

      Q23. Java中的构造器链是什么?

      当你从一个构造器中调用另一个构造器,就是 Java 中的构造器链。这种情况只在重载了类的构造器的时候才会出现。

      Q24. 说出 5 条 IO 的最佳实践

      a)使用有缓冲区的IO类,而不要单独读取字节或字符 。
      b)使用NIO和NIO2
      c)在finally块中关闭流,或者使用try-with-resource语句 。
      d)使用内存映射文件获取更快的IO。

      Q25. 说出几条 Java 中方法重载的最佳实践?

      a)不要重载这样的方法:一个方法接收 int 参数,而另个方法接收 Integer 参数。
      b)不要重载参数数量一致,而只是参数顺序不同的方法 。
      c)如果重载的方法参数个数多于5个,采用可变参数 。

      Q26. 在多线程环境下,SimpleDateFormat 是线程安全的吗?

      不是,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。 如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,推荐 joda-time 库。

      Q27. 接口是什么?为什么要使用接口而不是直接使用具体类?

      接口用于定义 API。它定义了类必须得遵循的规则。同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使用可随机访问的 ArrayList,也可以使用方便插入和删除的 LinkedList。 接口中不允许写代码,以此来保证抽象,但是 Java 8 中你可以在接口声明静态的默认方法,这种方法是具体的。

      Q28. Java 中,抽象类与接口之间有什么不同?

      Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个类只能继承一个类,但是可以实现多个接口。抽象类可以很好的定义一个家族类的默认行为,而接口能更好的定义类型,有助于后面实现多态机制。

      Q29. 抽象类是什么?它与接口有什么区别?你为什么要使用过抽象类?

      接口用于规范,抽象类用于共性.
      声明方法的存在而不去实现它的类被叫做抽象类
      接口( interface)是抽象类的变体。 在接口 中 , 所有方法都是抽象的。

      Q30. OOP 中的组合、聚合和关联有什么区别?

      如果两个对象彼此有关系,就说他们是彼此相关联的。组合和聚合是面向对象中的两种形式的关联。组合是一种比聚合更强力的关联。组合中,一个对象是另一个的拥有者,而聚合则是指一个对象使用另一个对象。如果对象 A 是由对象 B组合的,则 A 不存在的话,B 一定不存在,但是如果 A 对象聚合了一个对象 B,则即使 A 不存在了,B 也可以单独存在。

      Q31. Java 中,throw 和 throws 有什么区别

      throw 用于抛出 java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个 Exception,如:
      throw new IllegalArgumentException(“size must be multiple of 2″)
      而 throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。 Java 中,任何未处理的受检查异常强制在 throws 子句中声明。

      Q32. Java 中,Serializable 与 Externalizable 的区别?

      Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。 Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。

      Q33. Java 中,DOM 和 SAX 解析器有什么不同?

      DOM 解析器将整个 XML 文档加载到内存来创建一棵 DOM 模型树,这样可以更快的查找节点和修改 XML 结构,而 SAX 解析器是一个基于事件的解析器,不会将整个 XML 文档加载到内存。由于这个原因,DOM 比 SAX 更快,也要求更多的内存,不适合于解析大 XML 文件。

      Q34. Java 中,Maven 和 ANT 有什么区别?

      虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多,在基于“ 约定优于配置 ”的概念下,提供标准的 Java 项目结构,同时能为应用自动管理依赖(应用中所依赖的 JAR 文件)

      Q35. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

      是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以通过传引用或传输出参数来改变传入的参数的值。说明:Java 中没有传引用实在是非常的不方便,这一点在 Java 8 中仍然没有得到改进,正是如此在 Java 编写的代码中才会出现大量的 Wrapper 类(将需要通过方法调用修改的引用置于一个 Wrapper 类中,再将 Wrapper 对象传入方法),这样的做法只会让代码变得臃肿,尤其是让从 C 和 C++转型为 Java 程序员的开发者无法容忍。

      Q36. 重载(overload)和重写(override)的区别?重载的方法能否根据返回类型进行区分?

      方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。重载对返回类型没有特殊的要求。

      方法重载的规则:
      1.方法名一致,参数列表中参数的顺序,类型,个数不同。
      2.重载与方法的返回值无关,存在于父类和子类,同类中。
      3.可以抛出不同的异常,可以有不同修饰符。

      方法重写的规则:
      1.参数列表必须完全与被重写方法的一致,返回类型必须完全与被重写方法的返回类型一致。
      2.构造方法不能被重写,声明为final 的方法不能被重写,声明为 static 的方法不能被重写,但是能够被再次声明。
      3.访问权限不能比父类中被重写的方法的访问权限更低。
      4.重写的方法能够抛出任何非强制异常(UncheckedException,也叫非运行时异常),无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。

      Q37. 抽象类(abstract class)和接口(interface)有什么异同?

      不同:
      抽象类:
      1.抽象类中可以定义构造器
      2.可以有抽象方法和具体方法
      3.接口中的成员全都是public 的
      4.抽象类中可以定义成员变量
      5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法
      6.抽象类中可以包含静态方法
      7.一个类只能继承一个抽象类

      接口:
      1.接口中不能定义构造器
      2.方法全部都是抽象方法
      3.抽象类中的成员可以是 private、默认、protected、public
      4.接口中定义的成员变量实际上都是常量
      5.接口中不能有静态方法
      6.一个类可以实现多个接口

      相同:
      1.不能够实例化
      2.可以将抽象类和接口类型作为引用类型
      3.一个类如果继承了某个抽象类或者实现了某个接口都需要对其中的抽象方法全部进行实现,否则该类仍然需要被声明为抽象类

      Q38. 抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法(native),是否可同时被 synchronized

      都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如 C 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

      Q39. 字节流如何转为字符流

      节输入流转字符输入流通过 InputStreamReader 实现,该类的构造函数可以传入 InputStream 对象。
      字节输出流转字符输出流通过OutputStreamWriter 实现,该类的构造函数可以传入 OutputStream 对象。

      Q40. 字节流和字符流的区别

      字节流读取的时候,读到一个字节就返回一个字节; 字符流使用了字节流读到一个或多个字节(中文对应的字节数是两个,在 UTF-8 码表中是 3 个字节)时。先去查指定的编码表,将查到的字符返回。 字节流可以处理所有类型数据,如:图片,MP3,AVI 视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。字节流主要是操作 byte 类型数据,以 byte 数组为准,主要操作类就是 OutputStream、 InputStream

      字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。所以字符流是由 Java 虚拟机将字节转化为 2 个字节的 Unicode 字符为单位的字符而成的, 所以它对多国语言支持性比较好!如果是音频文件、图片、歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点。在程序中一个字符等于两个字节,java 提供了 Reader、Writer 两个专门操作字符流的类。

      Q41. 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main 方法?

      接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承具体类。抽象类中可以有静态的main 方法。

      备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答,你想想,如果你是 java 语言的设计者,你是否会提供这样的支持,如果不提供的话,有什么理由吗?如果你没有道理不提供,那答案就是肯定的了。

      只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有 abstract 方法。

      Q42. java 中实现多态的机制是什么?

      靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

      Q43 Java支持多继承么?

      不支持, Java 不支持多继承。每个类都只能继承一个类,但是可以实现多个接口。

      Q44. 异常处理的时候,finally代码块的重要性是什么?

      无论是否抛出异常,finally代码块总是会被执行。就算是没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。最后要说的是,finally代码块主要用来释放资源,比如: I/O 缓冲区,数据库连接。

      Q45. 异常处理完成以后,Exception对象会发生什么变化?

      Exception对象会在下一个垃圾回收过程中被回收掉。

      Q46. ArrayList和linkedList的区别

      Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。
      Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移)。
      缺点: 数组初始化必须指定初始化的长度, 否则报错
      例如:
      int[] a = new int[4];//推介使用int[] 这种方式初始化
      int c[] = {23,43,56,78};//长度:4,索引范围:[0,3]

      List―是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。
      List有两个重要的实现类:ArrayList和LinkedList
      ArrayList: 可以看作是能够自动增 容量的数组
      ArrayList的toArray方法返回一个数组
      ArrayList的asList方法返回一个列表
      ArrayList底层的实现是Array, 数组扩容实现

      LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。

      Q47. HashMap和HashTable的区别

      1、两者父类不同
      HashMap是继承自AbstractMap类,而Hashtable是继承自Dictionary类。不过它们都实现了同时实现了map、Cloneable(可复制)、Serializable(可序列化)这三个接口。

      2、对外提供的接口不同
      Hashtable比HashMap多提供了elments() 和contains() 两个方法。
      elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。
      contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。
      3、对null的支持不同
      Hashtable:key和value都不能为null。
      HashMap:key可以为null,但是这样的key只能有一个,因为必须保证key的唯一性;可以有多个key值对应的value为null。

      4、安全性不同
      HashMap是线程不安全的,在多线程并发的环境下,可能会产生死锁等问题,因此需要开发人员自己处理多线程的安全问题。
      Hashtable是线程安全的,它的每个方法上都有synchronized 关键字,因此可直接用于多线程中。
      虽然HashMap是线程不安全的,但是它的效率远远高于Hashtable,这样设计是合理的,因为大部分的使用场景都是单线程。当需要多线程操作的时候可以使用线程安全的ConcurrentHashMap。
      ConcurrentHashMap虽然也是线程安全的,但是它的效率比Hashtable要高好多倍。因为ConcurrentHashMap使用了分段锁,并不对整个数据进行锁定。

      5、初始容量大小和每次扩充容量大小不同
      6、计算hash值的方法不同

      Q48. Collection包结构,与Collections的区别

      Collection是集合类的上级接口,子接口有 Set、List、LinkedList、ArrayList、Vector、Stack、Set;
      Collections是集合类的一个帮助类, 它包含有各种有关集合操作的静态多态方法,用于实现对各种集合的搜索、排序、线程安全化等操作。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

      Q49. 泛型常用特点

      泛型是Java SE 1.5之后的特性, 《Java 核心技术》中对泛型的定义是:
      “泛型” 意味着编写的代码可以被不同类型的对象所重用。
      “泛型”,顾名思义,“泛指的类型”。我们提供了泛指的概念,但具体执行的时候却可以有具体的规则来约束,比如我们用的非常多的ArrayList就是个泛型类,ArrayList作为集合可以存放各种元素,如Integer, String,自定义的各种类型等,但在我们使用的时候通过具体的规则来约束,如我们可以约束集合中只存放Integer类型的元素,如
      List iniData = new ArrayList<>()

      使用泛型的好处:
      以集合来举例,使用泛型的好处是我们不必因为添加元素类型的不同而定义不同类型的集合,如整型集合类,浮点型集合类,字符串集合类,我们可以定义一个集合来存放整型、浮点型,字符串型数据,而这并不是最重要的,因为我们只要把底层存储设置了Object即可,添加的数据全部都可向上转型为Object。 更重要的是我们可以通过规则按照自己的想法控制存储的数据类型。

      Q50. Java创建对象有几种方式?

      java中提供了以下四种创建对象的方式:

      1. new创建新对象
      2. 通过反射机制
      3. 采用clone机制
      4. 通过序列化机制

      Q51. 有没有可能两个不相等的对象有相同的hashcode

      有可能.在产生hash冲突时,两个不相等的对象就会有相同的 hashcode 值.当hash冲突产生时,一般有以下几种方式来处理:
      拉链法:每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,被分配到同一个索引上的多个节点可以用这个单向链表进行存储.
      开放定址法:一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入
      再哈希:又叫双哈希法,有多个不同的Hash函数.当发生冲突时,使用第二个,第三个….等哈希函数计算地址,直到无冲突.

      Q52. final有哪些用法?

      用法:

      1. 被final修饰的类不可以被继承
      2. 被final修饰的方法不可以被重写
      3. 被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被final修饰的方法,JVM会尝试将其内联,以提高运行效率被final修饰的常量,在编译阶段会存入常量池中.

      除此之外,编译器对final域要遵守的两个重排序规则更好:

      1. 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序
      2. 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序.
      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://hh419.blog.csdn.net/article/details/128459930,作者:Java Fans,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:Java 编译错误: java.lang.ExceptionInInitializer com.sun.tools.javac.code.TypeTags

      下一篇:高频 Java 基础问题(核心卷一)

      相关文章

      2025-05-19 09:04:44

      js小题2:构造函数介绍与普通函数对比

      js小题2:构造函数介绍与普通函数对比

      2025-05-19 09:04:44
      new , 关键字 , 函数 , 对象 , 构造函数
      2025-05-19 09:04:38

      ORA-19910 异常

      ORA-19910 异常

      2025-05-19 09:04:38
      ORA , 异常
      2025-05-19 09:04:22

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22
      使用 , 函数 , 初始化 , 定义 , 对象
      2025-05-19 09:04:22

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      2025-05-19 09:04:22
      对象 , 温度
      2025-05-16 09:15:24

      jQuery遍历对象、数组、集合

      jQuery遍历对象、数组、集合

      2025-05-16 09:15:24
      jQuery , 对象 , 数组 , 遍历 , 集合
      2025-05-14 10:33:31

      计算机初级选手的成长历程——操作符详解(2)

      计算机初级选手的成长历程——操作符详解(2)

      2025-05-14 10:33:31
      对象 , 操作 , 操作符 , 表达式 , 运算 , 逗号 , 逻辑
      2025-05-14 10:33:25

      超级好用的C++实用库之网络

      在网络相关的项目中,我们经常需要去获取和设置设备的IP地址、子网掩码、网关地址、MAC地址等信息。这些信息一般与操作系统相关,在Windows系统和Linux系统上调用的接口是不一样的。

      2025-05-14 10:33:25
      Linux , 参数 , 地址 , 接口 , 网卡 , 返回值
      2025-05-14 10:33:16

      30天拿下Python之使用Json

      Json的英文全称为JavaScript Object Notation,中文为JavaScript对象表示法,是一种存储和交换文本信息的语法,类似XML。Json作为轻量级的文本数据交换格式,比XML更小、更快,更易解析,也更易于阅读和编写。

      2025-05-14 10:33:16
      json , Json , Python , 字符串 , 对象 , 序列化 , 转换
      2025-05-14 10:33:16

      30天拿下Rust之字符串

      在Rust中,字符串是一种非常重要的数据类型,用于处理文本数据。Rust的字符串是以UTF-8编码的字节序列,主要有两种类型:&str和String。其中,&str是一个对字符数据的不可变引用,更像是对现有字符串数据的“视图”,而String则是一个独立、可变更的字符串实体。

      2025-05-14 10:33:16
      amp , Rust , str , String , 使用 , 字符串 , 方法
      2025-05-14 10:33:16

      30天拿下Rust之向量

      在Rust语言中,向量(Vector)是一种动态数组类型,可以存储相同类型的元素,并且可以在运行时改变大小。向量是Rust标准库中的一部分,位于std::vec模块中。

      2025-05-14 10:33:16
      Rust , 使用 , 元素 , 向量 , 方法 , 索引 , 迭代
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5246699

      查看更多

      最新文章

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22

      外设驱动库开发笔记46:MAX31855热偶变送器驱动

      2025-05-19 09:04:22

      超级好用的C++实用库之网络

      2025-05-14 10:33:25

      30天拿下Rust之向量

      2025-05-14 10:33:16

      30天拿下Python之使用Json

      2025-05-14 10:33:16

      arm架构下JAVA开发

      2025-05-14 10:03:13

      查看更多

      热门文章

      Java线程同步synchronized wait notifyAll

      2023-04-18 14:15:05

      JAVA__接口的作用

      2023-04-18 14:14:13

      Java/Android Annotation注解/注入(二)

      2023-04-13 09:37:00

      Android/Java判断字符串String是否为float浮点数或double类型

      2023-04-17 09:39:54

      Java小数点数字和百分号数字之间的转换

      2023-04-13 09:48:57

      Java的自带注解Annotation(一)

      2023-05-10 06:02:06

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      初学Java,对象的软,弱和虚引用(二十三)

      java中的线程模型和线程池

      java9系列第二篇-资源自动关闭的语法增强

      WebAPi接口安全之公钥私钥加密

      Java IO:概念和分类总结

      【JavaSE】作用域

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号