2022/12/28,今天是人生第一次面试。坐了2个小时的地铁去面试结果却很惨。一开始进门就笔试,当看到笔试题时发现很多基础,平时耳熟能详的词汇却怎么样也回答不出来。做了一个多小时,当面试官把题改了以后一句笔试没过。说真的在出门的那一刻感觉很绝望,难受,甚至出现人生毫无希望的感觉。但人生总要继续,能做的就是尽可能的完善自身的能力。
这是面试题很简单,但做的时候却是另一种感觉:
第一题:当时有点懵,后来才发现就是考整数类型范围。因为a*a=2^126次方所以这里基本数类型已经不能满足只有使用java.math包中的BigInteger和BigDecimal两个类。
这两个类可以处理包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算
第二题:这题很简单,但是如果你没有注意就会错误。这是我错误的代码(很蠢)
public static void main(String[] args) {
List<String> list =new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("s");
list.add("s");
String str="s";
for (int i=0;i< list.size();i++){
if (str.equals(list.get(i))){
list.remove(i);
}
}
}
这里虽然remove了一个s,但是后面的s字符串会前移导致出现有一个s删不掉。
所以你需要在remove一个s之后然i前移一位。
即
public static void main(String[] args) {
List<String> list =new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("s");
list.add("s");
String str="s";
for (int i=0;i< list.size();i++){
if (str.equals(list.get(i))){
list.remove(i);
i--;
}
}
}
第三题:一个http请求的经过的顺序应该为
Tomcat -> Filter ->Interceptor ->Aop->Controller->servlet
第四题:我当时答的是double(平时没注意,随意答的),后面百度才发现要用decimal数据类型,Decimal是专门为财务相关问题设计的数据类型,它实际上是以字符串的形式存放的,可在定义时划定整数部分以及小数部分的位数。
第五题:当时只能手写,不能看见结果。并且自己的sql能力不行,所以基本上就是瞎写。后来在网上查了一下这里需要将列转为行字段才能实现。
select c.`学生编号`,c.`学生姓名`,c.`语文`,c.`英语`,c.`数学`,
(c.`语文`+c.`英语`+c.`数学`)/3 as '平均分',
(c.`语文`+c.`英语`+c.`数学`) as '总分'
from
(select
p.s_id '学生编号',
p.s_name '学生姓名',
MAX(IF(p.c_name = '语文',p.s_score,NULL)) as 语文,
MAX(IF(p.c_name = '英语',p.s_score,NULL)) as 英语,
MAX(IF(p.c_name = '数学',p.s_score,NULL)) as 数学
from
(select a.s_id,s_name,c_name,s_score
from student as a
right join score as b on a.s_id=b.s_id
right join course as c on b.c_id=c.c_id
)p
group by p.s_id)c;
第六题:
select * from student where s_id in
(select s_id from score where c_id in
(select c_id from course where t_id in
(select t_id from teacher where t_name='张三')))
第七题:
select a.s_id '学生编号',s_name '学生姓名',选课总数,总成绩
from student as a right join
(select s_id,count(c_id) '选课总数' from score group by s_id)b
on b.s_id=a.s_id
right join
(select s_id,sum(s_score) '总成绩' from score group by s_id)c
on b.s_id=c.s_id
第8题:
事务的隔离级别
- 读未提交(READ UNCOMMITTED)
- 读已提交(READ COMMITTED)
- 可重复读(REPEATABLE READ)
- 可串行化(SERIALIZABLE)
事务的隔离级别详解
第9题:
- 修饰类:该类不能被继承
- 修饰方法:表示方法不能被重写
- 修饰变量:表示为常量
第10题:
- 继承Thread实现多线程
- 实现Runnable接口重写run方法,解决单继承局限与多线程处理共享资源问题
- 实现Callable接口重写call方法,在Runnable基础上增加了返回值
- 通过线程池启动多线程,提升系统的性能以及使用率。
第11题:
- 饿汉式单例
public class Singleton {
public Singleton() {
}
//饿汉式单例
private static Singleton singleton =new Singleton();
private Singleton getSingleton(){
return singleton;
}
}
- 烂汉式单例
public class Singleton {
public Singleton() {
}
//懒汉式单例,存在线程安全问题
private static Singleton singleton =null;
private static synchronized Singleton getSingleton(){
if (singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
- 登记式单例(略)
第12题:不属于
8大基本数据类型:byte,short,int,long,boolean,char,float,double
第13题:
基本数据类型:byte,short,char,int
包装数据类型:Byte,Short,Character,Integer
枚举类型:Enum
字符串类型:String
第14题:
List中的元素,有序,可重复,可为空
Set中的元素,无序,不可重复,只有一个空元素
Map中的元素,无序,键不重复,值可重复,可以有一个空键
第15题:当时对这个问题只有一点印象了,其它细节完全忘记。
- BIO是面向流的,NIO是面向块(缓冲区)
- BIO的流都是同步阻塞,而NIO是同步非阻塞的
- NIO是等待数据全部传输过来再让线程处理,BIO是直接让线程等待
- NIO有选择器,而BIO没有
- NIO是采用管道和缓冲区的形式来处理数据的,而BIO是采用输入输出流来处理的
- NIO是可以双向的,BIO只能够单向
BIO每次网络请求过来之后,服务器都会这个请求创建一个线程,这个线程会一直等待这个请求数据,等处理完成之后才会销毁这个线程。
NIO,网络请求过来时服务器不会马上创建一个线程去处理这个请求,而是交给一个Selector线程,只有请求数据全部传输完成,Selector才会通知其他线程或者创建一个线程来处理请求。关于NIO与BIO的更多知识
第16题:Java只支持单继承
第17题:由于是手写,我感觉连冒泡排序都写错了。。。。
for (int i=0;i<array.length-1;i++){
for (int j=0;j<array.length-i-1;j++){
if (array[j]>array[j+1]){
int temp=array[j];
array[j]=array[j+1];
array[j+1]=temp;
}
}
}
第18题:使用wait()方法来阻塞线程,使用notify()和notifyAll()方法来唤醒线程。
第19题:&&的短路功能,当第一个表达式的值为false的时候,则不再计算第二个表达式;&则两个表达式都执行。
第20题:
“==” 基本类型比较值,引用类型比较地址
equals :如果没有重写就是比较地址,重写就是按照重写的要求进行比较
第21题:
1.原子性(Atomicity)
2.一致性(Consistency)
3.隔离性(Isolation)
4.持久性(Durability)
第22题:将括号内的数+0.5之后,向下取值
所以就是 12 与 -11。
这次基础忘了很多,八股文也没有背。下次尽力