当前位置: 首页 > news >正文

面试可能被提问,该如何答复

关于技术

1.Java有那些基本数据类型,String是不是基本数据类型,他们有何区别。

Java 基本的数据类型包括
数值型  byte(1),short(2),int(4),long(8)
浮点型  float(4),double(8)
字符型  char(2)
布尔型  boolean(1)
String 不是基本数据类型,属于引用数据类型
区别:
基本数据类型表示简单的数值、字符,引用数据类型可以表示复杂的数据结构
基本数据类型声明即分配空间、引用数据类型需要实例才分配
其中:char 可赋值 int、long

2.字符串的操作:
  写一个方法,实现字符串的反转,如:输入abc,输出cba
  写一个方法,查询字串开始位置,如:输入abcdabc,cd 输出 2

写一个方法,实现字符串的反转,如:输入abc,输出cba
使用算法实现:
  public String swapWords(String str) { char[] arr = str.toCharArray(); swap(arr, 0, arr.length - 1); return new String(arr); } public void swap(char[] arr, int begin, int end) { while(begin < end) { char temp = arr[begin]; arr[begin] = arr[end]; arr[end] = temp; begin++; end--; } }
使用jdK 方法实现
public static String reverse(String str){
  return new StringBuilder(str).reverse().toString();
}
写一个方法,查询字串开始位置,如:输入abcdabc,cd 输出 2
算法实现

public static int findIndex(String str1,String str2){
    //保证str1 为长串
String temp;
if(str2.length()>str1.length()){
temp = str1;
str1 = str2;
str2 = temp;
}
char[] arr1 =str1.toCharArray();
char[] arr2 =str2.toCharArray();
int count=-1;
for(int i=0;i<arr1.length-arr2.length+1;i++){
count = i;
int j;
for(j=0;j<arr2.length&&arr1[i+j]==arr2[j];j++);
if(j!=arr2.length){
count = -1;
}else{
break;
}
}
return count;
}

方法实现
int indexOf(String str) 
s1.indexOf(s2);

3.Java对流的操作

流有那些?其中的区别?
答:
流向:输入流、输出流 处理类型:字节流、字符流(方便文本处理)
 字节流:InputStream、OutputStream
 字符流: Reader、Writer
字节流与字符流的区别: 字节流与字符流的不同是他们处理方式,字节流是最基本的采用ASCII编码,实际上很多数据为文本数据,
所以提出了字符流的概念,采用 unicode 编码。
字节流与字符流之间可以通过 InputStreamReader OutputStreamWriter 关联,底层是通过 byte[] 与 String 关联

解释 java.io.Serializable 接口
答:在java语言中,类通过实现 Serializable 接口开启其序列化功能,未实现的类无法使用其任何状态的序列化或者反序列化。

解释序列化与反序列化?
答:序列化是把对象转换为字节序列的过程,反序列化是把字节序列恢复为对象的过程。

serialVersionUID 的作用?
答:Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的

4.Java中访问数据库的步骤,Statement和PreparedStatement之间的区别。

访问数据库 Statement 与 Preparestatement 的区别?
答:statement 声明执行数据语言固定,如果执行多条sql,则必须写多条
preparestatement 的sql语言可以带参数,避免 字符串拼接的麻烦与不安全。
此外,preparestatement 接口为预编译的语句,减少sql错误与安全。

为了提供对存储过程的调用,还提供了 CallableStatement 接口。存储过程是数据库一组为了完成特定功能的sql语句集合。经过编译的存储过程
只需要调用即可生效执行,存储过程的缺点是数据库迁移时麻烦,不同的数据库书写有一定的区别。

 5.连接池

简单介绍一下连接池?
答:连接池的作用是为了提高性能,是将已经创建好的连接保存在池中,当有请求时,直接使用已经创建好的连接访问数据库。
省区了创建连接与销毁连接的过程,性能得到提升。
连接池放的许多 Connection 对象,本质是存放在内存中,程序每次从池中获取connection 对象,而不是从数据里获取,不需要占用服务器资源。
使用连接池:
1.自定义
2.使用第三方连接池
3.使用服务器自带的连接池
主流的连接池:jdbc、dbcp、c3p0、druid、proxool

 6.描述一下 JVM ?

类加载机制,涉及到的是JVM  全称 Java Virtual Machine,是计算机上虚拟的一个计算机。而计算机的基本构成包括:运算器、控制器、存储器、输入设备、输出设备。
JVM 都拥有这些元素。
如下是JVM 运作在操作系统之上,并没有直接接触硬件

图:JVM 组成部分

第一部分: Class Loader  类加载器

 当编写一个 HelloWorld.java 文件时,通过 javac 编译成 class 文件,如何加载到内存执行? 类加载器负责加载符合格式要求的 class文件

第二部分: 执行引擎

 执行引擎也叫解释器(Interpreter),负责解释命令,提交操作系统执行。

第三部分: 本地接口

 本地接口负责将其他语言为Java 调用。 Java 诞生之时,c/c++ 较多,为了兼容性,内存中有一快区域处理标记为native的代码。现在比较少用。

第四部分: 运行时数据区

 运行时数据区是真个 JVM 的核心,所有的类都被加载到这里才开始执行。

 7. Java 加载 class 文件原理

Java 中所有的类都需要类加载器加载到 JVM 才能运行。类加载器本身也是一个类,负责将 class 文件从硬盘读取到内存。
类加载的方式有俩种:
1.隐式装载, 当使用 new 生成对象时,将对应的类加载到JVM 
2.显式装载,通过 class.forname() 
Java 的类加载有三种,对应的Java三种类即系统类、扩展类、自定义类
Bootstrap Loader 加载系统类,如 String
  ExtClassLoader  加载扩展类,继承或者实现类
    AppClassLoader 负责加载应用类,自定义类
类加载如何协调工作的呢? Java 采用双亲委派机制
原理:类加载器需要加载类时候,先请示上一层类加载器加载,如果上级不能加载才在自己的搜索路径搜索该类加载。
如何获取类架子器:
ClassLoader loader = ClassName.class.getClassLoader();
ClassLoader parentLoader = loader.getParent();

 8.简述Java 中 GC 及其原理?

问题1:什么对象被认为是垃圾?
问题2:有那些典型的垃圾收集器?
问题3:确定垃圾后,如何进行回收?
引用计数法:通过判断对象引用的个数来确定是否回收,无法解决对象间的互相引用
可达性分析:通过一系列 GC Roots 作为起点进行搜索,如果GC root 与对象没有可达路径,则认为对象是不可达的。判定为不可达的对象不一定会被回收,需要经历至少两次的标记。
典型的垃圾收集算法:
1.Mark-Sweep 标记-清除算法
  标记阶段:标记所有可以回收的垃圾,在清除阶段删除
  但是容易产生内存碎片
2.Copying 复制算法
  为了解决Mark-Sweep 的缺陷,Copying 算法将内存分为相等的两块,每次使用一块,当一块用完,将存活的对象复制到另一块然后清除掉已经使用的空间。
  缺点:可使用的内存空间缩小一般,复制算法随着存活对象的增加,效率大大下降
  

3.Mark-Compact 标记-整理算法

  标记阶段与标记清除相同,不同的是标记结束,将存活的对象移动到一端,清除存活端以外的对象。

4. Generational Collection  分代收集算法

  分代收集算法是目前使用做多的算法,思想是将内存分为若干个不同的区域。将堆分为老年代和新生代,老年代回收的对象较少,新生代基本要被回收。

  因此,新生代采用 copying 复制算法,但是新生代分配空间并非1 :1 ,而是分为较大的 Eden 空间和两个较小的 Survivor 空间。每次使用Eden 空间和一块 Survivor 空间,当进行回收时,将存活的

  对象复制到另一块Survivor 空间,然后清理掉Eden 和刚使用的Survivor 空间。

   老年代的特点是每次回收的对象少,使用 Mark-Compact 算法

  在堆之外,有一个永久代,用来存储 class 类、常量、方法 

典型的垃圾收集器:
  1.Serial /Serial old
  2.ParNew
  3.CMS
  4.G1

 9. Spring MVC 工作原理

1.用户发送请求到前端控制器 DispatcherServlet

2.DispatcherServlet 收到请求调用处理器映射器HandlerMapping

3.处理器映射器根据请求的url找到具体的处理器,生成处理器执行链HandlerExecutionChain,返回给DispatcherServlet

4.DispatcherServlet 根据处理器Handler 获取处理器适配器 HandlerAdapter执行操作(参数封装,数据格式转换,数据验证等)

5.执行处理器 Handler(Controller 页面控制器)

6. Handler 执行完成返回 ModelAndView

7.HandlerAdapter 将Handler 执行结果 ModelAndView 返回到 DispatcherServlet

8.DispatcherServlet 将 ModelAndView 传给 ViewReslove 视图解析器

9.ViewReslover 解析后返回具体的 View

10.DispatcherServlet 对 View 进行渲染视图

11.DispatcherServlet 响应用户

 10. 三次握手与四次挥手

三次握手:
  第一次握手:由客户端发送建立TCP连接的请求报文,其中报文中包含seq序列号,是由发送端随机生成的,并且将报文中的SYN字段置为1,表示需要建立TCP连接。
        (SYN=1,seq=x,x为随机生成数值)

  第二次握手:由服务端回复客户端发送的TCP连接请求报文,其中包含seq序列号,是由回复端随机生成的,并且将SYN置为1,而且会产生ACK字段,
        ACK字段数值是在客户端发送过来的序列号seq的基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP建立请求已得到验证。
        (SYN=1,ACK=x+1,seq=y,y为随机生成数值)这里的ack加1可以理解为是确认和谁建立连接。

  第三次握手:客户端收到服务端发送的TCP建立验证请求后,会使自己的序列号加1表示,并且再次回复ACK验证请求,
        在服务端发过
四次挥手:
  第一次挥手:客户端发送断开TCP连接请求的报文,其中报文中包含seq序列号,是由发送端随机生成的,并且还将报文中的FIN字段置为1,表示需要断开TCP连接。
        (FIN=1,seq=x,x由客户端随机生成)
  第二次挥手:服务端会回复客户端发送的TCP断开请求报文,其包含seq序列号,是由回复端随机生成的,而且会产生ACK字段,
        ACK字段数值是在客户端发过来的seq序列号基础上加1进行回复,以便客户端收到信息时,知晓自己的TCP断开请求已经得到验证。
        (FIN=1,ACK=x+1,seq=y,y由服务端随机生成)
  第三次挥手:服务端在回复完客户端的TCP断开请求后,不会马上进行TCP连接的断开,服务端会先确保断开前,所有传输到A的数据是否已经传输完毕,一旦确认传输数据完毕,
        就会将回复报文的FIN字段置1,并且产生随机seq序列号。(FIN=1,ACK=x+1,seq=z,z由服务端随机生成)
  第四次挥手:客户端收到服务端的TCP断开请求后,会回复服务端的断开请求,包含随机生成的seq字段和ACK字段,ACK字段会在服务端的TCP断开请求的seq基础上加1,
        从而完成服务端请求的验证回复。(FIN=1,ACK=z+1,seq=h,h为客户端随机生成)
            
 
 

 12.对于 Spring 的理解

1. 谈谈你对spring IOC 和 DI 的理解,他们的区别?
  IOC: Inverse of Control 控制反转,将原本在程序中手动创建对象的控制权交由Spring 管理。创建对象的控制器反转到spring框架。
  DI:Dependency Injection 依赖注入,在spring 框架负责创建bean对象时,动态的将依赖对象注入到bean组件。
2. BeanFactory 接口和 ApplicationContext 接口的区别?
  ApplicationContext 接口继承 BeanFactory 接口,Spring 核心工厂是 BeanFactory,BeanFactory 采取延时加载,第一次getBean 时会初始化Bean。
  ApplicationContext 是在加载配置文件时初始化Bean.
  ApplicationContext 是对BeanFactory扩展,它可以进行国际化处理,事件传递和Bean自动装配。开发中基本都在使用ApplicationContext,
  web 项目使用WebApplicationContext,很少使用到BeanFactory
3. 简单说一下 spring 的生命周期?
  1.对象实例化
  2.封装属性
  3.根据bean 不同实现,自己执行不同的方法
  4.指定初始化方法
  5.执行业务处理
  6.执行销毁方法
4.Bean 的作用域
  singleton: spring ioc 容器只会存在一个bean 实例
  prototype: 每次请求 bean 都会创建一个实例
5.什么是AOP?
  AOP,Aspect Oriented Programming,面向切面编程,可以弥补OOP的不足,是对spring 的一种增强。
  oop 允许开发者定义纵向的关系,但不适合定义横向的关系,如日志。在很多地方都需要使用日志,就会导致大量代码重复,不利于各个模块。
  AOP 可以刨开分装的内部对象,将影响的多个类的行为封装到一个可以重用的模块中,即切面。
6.介绍一下 Spring 的事务管理
 
 首先,事务的四个特性:
    原子性:事务是一个原子操作,由一系列动作组成,原子性保证事务要么全部完成,要么全不执行。
    一致性:一旦事务完成,系统保证它建模的业务处于一致状态,而不是部分完成,部分失败。
    隔离性:可能存在多个事务处理同一个数据,因此需要保证每个事务与其他事务隔离。
    持久性:一旦事务完成,无论系统发生任何错误,它的结果都不受到影响。
 
spring 并不直接管理事务,而是提供了多种事务管理器,他们将事务管理的指责委托给 hibernate 或者 JTA等持久化机制所提供的相关平台框架的事务来实现。

 13. NIO 与 IO 的区别以及原理?

区别:
    传统的IO 称为 BIO,阻塞式的IO. NIO 是非阻塞IO, AIO 是异步IO
    Java IO的各种流是阻塞的,意味着当一个线程调用 read(),或者 write()
    时,该线程被阻塞。直到数据被读取或者写完。该线程在此期间不能干任何    
    事情。
  Java NIO 是非阻塞模式,使一个线程从某通道发送请求数据,但是它能得到目前可用的数据,如果目前没有数据可用时,便设么都不获取,不会阻塞,仍然可以做其他都事情。
  线程通常将非阻塞IO的空闲时间用于其他通道上执行IO操作,所以,一个单独的线程可以管理多个输入和输出通道。

 

 关于自己

转载于:https://www.cnblogs.com/baizhuang/p/10307651.html

相关文章:

  • make--变量 条件判断 函数定义及调用
  • 林斌:小米双折叠手机来了 会考虑未来做成量产机发布
  • VRChat简易教程2-创建一个最基本的世界(world)
  • PHP扩展库PEAR被攻击,近半年下载者或被影响
  • Docker: 容器互访的三种方式
  • D. Diverse Garland
  • 火箭主帅德安东尼赞哈登低位防守:他是控球中锋
  • Problem C: [noip2016十连测第五场]travel (构造+贪心)
  • 年终总结,程序员票选最喜欢的编程语言花落谁家?
  • js 基本数据类型
  • 自己写一个mvc框架吧(三)
  • IDEA 超级好用的插件
  • 微软是如何使用C#重写C#编译器并将其开源的
  • 前端小报 - 201901 月刊
  • DNS 故障导致微软 Azure 云服务的数据库被删除
  • docker-consul
  • E-HPC支持多队列管理和自动伸缩
  • gf框架之分页模块(五) - 自定义分页
  • leetcode46 Permutation 排列组合
  • Python - 闭包Closure
  • Python socket服务器端、客户端传送信息
  • scrapy学习之路4(itemloder的使用)
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • SwizzleMethod 黑魔法
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 分类模型——Logistics Regression
  • 高程读书笔记 第六章 面向对象程序设计
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 力扣(LeetCode)56
  • 人脸识别最新开发经验demo
  • 我是如何设计 Upload 上传组件的
  • 协程
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • #{} 和 ${}区别
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #单片机(TB6600驱动42步进电机)
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (4)事件处理——(7)简单事件(Simple events)
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (转)IOS中获取各种文件的目录路径的方法
  • .NET DataGridView数据绑定说明
  • .NET Framework .NET Core与 .NET 的区别
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .netcore 获取appsettings
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • @SuppressWarnings(unchecked)代码的作用
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯
  • [Angular] 笔记 20:NgContent
  • [C#]手把手教你打造Socket的TCP通讯连接(一)
  • [C\C++]读入优化【技巧】
  • [codevs1288] 埃及分数
  • [iHooya]2023年1月30日作业解析