面试总结(一)
终于想起来总结一下了,面试这么多,也没点总结感觉就像白面了一样,下面结合最近的面试,不限于这几次,还可能有当初第一次面阿里巴巴的(天知道一个什么都不懂的小屁孩为什么敢去面阿里巴巴),来做一个系列吧,毕竟请了这么多天假,怎么也得有个交代。
2019年9月24日面试Java开发工程师
首先还是简单的自我介绍,主要介绍了从大二开始的开发路程,实习经历和项目经历,没有讲的太深,面试官根据所讲和简历进行了提问:
1、、你说你用过Redis,是做的集群还是什么,如果要存储一个对象要怎么存储
我说我主要是做缓存的,如果存储一个对象,需要首先搭建redis服务端,引入redis对象,也要把依赖导进去,以及json的依赖。
然后简历一个redis对象:
Redis redis = new Redis(host, port);
Redis.select(1);
然后又两种方式:
1、经常使用的——把对象转换成json字符串格式
用jsonString(Redis redis, Person person);
对象转字符串:
String value = new Json(),toJson(person);
Reids.set(key, value);
String sValue = Reis.get(key);
字符串转对象:
Person person2 = new Json().formJson(Person.class, sValue);
总之,当我们在CMD中使用Redis来get的时候可以转换为:
{
"age" : "18","name" : "Alex","weight" : "85"
}
是不是很眼熟,就是我实习所用的json报文,所以序列化,就是先将对象转换成json格式的报文。
2、把对象转换成字节流格式——反序列化和序列化
这里我在实习中遇到过,但是遇到的是问题,就是使用fastjson序列化和反序列化的时候,对象中还嵌套着对象,也就是:
{
"age" : "18","name" : "Alex",{
"age" : "18","name" : "Alex","weight" : "85"}"weight" : "85"
}
这种类似格式,所以要在配置文件中更改,忽略反序列化的问题:
报错$ref,对象重复引用(更严重的可能循环引用),出现了:
{
"age" : "18","name" : "Alex",{
"$ref" : "0"}"weight" : "85"
}
在全局配置中, String string = JSON.toJSONString(list,SerializerFeature.DisableCircularReferenceDetect);把DisableCircularReferenceDetect配置上就ok了。
接下来接着说序列化和反序列化。
反序列化和序列化用于那种数据量很大,大约10W字节的那种,尤其是fastjson,可以总体配置
序列化就是通过你新建的HashMap来导入对象,通过里面的object.add、object.put什么的方法进行序列化(有点简单说的)。。。
补充:Redis搭建集群:
1、创建redis实例(也就是创建redis节点),执行脚本,更改端口号,修改端口等等有教程。
2、ruby脚本文件——放在redis-trib.rb。在redis解压文件的源代码里(需要安装ruby的运行环境 用yum)
3、执行ruby脚本,对每个redis节点进行配置。
4、查看当前节点信息,cluster info | cluster nodes
2、Spring中的IOC(控制反转)和AOP(切面编程)
这道题之前是有看过的,结果时间比较长,忘记的差不多了快,就记得一个什么依赖反转(其实是JVM或者说Java设计模式的依赖反转)
那么IOC的机制是怎样的呢。
我当时也就脑子一热,从request接受 到 BeanFactrory加工成Bean,再在Handler里处理。说的比较浅显,那么真正意义上,bean工厂,或者我们说 IOC的过程,或者更详细些,IOC中bean的生命周期是怎样的呢:
1、初始化,通过@Bean注解,确定<Bean init-method = " ",destroy-method = " ">
2、实现初始化和销毁方法。
3、使用@PreConstruct:在bean创建完成并且属性赋值完成,来执行初始化方法。@PreDestroy:在销毁bean时通知我们进行垃圾清理。
4、BeanPostProcessor(bean的后置处理器,一个接口),在bean初始化前后做一些处理工作。
应用到实例中,就是你建立一个A,a public A {}在其中 我们用比如说@Excel来private T(List list){ T, t} 然后加入public getx(Respones respones),通过这个T来将A,a反射到process中,同时A成为A.class。
AOP机制
对于切面(Aspect)、切点(Pointcut)可以选择在joint point(连接点)之前之后要做的操作。
before、after、around来区别之前、止呕、代替执行。
//后面继续完善。
3、一个比较基础的问题,但是我一直很迷糊:静态常量和实例常量的区别
这可能是个Java初学者认真听课或者认真注意就会的知识点,我这两年算是白过了=-=。
首先看静态变量,静态变量储存在静态存储区,在程序开始时创建,在程序结束时销毁;可以在静态语句块中初始化;可以通过.ClassName.VariableName访问;是公共的。
实例变量:自己用自己的。
堆区:所有线程共享,存的是对象本身;JVM只有一个堆区(heap)
栈区:一个线程一个栈区,保存基础数据类型的对象和自定义对象的引用。
静态区:所有线程共享,包含所有的class和static变量;运行时在常量池。
常量池:定义的基本类型(int)和对象型(string、 数组)的常量值;
4、能简单说一下数据库分页吗
在实习岗位上我做的好多都是