瞬间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

使用场景

  1. 如果需要容器中的元素按照插入顺序存储,需要List;
  2. 如果想要保证插入元素的唯一性,则可以选择Set;
  3. 如果想以键值对的形式存储,则使用Map
  4. 常用的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框架

  1. #{} 和 ${}的区别
  2. #会把传入的参数加上引号 会对sql进行预处理,底层采用PreparedStatement可以有效预防sql注入
  3. $会把传入的参数当作一个对象,底层采用Statement
  4. Dao接口的工作原理
  5. mybatis运行时会使用JDK动态代理,为Dao接口生成代理的proxy对象,这个代理对象会拦截接口方法,然后执行MappedStatement所代表的sql,然后将执行结果返回。
  6. mybatis 和 hibernate区别
  7. mybatis是半自动的orm框架,resultType自动映射,resultMap手动映射;
  8. 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搭建

  1. 创建项目 引入spring-cloud-starter-netflix-eureka-server依赖
  2. 编写启动类,并加上@EnableEurekaServer注解
  3. application.yml 中配置eureka地址
  4. 其他client服务引入eureka-client依赖 并 配置eureka的地址

Ribbon负载均衡

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

Feign搭建

  1. 引入依赖 spring-cloud-starter-openfeign
  2. 启动类加上@EnableFeignClients
  3. 最后编写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持久化机制

  1. 持久化 就是把内存的数据写入到磁盘中,防止服务器宕机内存数据丢失
  2. redis 提供两种持久化机制,RDB默认的 AOF机制
  3. RDB每隔一段时间将数据以快照方式保存到磁盘中,只产生一个dump.rdb文件,方便持久化;
  4. AOF将redis执行的每次写命令记录到日志文件中,重启redis会将持久化日志中文件数据恢复。

redis过期键删除策略

  1. 定时过期 惰性过期 定期过期
  2. redis 缓存雪崩 缓存穿透 缓存击穿

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

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

缓存穿透 指的是缓存和数据库中都没有要查询的数据,导致所有请求都落在数据库上,造成数据库压力 缓存失去意义

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

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

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

mysql数据库

mysql索引失效问题

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

mysql优化

  1. 使用join 代替子查询
  2. 避免使用函数索引
  3. 可以用in 替换 or
  4. 不要用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的核心

  1. Authentication:身份认证登录,验证用户是否拥有相应的身份
  2. Authorization:授权,验证某个已认证的用户是否拥有某个权限
  3. Session Manager:会话管理,用户登录后即一次对话,没有退出前所有信息都在会话中。
  4. Cryptography:加密 保护数据的安全性,如密码
  5. Remember Me:记住我,即登录一次之后 下一次不用登录

springboot 整合 shiro框架

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

Linux常用命令

快捷指令注释
shutdown -h now立即关机
shutdown -h 55分钟后关机
poweroff立即关机
shutdown -r now立即重启
shutdown -r 55分钟后重启
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 -efgrep java
kill -9 java进程序号停止特定java进程

以上是关于瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!的主要内容,如果未能解决你的问题,请参考以下文章

瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!

瞬间yue了!两年Java开发经验菜鸟面试总结,看完绝对颠覆你的认知!!

一个两年Java的面试总结,浅谈自己的面试经验

两年Java经验的菜鸟有幸进入网易,分享一下我的面试经验

两年Java开发工作经验面试总结

一个两年Java的面试总结