瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!
Posted Java架构-大仙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!相关的知识,希望对你有一定的参考价值。
Java基础
1_Object类中常用方法
equals,getClass,notify,notifyAll,wait,toString,hashCode
线程执行wait方法 会释放锁 让出CPU,进入等待状态,只有当notify 或 notifyAll被执行时,才会被唤醒,notifyAll会唤醒所有等待的线程。
2_String类中常用方法
indexOf,charAt,trim,split,length,subString,equals,toLowerCase,toUpperCase,replace
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框架
- #{} 和 ${}的区别
- #会把传入的参数加上引号 会对sql进行预处理,底层采用PreparedStatement可以有效预防sql注入
- $会把传入的参数当作一个对象,底层采用Statement
- 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
@Resource,@Autowired
@SpringBootApplication
@ExceptionHandler(value = Exception.class) // 捕获全局异常
@ExceptionHandler(value = LoginException.class) //捕获登录时异常
springboot中关闭自动配置
// exclude(排除)datasource和redis的自动装配
@SpringBootApplication(exclude={DataSourceAutoConfiguration.class,RedisAutoConfiguration.class})
SpringCloud框架
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 的区别
1_共同点:
-
都支持服务注册 和 服务拉取
-
都支持服务提供者心跳模式做健康检测
2_不同点:
-
nacos支持服务端主动检测提供者的状态,临时实例采用心跳模式,非临时实例采用主动检测模式;
-
临时实例心跳不正常会被剔除,非临时实例不会
-
nacos支持服务列表变更的消息推送模式,服务列表更新及时
Redis缓存
redis支持的数据类型
sting list set zset hash
// 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框架
- 首先添加shiro的依赖到项目中
- 然后需要创建基础的用户 角色 权限实体类
- 然后创建一个用于认证 和 为用户添加权限的类;这个类继承AuthorizingRealm,重写添加权限;doGetAuthorizationInfo方法,和用户认证的;doGetAuthenticationInfo方法。
- 最后创建一个过滤配置类,用@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 /us | r 将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 |
kill -9 java进程序号 | 停止特定java进程 |
以上是关于瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!的主要内容,如果未能解决你的问题,请参考以下文章
瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!