【问答篇】Java 基础篇 面试题(二)

news2024/11/15 3:29:56

 每天进步一点~

01、问:PreparedStatement与Statement的区别?

答:

  1. PreparedStatement是预编译语句执行者,数据库对sql语句进行预编译;Statement是执行时对sql语句进行编译

  2. Statement存在sql注入的问题,PreparedStatement解决了这个问题

  3. PreparedStatement的执行效率比Statement高

  4. PreparedStatement中使用?占位符,设置参数更方便

02、问:Java中的HashMap的工作原理是什么?

答:HashMap的原理是:数组+链表

HashMap类有一个叫Entry的内部类。这个Entry类包含了key-value作为实例变量。根据key的hashcode方法计算出hash值来决定具体在哪个位置,如果这个位置有值,则调用equals方法进行判断,如果equals相等则替换,如果equals不等则追加到链表后。

  • 1.7采用头插法,元素每次插入到链表头部,当扩容时,会发生链表反转,容易产生循环链表,多线程情况下可能发生死锁。
  • 1.8采用尾插法,元素每次插入到链表尾部,扩容不会发生反转,解决了死锁问题。数组+链表+红黑树。当链表长度超过8时转为红黑树。

03、问:线程的sleep()方法和yield()方法有什么区别?

答:

  1. sleep()会给比它优先级低的线程机会,yield()方法只会给跟它同等级或比它优先级高的线程机会

  2. 执行sleep后进入阻塞状态,执行yield后进入就绪

  3. sleep方法声明抛出InterruptedException异常,yield没有声明抛出任何异常

  4. sleep比yield方法具有更好的移植性

04、问:什么是序列化,如何实现序列化? 

答:

序列化机制(包括序列化和反序列化)的本质是用流将对象读到内存和写入外存。序列化机制的意义就是将对象脱离程序运行独立存在

应用场景是在RMI(远程方法调用)中应用,即通过网路或跨平台传输对象,而RMI是javaEE开发基础,所以javaEE要求传递的参数与返回值都实现序列化机制

  • 序列化是用流将java对象转成二进制写入硬盘或网络
  • 序列化是用流将二进制数据转为java对象写入内存

实现序列化需要实现Serializable或Externalizable接口,如果某个成员变量是引用数据类型,那么要求该引用类也是可序列化的。如果类中每个成员变量不想被序列化,可以用transient关键字修饰。

序列化通常与IO中的ObjectInputStream(readObject方法)和ObjectOutputStream(writeObject方法)搭配使用

05、问:什么是单例模式?

答:单例模式是指一个类只创建一个实例。单例模式是经常用到的一种设计模式,

它分为饿汉式、懒汉式、静态内部类、枚举;

饿汉式:在类加载时就创建本类对象为私有静态常量,构造方法写成私有的,使用共有静态方法代替构造方法获取到这个单例

懒汉式:在饿汉式的基础上给静态方法加synchronized,在方法里判断本类对象是否为空,为空时创建。

静态内部类:将单例放在静态内部类中,避免在类加载的时候就创建对象,然后用静态方法代替私有构造

06、问:对象的深拷贝与浅拷贝?

答:对象的深拷贝是在拷贝时把这个对象复制一份,如果这个对象所属的类中有引用数据类型,也会将引用该类复制一份,以达到深度克隆,这样的话,一个改变了它的值不会影响另一个

实现深拷贝的方法:

  1. 覆盖Object的clone方法

  2. 通过序列化方式实现深拷贝 

对象的浅克隆是在拷贝时把这个对象复制一份,但如果这个对象所属的类中有引用数据类型,这个引用还指向原来的引用。

例如:从A拷贝一份B,如果是深克隆,A和B是俩个独立的对象,只不过一模一样。如果是浅克隆,如果A中有引用类型,那么B中此引用类型和A中此引用类型指向的是同一块地址。

07、问:java8新特性有哪些?

答:

  1. lambda表达式

  2. 函数式接口

  3. 重复注解

  4. 接口中的默认方法和静态方法

  5. stream

08、问:什么是反射?

答:反射是在运行时动态的获取类的信息,获取Class对象有三种方法:类名.class、对象名.getClass()、Class.forName(“权限定名”)

获取到类对象后可以用newInstance()创建对象,Class类中API提供了获取属性、方法、构造器的方法。

09、问:JVM内存结构?

答:JVM内存结构包括:堆、虚拟机栈、本地方法栈、程序计数器、方法区

:存放new的对象,是内存中最大的一块区域

虚拟机栈:就是我们平时所说的栈,用来存放基本数据类型和对象的引用

本地方法栈:与虚拟机栈相同,只不过是为native方法服务的

程序计数器:用来标记程序运行到哪一行

方法区:也叫永久代,存放类的信息。在jdk1.6及以前,常量池在方法区里,常量池用于存放静态变量和字面量;在jdk1.7,常量池从方法区中分离出来,在内存中开辟了一段空间作为常量池;在jdk1.8,取消了方法区,取而代之的是元数据区。

10、问:面向对象的特征?

答:面向对象有三大特征:封装、继承、多态

  • 封装是将重复利用的代码包装起来,以便其他处引用,提高了代码的可重用性
  • 继承是发生在父子类之间的,子类继承父类开放权限的所有代码,其实继承破坏了封装性
  • 多态是在不改变程序的代码的情况下,在程序运行时动态的绑定代码,使程序出现多种状态。多态的体现是继承、重写、父类引用指向子类对象

11、问:String下有哪些方法?

答:

  • substring():截取字符串

  • split():分割字符串

  • valueOf():将其他类型转为字符串类型

  • trim():去掉字符串前后空格

  • indexOf():返回第一次出现该字符的索引

  • length():长度

  • concat():拼接

  • startsWith():以……开始

  • endsWith():以什么结束

......

12、问:如何避免死锁?

答:

  1. 避免给同一线程多次加锁

  2. 主副线程的加锁顺序一致

  3. 使用定时锁

  4. 死锁检测

13、问:Lock与synchronized的区别?

答:

  1. synchronized是关键字;Lock是接口

  2. synchronized在发生异常后会自动释放锁;Lock不会

  3. Lock有trylock方法看是否获得锁;synchronized没有

  4. synchronized是修饰代码块、方法获得锁的;Lock是通过ReetrantLock类加锁的

  5. synchronized是悲观锁;Lock是乐观锁

14、问:乐观锁与悲观锁的区别?

答:

悲观锁是将锁给一个线程,其他线程等待这个线程释放锁

乐观锁是先进行业务处理,最后一步更新数据时再加锁

①悲观锁适合于写频繁;乐观锁适合于读取频繁

②悲观锁是先加锁后进行业务逻辑;乐观锁是先进行业务逻辑再加锁

15、问:静态方法有什么缺点?

答:静态方法是属于类的,可以直接利用类名.直接调用,但静态方法不能自动销毁,它的执行效率比实例化要高。

16、问:hashCode相等,equals一定相等吗? 

答:不一定。hashCode相等是指哈希值相等,而值不一定相等。

比如1和5这俩个数都在1这个位置上,那么它们的哈希值相等,但这俩个数不相等

17、问:List与Set的区别? 

答:List和Set都是Collection接口下的接口。

  • List中元素可重复,有序,有下标;Set中元素无序,不可重复

  • List的查找快,增删慢;Set的查找慢,增删快

18、问:成员变量与局部变量的区别?

答:

  • 成员变量的作用域是在类中;局部变量的作用域是在方法中

  • 成员变量可以不赋初值;局部变量必须赋初值

19、问:ArrayList删除指定的元素怎么删?

答:

  • 用普通for循环,并且在循环中i--

    • //加入删除元素b
      for (int i = 0; i < al.size(); i++) { 
          if (al.get(i) == "b") { 
          al.remove(i); 
          i--; //一定要记着i--,因为每次删除完一个元素,后边的元素会往前挪
          } 
      }
  • 用一个List 记录要删除的数据,最后在原集合中removeAll(List);

  • 用迭代器自带的remove方法

20、问:Iterator与ListIterator的区别?

答:

  1. Iterator遍历set和list;ListIterator只能遍历list

  2. Iterator只能向后遍历,ListIterator既能向前遍历,也能向后遍历

  3. ListIterator比Iterator方法多,比如增加元素

21、问:Java是如何实现多线程的?

答:

  1. 继承Thread类,重写run方法,调用这个类的start方法

  2. 实现Runnable接口

  3. 实现Callable接口,重写call方法,搭配FutureTask类使用

22、问:synchronized的原理?

答:

  • JDK1.6以前,sync是重量级锁。

重量级锁有一个等待队列,想要抢占锁的线程都进入等待队列中,当线程A获得到共享资源,其他线程进入阻塞状态,当线程A释放锁时,其他线程被唤醒。

这个过程很消耗操作系统,因此sync的效率很低。

  • JDK1.6之后,sync应用了锁升级。

起初是无状态的,jvm启动4s后开启偏向锁,当某个线程来竞争,要判断当前锁是否可重新偏向,如果不能,就升级为轻量级锁,当自璇无法获取到锁,就会升级为重量级锁。

23、问:IO与NIO的区别?

答:

  • IO是单向的,NIO是双向的

  • IO是面向流的,NIO是面向缓冲区(块)的

  • IO是阻塞,NIO是非阻塞

24、问:类加载的时机?

答:

  1. 创建类实例

  2. 反射

  3. 访问类变量,为类变量赋值

  4. 调用类方法

  5. 初始化子类时,其父类也会被初始化

  6. 标注为主启动类,执行main方法

25、​​​​​​​问:类加载的步骤?

答:加载、连接、初始化;其中连接包括验证、准备、解析,每个阶段做的事情分别如下:

  • 加载:将编译后的.class文件加载到JVM,并创建一个Class对象
  • 验证:验证.class文件格式是否规范、也有安全层面的验证、验证类的元信息,字节码,符号引用
  • 准备:为类的静态变量分配内存,赋默认值
  • 解析:将符号引用转为直接引用
  • 初始化:为静态变量赋初始值


Thanks

..

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

非零基础自学Golang 第10章 错误处理 10.3 Go语言宕机 10.4 宕机恢复

非零基础自学Golang 文章目录非零基础自学Golang第10章 错误处理10.3 Go语言宕机10.4 宕机恢复10.4.1 recover捕获宕机10.4.2 recover应用第10章 错误处理 10.3 Go语言宕机 一般而言&#xff0c;只有当程序发生不可逆的错误时&#xff0c;才会使用panic方法来触发宕机。 pan…

云计算运营—02FusionSphere 6.5 服务器虚拟化运营

FusionSphere 6.5 服务器虚拟化运营 1、虚拟化 特性介绍 云操作系统架构 Tool/PV driver(虚拟机驱动) Tools是虚拟机的驱动程序。 安装并启动Tools后&#xff0c;用户无需做任何操作&#xff0c;Tools即可提供以下功能: 1、为虚拟机提供高性能的磁盘I/0和网络I/0功能 2、为…

Element-plus的通用使用方法

Element-plus的通用使用方法说明一、组件属性的使用二、组件内部事件的使用三、组件插槽的使用四、组件外部方法的使用1、使用外部方法是要调用标签的$refs2.使用方法完说明 本教程适用于Element-plus的使用非常熟练本教程是对Element-plus的高度总结组件属性的使用组件插槽的…

中国自然地理分区数据集 (含农业区划、森林工程、生态保护区、九大流域等)

一中国生态功能保护区数据 代码 名称 类型 1 秦岭山地生态功能保护区 水涵养生态功能保护区 2 若尔盖一玛曲生态功能保护区 水涵养生态功能保护区 3 滇西北生态功能保护区 水涵养生态功能保护区 4 珠江源(云南部分)生态功能保护区 水涵养生态功能保护区 5 雅鲁藏布江源头生态…

web前端-javascript-Array数组方法详解(增删改,遍历,截取,连接,转字符串,反转数组,排序)

文章目录数组的方法1. push() 添加2. pop() 删除3. unshift() 添加4. shift() 删除5. forEach() 遍历1) 说明2) 使用6. slice() 截取7. splice() 删除8. concat() 连接9. join() 转String字符串10. reverse() 反转11. sort() 排序1) 简单用法2) 自己指定排序规则数组的方法 1.…

[附源码]Python计算机毕业设计Django新能源汽车租赁

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

全文检索、精准查询、坐标查询、复合查询、排序、分页、高亮

文章目录DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询复合查询算分函数查询布尔查询搜索结果处理排序单字段 排序多字段 排序地理坐标排序分页高亮RestClient查询文档发起查询请求解析响应match查询精确查询布尔查询排序、分页距离排序高亮高亮请求构建高亮结果解析…

NAT处理流程、分类和使用场景

1、NAT分为源NAT、目的NAT、双向&#xff08;Bidirection&#xff09;NAT 源NAT适用于私网访问公网的情形 目的NAT适用于公网访问私网的情形 双向NAT适用于双方都非真实地址的情形 看下图&#xff0c;第一条匹配源NAT Server&#xff0c;如果匹配则2直接转换目的地址 ---> …

32位单片机存储器中地址膨胀映射作用位带操作和对应地址位置关系

映射的作用 所谓映射&#xff0c;实际上是有另一种控制同一个位置功能的方式。就相当于两个方式操作对一个功能起到相同作用 位带&#xff08;bitband&#xff09;操作:直译出来的&#xff0c;根本意思是将原地址中每一个字节位都扩展成占用一个32bit位的地址&#xff08;一个…

ubuntu18中ISCE2.6+stamps实现PSInSAR时序地表形表处理

一 安装ubuntu 教程参考&#xff1a;https://baijiahao.baidu.com/s?id1741674041146755999&wfrspider&forpc 建议安装18或者20版本&#xff0c;版本过高会导致版本不匹配的问题。 二安装Anaconda3 教程参考&#xff1a;https://zhuanlan.zhihu.com/p/269183148 注意…

[附源码]计算机毕业设计Python4S店汽车售后服务管理系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

RBAC与连表查询

文章目录0. 前言1. RBAC模型1.1 什么是RBAC模型1.2 准备工作2. 连表操作2.1 常用连表图2.2 准备SQL语句2.3 Mybatis 连表3. 总结与补充0. 前言 连表学习、练习经典&#xff1a;RBAC权限模型、5表联查。 本文采用的持久层实现方式&#xff1a;Mybatis/Mybatis-Plus。 学习基础…

QT系列第6节 QT中常用控件

1. QComboBox 下拉列表 2. QPlainTextEdit QPlainTextEdit的文字内容以QTextDocument类型存储&#xff0c;函数document返回这个文档 对象的指针 QTextDocument是内存中的文本对象&#xff0c;以文本块方式存储&#xff0c;每个段落以换行符结束。 QTextDocument提供一些…

常用日期类

第一代日期类 Date类 Date&#xff1a;精确到毫秒&#xff0c;代表特定的瞬间 当需要获取当前时间时可以直接new一个Date对象&#xff0c;使用无参构造器 Date date new Date();日期转文本 但是直接使用的话&#xff0c;它是国外的时间格式&#xff1a;Sat Dec 17 17:02:3…

Apache IoTDB v1.0.0安装试用小结( linux环境)

1 简介 Apache IoTDB 是一个开源物联网时序数据库。 github地址&#xff1a;https://github.com/apache/iotdb 2 下载 下载地址&#xff1a;https://iotdb.apache.org/Download/ 下载&#xff0c;输入命令&#xff1a; wget https://archive.apache.org/dist/iotdb/1.0.…

【简单工厂模式-2】简单工厂模式的代码实现及使用场景

简单工厂模式并属于Gof 23个经典设计模式其中之一&#xff0c;只是通常会将它作为学习其他工厂设计模式的入门&#xff0c;而且在开发中&#xff0c;简单工厂模式也是比较常见的&#xff0c;设计思想比较简单。 1. 定义 简单工厂模式定义一个工厂类&#xff0c;提供获取对象的…

Makefile、.mk、.bp、Blueprint、Soong、kati工具链的关系

一、Android版本相应的发展演变过程: Android 7.0引入ninja和kati Android 8.0使用Android.bp来替换Android.mk&#xff0c;引入Soong Android 9.0强制使用Android.bp 二、生成.ninja工具链关系&#xff1a;Android.bp、Blueprint、Soong、kati&#xff1a;总之都是用来把Make…

数据库拆分4--使用sharding-jdbc来实现水平拆分

有三张表 user log order表&#xff0c;先将user log 和order垂直分库&#xff0c;然后将user表水平拆分 配置文件 spring.shardingsphere.enabledtruespring.shardingsphere.datasource.nameswim-user,wim-orderspring.shardingsphere.datasource.wim-user.typecom.alibaba.…

vue入门--2

1.计算属性和侦听器 计算属性 VS 方法 如果不使用计算属性&#xff0c;在 methods 里定义了一个方法&#xff0c;也可以实现相同的效果&#xff0c;甚至该方法还可以接受参数&#xff0c;使用起来 更灵活。 既然 methods 同样可以解决模板中复杂逻辑计算的问题&#xff0c;那么…

2266. 统计打字方案数-动态规划

2266. 统计打字方案数-动态规划 Alice 在给 Bob 用手机打字。数字到字母的 对应 如下图所示。 为了 打出 一个字母&#xff0c;Alice 需要 按 对应字母 i 次&#xff0c;i 是该字母在这个按键上所处的位置。 比方说&#xff0c;为了按出字母 s &#xff0c;Alice 需要按 7 …