java开发工程师面试题小汇总(二)
一、IOC实现流程:
1.概念:IOC是一种新的编程思想,意为控制反转,原先由我们主动控制的内容交给spring容器进行管理,而对对象控制的主要实现是根据依赖注入来实现的。
2.流程:
//使用JDOM解析beans.xml配置文件
//1.创建一个SAXBuilder解析器的对象SAXBuilder saxBuilder = new SAXBuilder();
//2.创建一个输入流,将xml文件加载到输入流中,通过saxBuilder的build方法,将输入流加载到saxBuilder中Document document = saxBuilder.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
//3.通过document对象获取xml文件的根节点Element element = document.getRootElement();
//4.获取到子节点
//5.遍历集合
String id = ele.getAttributeValue("id");//u
String clazz = ele.getAttributeValue("class");
(1)//将clazz转换为Object对象
Object o = Class.forName(clazz).newInstance();
(2)//将获取到的id和o对象保存到Map集合中
map.put(id, o);
(3)//获取到property子节点
for (Element propertyElement : ele.getChildren()) {
String name = propertyElement.getAttributeValue("name");
String bean = propertyElement.getAttributeValue("bean");
(4)//从map集合中,获取到AdminDaoImpl对象
Object beanObject = map.get(bean);
(5)//模拟拼接 public void setAdminDao(AdminDao adminDao) 通过反射调用AdminServiceImpl对象中的setAdminDao(AdminDao adminDao)方法
String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
Method method = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
(6)//调用方法
Object invoke = method.invoke(o, beanObject);
二、Vue生命周期
1、创建前(beforeCreate)
2、创建后(created)
3、载入前(beforeMount)
4、载入后(mounted)
5、更新前(beforeUpdate)
6、更新后(updated)
7、销毁前(beforeDestroy)
8、销毁后(destroyed)
三、mybetis中#{}和${}的区别
#{ } 占位符
1.使用的 JDBC 对象是PreparedStatement 对象,执行sql语句的效率更高,使用预编译处理。
2. 使用PreparedStatement 对象,能够避免 sql 注入,使得sql语句的执行更加安全。
$占位符的特点
1. MyBatis处理 ${ } 占位符,使用的 JDBC 对象是 Statement 对象,执行sql语句的效率相对于 #{ } 占位符要更低。
2. ${ } 占位符的值,使用的是字符串连接的方式,有 sql 注入的风险,同时也存在代码安全的问题。
3. ${ } 占位符中的数据是原模原样的,不会区分数据类型。
4. ${ } 占位符常用作表名或列名,这里推荐在能保证数据安全的情况下使用 ${ }。
四、数据结构中的冒泡排序
int[] a=new int[]{7,4,3,8,5,9,6};
for (int i = 0; i < a.length; i++) {
for (int j = 0; j < a.length - i-1; j++) {
int temp;
if (a[j+1]>a[j]){
temp=a[j+1];
a[j+1]=a[j];
a[j]=temp;
} }}
System.out.println(Arrays.toString(a));
五、数据结构二叉树遍历
先序遍历 DLR (依次遍历:根结点,左子树,右子树)
中序遍历 LDR (依次遍历:左子树,根结点,右子树)
后序遍历 LRD (依次遍历:左子树,右子树,根结点)
不会的私聊讲解
六、计算机网络通信协议
TCP/IP参考模型 对应协议
应用层 HTTP、FTP
传输层 TCP、UDP
网络层 IP、ICMP
物理+数据链路层 Link
要素:
TCP协议:
1.使用前,必须建立TCP连接,形成传输数据通道
2.传输前,采用三次握手的方式,点对点通信,是可靠的
3.TCP协议进行通信的两个应用进程:服务端、客户端
4.在连接中可以进行大数据量的传输
5.传输完毕,需释放已建立的连接,效率低
UDP协议:
1.将数据、源、目的封装成数据包,不需要建立连接
2.每个数据报的大小限制在64k以内
3.不管对方是否准备好,接收方收到也不确认,是不可靠的
4.可以广播发送
5.发送结束时,无需释放资源,开销小,速度快
七、三次握手、四次挥手
1.三次握手:
第一次握手:向TCP服务器进程发送TCP连接请求报文段,进入同步已发送状态。
第二次握手:同意建立连接,则向TCP客户进程发送TCP连接请求确认报文段,进入同步已接收状态。
第三次握手:TCP客户进程收到TCP连接请求确认报文段后,还要向TCP服务器进程发送一个普通的TCP确认报文段,并进入连接已建立状态。
2.四次挥手:
第一次挥手:TCP客户进程会发送TCP连接释放报文段,进入终止等待状态;
第二次挥手:TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态。
第三次挥手:TCP服务器进程发送TCP连接释放报文段并进入最后确认状态。
第四次挥手:TCP客户进程收到TCP连接释放报文段后,必须针对该报文段发送普通的TCP确认报文段,之后进入时间等待状态。
八、java8新特性
1.Lambda表达式
2.Stream API
(1)通过集合
①调用stream()返回一个顺序流
②调用parallelStream()返回一个并行流
(2)通过数组:调用Arrays静态方法stream()获取数组流
(3)通过Stream静态方法of()显示值创建一个流,可以接受任意数量的参数
(4)创建无限流
①迭代:Stream类中的iterate静态方法
②生成:Stream类中的generate静态方法
3.方法引用
(1).使用:当要Lambda体的操作,已经有实现的方法了,可以使用
(2).格式:类/对象::方法名
(3).类别
①对象::非静态方法
②类::静态方法
③类::非静态方法
注意:对于①和②要求接口中的抽象方法的形参列表和返回值与方法引用的形参列表和返回值相同。
4.Optional类:为了避免出现空指针而创建。
九、不创建新的变量互换字符串变量
public class SwapTwoStrings {
public static void main(String[] args) {
String s1 = "java";
String s2 = "guides";
// 第一步: concat s1 + s2 and s1
s1 = s1 + s2; // javaguides // 10
// 第二步: 将 s1 的初始值存储到 s2 中
s2 = s1.substring(0, s1.length() - s2.length()); // 0, 10-6 //java
// 第三步: 将 s2 的初始值存储到 s1 中
s1 = s1.substring(s2.length());
System.out.println(" s1 => " + s1);
System.out.println(" s2 => " + s2);
String s1 = "guides";
String s2 = "java";
}
}
十、在不创建第三个变量的情况下,交换两个变量的值
public static void main(Sting[] args) {
int a=7;
int b=11;
a=a^b;
b=b^a;
a=a^b;
System.out.println("a:"+a); //11
System.out.println("b:"+b); //7
}