两年菜鸟,Java开发面试题总结

Java基础

1,Object类中常用方法

equals,getClass,notify,notifyAll,wait,toString,hashCode

线程执行wait方法 会释放锁 让出CPU,进入等待状态,只有当notify 或 notifyAll被执行时,才会被唤醒,notifyAll会唤醒所有等待的线程。

2,String类中常用方法

indexOf,charAt,trim,split,replace,subString,length,equals,toLowerCase,toUpperCase

3,= = 和equals的区别

==基本类型比较值相同,引用类型比较内存地址

Object中equals底层采用==,String中重写equals 比较的是值相同

4,String、StringBuffer、StringBuilder的区别及使用场景

String使用final修饰,每次变化产生新的对象。StringBuffer线程安全。

应用场景:首先使用性能较高的StringBuilder,如果是在多线程共享变量的情况下则使用线程安全的StringBuffer。

5,重载和重写的区别

重载 发生在同一个类中 方法名相同参数列表不同;重写发生在父子类中,方法名和参数列表必须相同。

6,基本类型 和 包装类型的区别

包装类是对象,拥有方法和属性,是引用的传递;基本类型是值传递。

Java中的数据结构

List:有序列表,允许重复和null,先进先出。

Set:无序列表,不允许重复一个null

Map:散列表,允许任意个null值,但最多允许一个key为null

使用场景

如果需要容器中的元素按照插入顺序存储,需要List;

如果想要保证插入元素的唯一性,则可以选择Set;

如果想以键值对的形式存储,则使用Map

常用的ArrayList、LinkedList、HashMap基本数据结构

1,ArrayList底层是动态数组(初始长度10,每次扩容为原来的1.5倍),连续的内存存储适合查询操作;

//迭代器
Iterator iterator = arrayList.iterator();
while(iterator.hasNext()){
   iterator.next();
}
//增强for循环
for(String str:arrayList){
   str;
}
//普通for循环
for(int i=0;i<arrayList.size();i++){
   list.get(i);
}

2,LinkedList底层是双向链表,分散存储,适合做插入删除操作;

3,HashMap底层是数组+链表 或 红黑树(初始长度为16,负载因子0.75也就是数组长度达到75%就会进行扩容,每次扩容为原来的2倍),数组长度 超出64并且链表长度超出8,链表会进行树化。

//forEach循环
for(Map.Entry<> entry : map.entrySet()){
   entry.getKey();entry.getValue();
}
//forEach迭代键值
for(Object key : map.keySet()){
   key;
   map.get(key);
}

 

Java多线程

创建多线程

1,继承Thread类重写run方法,方法中定义需要执行的任务

2,实现Runnable接口重写run方法

3,实现Callable接口 并实现call方法

synchronized

synchronized可作用于 方法 和 代码块,保证被修饰的代码在同一时间只能被一个线程访问。

 

Java流

java.io流 分类

java.io中的流

深色为节点流,浅色为处理流:

java.io中常用的流

1,对文件操作的流:FileReader、FileWriter、FileInputStream、FileOutputStream

2,字节缓冲流:BufferedInputStream、BufferedOutputStream

3,字符缓冲流:BufferedReader、BufferedWrite (读取和写入一行的方法ReadLine和NewLine),输出缓冲流,回先写到内存中,再使用flush方法将内存中的数据刷到磁盘中。所以在使用字符缓冲流,要先flush 然后再close,避免数据丢失。

 

Spring框架

对Spring IOC 和 AOP的理解

ioc 控制反转 依赖注入,将原本在程序中手动创建对象的控制权交给spring容器管理,简化了开发 增加可维护性。

aop 面向切面编程,在不修改源码情况下,给程序扩展功能,减少系统中重复代码,降低模块之间的耦合度,易扩展易维护。

aop是基于动态代理实现的,如果要代理的对象实现了某个接口 就会使用JDK动态代理创建代理对象,否则 转而使用CGlib动态代理生成一个被代理对象的子类来作为代理。

spring事务的特性

原子性,一致性、隔离性、持久性

spring事务的配置方式

spring支持 编程式事务 和 声明式事务 两种。

事务的隔离级别

1,脏读:读取到回滚的数据

2,幻读:两次读取的数据记录条数不一致

3,不可重复读:两次读取到的数据不一致

 

SpringMVC框架

springmvc是spring提供的一个基于MVC设计模式的web框架,通过分层将web层进行职责解耦。

SpringMVC 的运行原理

1,客户端发送请求到 前端控制器(DispatcherServlet),DispatcherServle通过处理映射器(HandlerMapping)找到处理请求的控制器(handler)

2,然后DispatcherServlet将请求提交到handler,handler调用业务逻辑处理后返回ModelAndView对象

3,DispatcherServlet通过视图解析器(ViewResolver)找到指定的视图,然后渲染数据最后返回给前端。

重定向 和 转发

重定向:返回值前加 redirect ;转发:返回值前加 forward

springmvc 和 struts2的区别

1,springmvc入口是一个servlet前端控制器,而struts2入口是一个filter过滤器

2,springmvc基于方法开发,而struts2是基于类开发 传递参数通过类的属性

 

MyBatis框架和Hibernate框架

#{} 和 ${}的区别

# 会把传入的数据当作字符串处理, $ 则是直接显示传入的数据
# 相当于是变量的替换,使用PerparedStatement赋值,$ 相当于是字符串的拼接使用Statement赋值
# sql接收传递过来的变量使用#可以防止sql注入.使用sql,sql,,使“赋值.

Dao接口的工作原理

mybatis运行时会使用JDK动态代理,为Dao接口生成代理的proxy对象,这个代理对象会拦截接口方法,然后执行MappedStatement所代表的sql,然后将执行结果返回。

mybatis 和 hibernate区别

mybatis是半自动的orm框架,resultType自动映射,resultMap手动映射;

hibernate全自动的orm框架,xxx.hbm.xml配置文件用来描述类与数据库中表的映射关系,hibernate.cfg.xml是此框架的核心配置文件,hibernate里操作实体类就是操作表。

 

SpringBoot框架

springboot 是用来简化spring应用初始搭建 以及 开发过程的框架

springboot自动配置原理

首先springboot入口类有一个核心注解@SpringBootApplication,这个复合注解里有一个@EnableAutoConfiguration开启自动配置。而这个注解里使用@import注解,@import会调用方法扫描一个spring .factories的文件,它里面都是key value形式,然后筛选出以EnableAutoConfiguration为key的数据,而它的value是一些以AutoConfiguration结尾的类名的列表,最后会加载到容器中,完成环境的自动配置

springboot中常用注解

@Component,@Bean,@Configuration,@Value,@RestController,@Controller,@Service,@Mapper

@Resource 根据名称注入,@Autowired 根据类型注入

@SpringBootApplication

@ExceptionHandler(value = Exception.class) // 捕获全局异常

@ExceptionHandler(value = LoginException.class) //捕获登录时异常

@Transaction(rollbackFor={Exception.class})

@Configuration      
@EnableScheduling   // 开启定时任务
public class SaticScheduleTask {
  //3.添加定时任务
  @Scheduled(cron = "0/5 * * * * ?")
  private void configureTasks() {
      System.err.println("执行静态定时任务时间: " + LocalDateTime.now());
  }
}

springboot中关闭自动配置

// exclude(排除)datasource和redis的自动装配
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,RedisAutoConfiguration.class})

 

SpringCloud框架

Eureka:EnableEurekaServer、EnableEurekaClient

Zookeeer/Consul:EnableDiscoveryClient

OpenFiegn:EnableFeignCliens、FeignClien

Hystrix:FeignClien(value="server_name" , fallback="FallbackService.class")

 

RPC (远程过程调用) 框架,springcloud是基于springboot的一整套实现微服务的框架

  
注册中心 Nacos / Eureka
服务远程调用 feign (http restful风格)
配置中心 nacos
服务网关 Gateway
服务监控和保护 hystrix / sentinel

Eureka搭建

创建项目 引入spring-cloud-starter-netflix-eureka-server依赖

编写启动类,并加上@EnableEurekaServer注解

application.yml 中配置eureka地址

其他client服务引入eureka-client依赖 并 配置eureka的地址

Ribbon负载均衡

请求进入ribbon后会被LoadBalanceIterceptor负载均衡器拦截,之后会通过IRule基于它自己的负载均衡规则,最后得到一个真实的请求地址。IRule默认是轮询

Feign搭建

引入依赖 spring-cloud-starter-openfeign

启动类加上@EnableFeignClients

最后编写feign客户端,类上面加@FeignClient("xxx") 注解

Gateway搭建

引入SpringCloudGateway和nacos服务发现依赖:

spring-cloud-starter-gateway
spring-cloud-starter-alibaba-nacos-discovery

编写路由配置 及 nacos地址

spring:
cloud:
gateway:
routes:
-id: user-service
uri: lb://userservice
padicates:
-path = /user/** #路由断言

 

Nacos 和 Eureka 的区别

共同点:

都支持服务注册 和 服务拉取

都支持服务提供者心跳模式做健康检测

不同点:

nacos支持服务端主动检测提供者的状态,临时实例采用心跳模式,非临时实例采用主动检测模式;

临时实例心跳不正常会被剔除,非临时实例不会

nacos支持服务列表变更的消息推送模式,服务列表更新及时

Redis缓存

redis支持的数据类型

sting list set zset hash
expire //设置redis过期时间
expire key_name 60 //60秒过期时间
   
// string
set key value
get key
exists key //判断key是否存在
del key
mset k1 v1 k2 v2 //插入多个
//hash
hset user name 'xx' age 25 sex '男'
hget user name
hdel user name
//list
lpush user a b c //左插入
rpush user a b c //右插入
lpop user //从左边开始弹出元素
rpop user //从右边开始弹出元素
ltrim user 0 //删除

redis持久化机制

持久化 就是把内存的数据写入到磁盘中,防止服务器宕机内存数据丢失

redis 提供两种持久化机制,RDB默认的 AOF机制

RDB每隔一段时间将数据以快照方式保存到磁盘中,只产生一个dump.rdb文件,方便持久化;

AOF将redis执行的每次写命令记录到日志文件中,重启redis会将持久化日志中文件数据恢复。

redis过期键删除策略

定时过期 惰性过期 定期过期

redis 缓存雪崩 缓存穿透 缓存击穿

缓存雪崩 指的是同一时间大量key过期,请求都会落在数据库上,给数据库造成压力

解决:设置过期时间时 加上随机数,防止大量key同时过期;


缓存穿透 指的是缓存和数据库中都没有要查询的数据,但是如果这种请求过多,所有的请求都落在数据库上,造成数据库压力 缓存失去意义

解决:

缓存和数据库中都没有,如果用户反复请求这可能是一个恶意攻击,可以将这个数据存储为key-null设置一个短的过期时间,或者采用布隆过滤器 将所有可能存在的数据放到一个足够大的bitmap中,如果用户请求一个一定不存在的数据会被这个bitmap拦截。


缓存击穿 指的是缓存中没有 数据库中有的数据,一般是缓存过期并且访问的这个key并发数特别多 造成数据库压力(与缓存雪崩不同,缓存击穿是并发查同一条数据)

解决:

设置热点key永不过期;加互斥锁。

 

MySQL数据库

mysql索引失效问题

like以%开头;
or前后有不是索引的字段时;
组合索引不是使用第一列索引;
IS NULL,IS NOT NULL,NOT,< >,!=
字段上使用函数时

mysql优化

使用join 代替子查询
避免使用函数索引
可以用in 替换 or
不要用select *

mysql索引数据结构

mysql索引的数据结构是B+树。

 

Dubbo框架

dubbo和springcloud区别

dubbo使用RPC通信,而springcloud使用的是http restful方式

 

Nginx中间件

nginx是一个web服务器 和 反向代理服务器

正向代理 和 反向代理

正向代理 代理服务器为客户端的代理人,客户端明确访问的目标服务器,而目标服务器不清楚来自的客户端;

反向代理 代理服务器为服务器的代理人,客户端不知道来自哪台服务器,对外屏蔽了服务器的信息。

 

Tomcat容器

tomcat缺省端口修改

在conf文件夹下找到server.xml文件,修改里面connector标签里的port信息

 

Maven基础

maven的作用

主要用于 项目构建 和 依赖管理

mvn compile //编译源代码
mvn deploy //发布项目
mvn clean //清除项目目录
mvn package //打包
mvn install //安装jar

 

【全文检索】框架使用

Lucene实现流程概述

首先获取需要创建索引的原始文档,然后利用Lucene构建文档对象,最后分析文档进行相应的分词,然后会在磁盘中创建出索引库。用户根据关键字搜索,lucene会创建一个查询,并为关键字进行分词,最后执行查询,从索引库中返回结果。

 

shiro安全框架基础使用

shiro介绍

是一个易用的java项目安全框架,提供了认证、授权、加密、会话管理

shiro的核心

Authentication:身份认证登录,验证用户是否拥有相应的身份

Authorization:授权,验证某个已认证的用户是否拥有某个权限

Session Manager:会话管理,用户登录后即一次对话,没有退出前所有信息都在会话中。

Cryptography:加密 保护数据的安全性,如密码

Remember Me:记住我,即登录一次之后 下一次不用登录

springboot 整合 shiro框架

1,首先添加shiro的依赖到项目中
2,然后需要创建基础的用户 角色 权限实体类
3,然后创建一个用于认证 和 为用户添加权限的类
这个类继承AuthorizingRealm,重写添加权限
doGetAuthorizationInfo方法,和用户认证的
doGetAuthenticationInfo方法。
4,最后创建一个过滤配置类,用@Bean注解将上面自己创建的验证用户的
方式 和 权限管理 加入容器,还可以配置一些过滤器和跳转条件

 

Linux常用命令

shutdown -h now 立即关机 shutdown -h 5 5分钟后关机 poweroff 立即关机 shutdown -r now 立即重启 shutdown -r 5 5分钟后重启 reboot 立即重启 ifconfig --help 查看网卡信息 cd / 切换到根目录 cd /usr 切换到根目录下的usr目录 cd .. 切换到上一级目录 cd ~ 切换到home目录 cd - 切换到上次访问的目录 ls 查看当前目录下所有 ls -a 查看当前目录下所有 包括隐藏文件 ls -l 查看当前目录所有 更多信息 ls /dir 查看指定目录下所有 mkdir aaa 新建aaa目录 mkdir /usr/aaa 在指定目录下新建aaa -r递归 -f询问 rm 文件 删除文件 rm -r aaa 递归删除aaa目录 rm -rf * 删除当前目录下所有 rm -rf /* 从根目录删除所有 mv aaa bbb 目录aaa修改为bbb mv /usr/tmp/aaa /usr 将aaa目录剪切到usr下 cp -r /usr/tmp/aaa /usr 将aaa目录复制到usr下 find /usr -name 'a*' 查找usr目录下所有以a开头的目录或文件 touch aa.txt 新建文件 :wq 保存并退出 vi 文件名 vi编辑器打开后,点击键盘i/a/o进入编辑模式 ESC 退出命令行模式 q! 撤销本次修改并退出编辑 tar -zcvf 打包后文件名 要打包的文件 tar -zxvf aa.tar 解压文件到当前目录 tar -zxvf aa.tar -C /usr/ 解压文件到指定位置 java -jar aaa.jar 启动jar,ctrl+c打断程序运行,窗口关闭程序终止运行 java -jar aaa.jar & 表示在后台运行,窗口关闭程序终止运行 nohup java -jar aaa.jar & 不挂断运行,窗口关闭程序仍然运行 ps -ef | grep java 查看java应用 kill -9 java进程序号 停止特定java进程

 


__EOF__

本文作者故國神遊
本文链接https://www.cnblogs.com/xyt666/p/16159917.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   故國神遊  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示