Java 面试重点

本文深入探讨了Java中事务处理、常量池机制、Spring框架的注入方式、MyBatis数据库操作、JVM类加载过程及项目上线部署流程。同时,讲解了权限控制、HTTP请求分析、前后端分离实践、SQL优化技巧、Redis应用、SpringCloud组件以及分布式系统的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、MySQL的事物有了解吗?简单说一下你的理解。说一下批处理

事务的作用 总的来说就是要么全部成功,要么全部失败。

比如 银行转账的时候,A转给B 1000元钱, 这个业务实现的时候需要两个数据库的update,第一个update,我们需要从A的账户余额减掉1000,第一个update ,给B的账户余额加1000.
如果 第一个update执行完成以后,执行第二个update的时候失败了,最终会导致1000元不见了或者说给银行了,这个是不允许发生的情况。

所以我们需要 把这两个update,用事务包裹起来了,加上事务以后,如果第二个update失败,就会触发事务回滚,事务回滚就会把第一个update 减掉的A的1000,再加回给A的账户余额。 这样最终的结果就是全部失败,两个update都没执行成功。

springboot 开启事务很简单就是在service层的方法上加一个注解 @Transactional

参考资料:
一、事务的四大特性(ACID)

1、原子性(Atomicity)

2、一致性(Consistency)

3、隔离性(Isolation)

4、持久性(Durability)

二、事务的隔离级别(默认事务级别为可重复读)

MySQL数据库的四种事务隔离级别

Read Uncommitted(读取未提交内容)

Read Committed(读取提交内容)

Repeatable Read(可重读)

Serializable(可串行化)

2、JAVA常量池有了解吗?简单说一下 。什么样的对象不能放入常量池

Java常量池 可以避免频繁的创建,销毁对象,实现对象的共享。

JAVA常量池的好处:

(1)节省内存空间:常量池中所有相同的字符串常量被合并,只占用一个空间。
(2)节省运行时间:比较字符串时,比equals()快。对于两个引用变量,只用判断引用是否相等,也就可以判断实际值是否相等。

几个特别注意的点:

  • JAVA常量池 存储了 字符串(String), 8个基本类型,5个基本类型的包装类Byte,Short,Integer,Long,Character,Boolean;
  • 这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象
  • 两种浮点数类型的包装类Float,Double并没有实现常量池技术。

包装类常量池

Integer a=new Integer(127);
        Integer b=new Integer(127);
        // new关键字,永远都会创建新的对象,所以结果是false
        System.out.println(a==b);

        Integer a1=127;
        Integer b1=127;
        // 五种包装类,在[-128,127] 之间JVM已经提前创建好了对象放在常量池
        // 这里只是把常量池了同一个对象127分别赋值给了a1,b1, a1,b1都是指向同一个常量池的127,
        // 所以结果是true
        System.out.println(a1==b1);

        // 五种包装类,在[-128,127] 之间JVM已经提前创建好了对象放在常量池
        //如果超出范围,就需要创建新的变量,所以结果是false
        Integer a2=128;
        Integer b2=128;
        System.out.println(a2==b2);

字符串常量池

package com.xsz.finaldemo;

/**
 * String s1 = new String("xyz"); **创建了几个对象? **
 * 考虑类加载阶段和实际执行时。
 * (1)类加载对一个类只会进行一次。"xyz"在类加载时就已经创建并驻留了(如果该类被加载之前已经有"xyz"字符串被驻留过则不需要重复创建用于驻留的"xyz"实例)。驻留的字符串是放在全局共享的字符串常量池中的。
 * (2)在这段代码后续被运行的时候,"xyz"字面量对应的String实例已经固定了,不会再被重复创建。所以这段代码将常量池中的对象复制一份放到heap中,并且把heap中的这个对象的引用交给s1 持有。
 * 这条语句创建了2个对象
 *
 */
public class Test3 {

    public static void main(String[] args) {
        String b1="abc";
        String b2="ab";
        String b3="ab"+"c";
        String b4=b2+"c";

        System.out.println(b1==b3);//true  因为都是常量池的数据
        System.out.println(b1==b4);// false  b2是一个变量参与连接以后,会产生新的字符串

        String str1 = "str";
        String str2 = "ing";

        String str3 = "str" + "ing";
        String str4 = str1 + str2;
        System.out.println(str3 == str4);//false

        String str5 = "string";
        System.out.println(str3 == str5);//true


        //常量池里放一个xyz的对象
        String s3="xyz";
        //只要是new 关键字 就会在堆里创建xyz, 因为上面常量池已经有xyz了就只需要堆里创建一个
        String s1 = new String("xyz");


        String s11 = new String("计算机");
        //只要用了intern方法,就表示从常量池里取出一个对象
        String s21 = s11.intern();
        //直接用字符串赋值,也是从常量池里取出对象
        String s31 = "计算机";
        System.out.println("s1 == s2? " + (s11 == s21));
        System.out.println("s3 == s2? " + (s31 == s21));


    }
}

3、spring的注入(三种)

  • @Rource
  • @Autowired
  • xml 配置文件

4、有用到mybatis吗?你们是怎么进行数据连接的(数据库操作?)(回答上来了)

mybatis一般跟springboot结合, 用来负责操作数据库的部分。

mybatis是直接操作数据库,指向sql语句,hibernate是操作java对象,对象的属性改变以后 映射到数据库。

5、JVM加载类的过程(回答上来了)

java文件会先编译成.class文件, 类加载器 加载 class文件,并且把类的信息 存到JVM的方法区。

6、项目上线有接触吗?

有的, 我们的项目是运行在阿里云上。
项目上线部署步骤:

1,把springboot 项目打包,可以是jar包也 可以是war包。
2, 如果是war包,就把打好的war放在阿里云服务器tomcat上的webapp目录下面,然后重启tomcat就可以了。
3,如果是jar包,就采用 java -jar +jar包的名字,就可以运行了。 不过一般运行nohup java -jar core.jar & 这个命令启动,这样关闭窗口以后,也可以继续运行。

7、权限控制是怎么实现的?(介绍shiro 、五张表)

shiro,我们用了 用户登录和用户权限管理

8、Java基础
(1)和equals的区别(回答出来了)
(2)排序有哪些?写出冒泡排序(写出来了)
(3)写一个懒汉模式和单例模式(写出来了)提问:对线程有了解吗?
(4)if (str.equals("")||str
null){
System.out.println(“字符串str为空”)};会报错吗?
(5)String b1=”abc”;
String b2 = “ab”;
String b3=”ab”+”c”;
String b4= b2+”c”;
问b1=b3? b1=b4?
9、写sql语句。。我忘记了 题目挺简单的。

10、对索引有了解吗?MySQL怎么使用索引。

索引可以加快查询速度。

我们需要在经常出现在where条件上的 列上加索引。
索引不是越多越好,索引多了会导致修改效率变慢,并且占用服务器资源。
写查询语句的时候,要注意几个导致索引失效的写法,比如 in,like前面的%
in 可以用exists代替。

11、前端有写过吗?怎么测试接口?Ajax的传值类型有哪些。Post和get请求的区别

测试接口,使用swagger或者postman 测试

ajax传值方式: 地址传值,问号传值,json传值,cookie传值

Post和get请求的区别: get请求,参数会出现在浏览器地址栏,传值的大小有限,get主要用来查询信息。 post 请求,参数不会出现在地址来,可以传更多的数据,post一般用来做修改信息。

12, 什么是前后分离?
我们目前的项目就是前后分离的, 前端采用bootrap,html 显示页面,通过jquery的ajax执行 Springboot controller的API接口。 SpringBoot api接口返回json格式的数据。
另外 我们用到了jwt的token代替session. 前端每次请求的head都会包含token. 后台的过滤器 会解析每次请求head中包含的token信息,并且从token里面解析出用户名。

13. http请求在浏览器可以看到哪些东西
可以点击F12,然后可以看到如下:

  • 请求地址 request url
  • 请求方式request method 比如get,post
  • status code 比如200表示请求成功,404 表示请求资源不存在,500表示请求资源后台错误,304 表示自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
    301 表示请求重定向了
    请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置
  • content-type, request/response 的属性content-type, 比如我们写代码的时候,请求参数格式一般设置成json,那content-type的值必须是application/json. 比如文件上传功能,那么content type 必须是mutipart/form-data
  • 请求参数的值
  • 返回参数的值
  • 请求资源的大小
  • 整个http请求花费的时间
  • 请求的类型,比如是文件,图片,等等
  • 如果是js,html 还可以看运行中的源码

14. 错误码具体有哪些,对应的英文是什么

https://blog.youkuaiyun.com/wal1314520/article/details/73825310

15.
在这里插入图片描述
答案:
select
sum(case when salary>9999 and age>35 then 1 else 0 end) AS ‘第一组’ ,
sum(case when salary>9999 and age<35 then 1 else 0 end) AS ‘第二组’ ,
sum(case when salary<9999 and age>35 then 1 else 0 end) AS ‘第三组’ ,
sum(case when salary<9999 and age<35 then 1 else 0 end) AS ‘第四组’
from db_job.tb_emp ;

16 什么是IOC?
IOC就是控制反转, 以前一个类需要调用另外一个类的时候,会在代码中创建一个被调用者的对象。Spring里面,不需要在代码里面创建对象,spring会根据配置注入一个被调者的对象。所以就是把两个类依赖的控制权交给了spring容器,所以叫控制反转。 其中注入被调用者对象的过程就是依赖注入(DI)。

17 什么是AOP?
AOP就是面向切面编程。通常用来实现权限认证、日志、事务。

18.Spring Boot是什么?有什么作用?
Spring Boot是一个MVC 框架。
Spring Boot使编码变简单
SpringBoot帮助开发者快速启动一个Web容器 自带tomcat
Spring Boot使部署变简单

19 抽象类和接口的区别?

  1. 抽象类 里面可以有抽象方法,也可以有不抽象的方法
  2. 接口在1.8之前,所有方法都是抽象方法,1.8以后可以使用default修饰实现 不抽象的方法。
  3. 抽象类要被子类继承,接口要被类实现。
  4. 一个类可以实现多个接口,但只能继承一个抽象类

20. hashmap hashtable区别

hashmap是线程不安全

hashtable线程安全

21 arraylist linkedlist区别

arraylist是数组结构,查询比较快,插入,删除效率不高

linkedlist是链表结构 插入,删除效率高, 查询效率不高

22 spring mvc 执行流程
我们用的是SpringBoot,没有用过spring mvc.

在这里插入图片描述

23.spring 的理解

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

24 jquery 主要的方法

  • $.ajax() 执行 ajax用的通用方法
  • $.get() 执行 ajax用的get方法
  • $.post() 执行 ajax用的get方法
  • append(content|fn) 向每个匹配的元素内部追加内容。 动态添加html内容
  • ready jquery加载完成以后,会立刻自动执行ready方法
  • hide()方法, 隐藏匹配的html 元素
  • show()方法, 显示匹配的html 元素

25 jquery 怎样动态添加html元素
使用append方法

26 jquery有哪几个选择器

  • $(#id) id 选择器
  • $(元素名字) 元素选择器,比如 $.(“button”) 表示选择所有按钮
  • $(.class) 里面用"." 开始,表示样式选择器,根据class的名字查找

27 ajax是什么

ajdax可以实现前端请求后台的API, 并且可以异步执行。

28. sql优化
主要是查询语句优化,包含 在经常使用的过滤字段上添加索引,提高查询效率。
写查询语句的时候要避免导致索引失效,比如 in, 需要用exist代替。

29 .redis主要用于什么

1,会话缓存(最常用),代替session的功能,解决负载均衡的时候,多个java服务器之间,登录人的信息共享问题。
2,消息队列,
比如支付3,活动排行榜或计数
4,发布,订阅消息(消息通知)
5,商品列表,评论列表等
6. 查询结果缓存

30 Redis数据类型有哪些?
一共5个
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合

31 springcloud有哪些组件?

  • SpringCloud Eureka 服务注册与发现
  • 客服端负载均衡——Netflix Ribbon
  • 断路器——Netflix Hystrix
  • 服务网关——Netflix Zuul
  • 分布式配置——Spring Cloud Config

32 为什么采用分布式,不用可以吗
用分布式是把复杂的业务项目,拆分成很多小的微服务项目。
不用分布式也可以, 只是项目越来越大的时候,每次更新部署,全部代码都需要打包重新部署增加部署的难度和风险,另外项目代码太大,也影响后续产品新需求的迭代效率。

33 leftjoin innerjoin的区别
leftjoin 是外连接,查询结果是左边全部加 条件匹配的数据
innerjoin是内连接,查询结果,只有 条件匹配的数据

34 工作中碰到最大的困难

35、构造方法能被继承吗?为什么?

不能继承,
构造方法的方法名与类名必须一样,父子类不能同名,故不能继承 更不可能被重写 可以重载。

36、捕获异常的时候 finally在什么时候执行?要是try里面的语句没有执行,finally还会执行吗?

只有try执行了finally永远都会被在最后执行,要是try没有执行,那finally也不会执行。

37、获取string的长度,获取数组的长度?

string是length方法
数组有length属性

38 hashcode的重写

重写equals方法一定重写hashcode

equals方法返回true,那么两个对象的hashcode一定相同

两个对象的hashcode相同, equeals方法不一定返回true.

39.排序算法有几种?麻烦至少说出3种?

冒泡排序
选择排序
归并排序

40 .举一个简单的例子来说明一下封装

把现实中的东西,比如一直猫,我们会先把猫抽象成一个java类 ,类的名字是cat.
然后,我们把某只具体的猫的静态属性和动态行为封装到一个对象,比如 我家的白猫,我们可以把猫的颜色,体重等等属性封装到一个对象。

41 唯一约束和主键

唯一约束是指 数据不能重复, 如果一个字段是主键,那么这个字段就包含了唯一约束,同时还包含索引等功能。

42. wait()和sleep()的区别?

  1. wait()方法是Object类的方法
  2. 执行wait方法必须有对象monitor 也就是说wait方法一般是sysn里面使用
  3. wait()方法会释放对象锁
  4. sleep不会释放对象锁
  5. sleep方法是Thread类的方法

43 Object类上有哪些常用方法?

    1. wait和notify方法 ,wait方法可以让线程等待,直到另外一个线程执行notify方法。 wait会释放对象锁。
    1. toString方法,把对象转成字符串,默认会答应 对象的内存地址
    1. equals方法 ,默认情况比较两个对象的内存地址和==是一样的效果。但是equals方法可以被重写
    1. hashCode 方法返回对象的hashcode值, 重写equals方法一定要重写hashcode方法 确保equals方法返回true,那么两个对象的hashcode一定相同, hashcode相同,equals方法可以是true也可以是false;

44 几个常见错误

  • ClassNotFoundException 类找不到。使用反射创建对象的时候,如果对象不存在就会报这个错误。比如Class.forName(“com.xsz.exception.Test222”); 括号里面的类如果没有,就会报ClassNotFoundException
  • OutOfMemoryEorror, 内存溢出,如果系统内存不够的时候会报这个错误,一般如果缓存太多,比如我们使用hashmap缓存数据,忘记清除的时候,hashmap越来越大,系统运行久了就会报OutOfMemoryEorror
  • StackOverFlow, 栈溢出, 每次执行一个方法jvm会在java栈里分配一块内存,如果方法里面调用方法的层级太多就会栈溢出,比如方法调用方法的时候,不小心写了死循环,就会报这个错误
  • NullPointException 空指针异常, 如果一个变量没有实例化,只是是声明了,也就是说这个变量的值是null,然后我们代码里面这个变量直接去执行方法的时候就会报空指针异常。 User u; u.equals(a) 这个代码对象u只是声明了,没有实例化,值其实还是null。
  • ArrayIndexOutofBound,数组越界,比如我们有一个长度是3的数组,那么最大的下标应该是2,代码种如果试着去获取这个数组下标是3的值就会报数组越界

45 去掉字符串中的数字

String a=“abcd23424fg456”;
//去掉数字, 正则表达式中\d表示匹配数字
String b= a.replaceAll("\d","")

46 为什么用要springCloud做微服务

据我所知,目前实现微服务的技术方式,大致分两个派系,一个是国际上用的SpringCloud,另外一个是阿里的Dubbo. SpringCloud是spring公司的,提供了 微服务需要的几乎所有的组件,比如Eurake服务注册中心, Ribbon负载均衡,统一网关zuul等等。 Dubbo国内用的比较多,然后微服务直接通信采用RPC,而Ribbon是通过http通信。 RPC是长连接,http是短连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值