当前位置: 首页 > 面试经验 >

海康威视java面经

优质
小牛编辑
97浏览
2023-04-18

海康威视java面经

论文交了没事分享一下去年的面经

一面 技术面

1、自我介绍

2、讲一下实习的项目

3、讲一下序列化是什么

  • 序列化: 将数据结构或对象转换成二进制字节流的过程。序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。
  • 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程 (补充:对于不想进行序列化的变量,使用 transient 关键字修饰。transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。)

4、java怎么解析xml报文的

  • 传统的XML解析方式有DOM和SAX两种:
  • DOM方式会把整个XML报文读进来,并且所有节点全被自动加载到一个树状结构,以后每个节点值都到该树状结构中读取。
  • SAX方式不会事先读入整个XML报文,而是根据节点名称从报文起点开始扫描,一旦找到该节点的标记头位置,即刻往后寻找该节点的标记尾,那么节点标记头尾之间的数据便是节点值了。
  • 单就某个节点值的解析过程而言,加载所有节点的DOM方式显然较费功夫,从头顺序查找的SAX方式执行效率更高。但若要求同时获取多个节点的数值,则采取树状结构遍历的DOM方式总体性能更加,而每次都从头找起的SAX方式无疑做了重复劳动。总之两种方式的解析效果各有优劣,需要按照实际场景决定取舍。

5、mysql优化?

  • 1、避免全表扫描,首先考虑在where及order by的列上建立索引。
  • 2、尽量避免在where子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。
  • 3、尽量避免在where子句中使用or来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描, 可以使用UNION合并查询。
  • 4、in和not in也要慎用,否则会导致全表扫描,对于连续的数值,能用between就不要用in了。
  • 5、如果在where子句中使用参数,也会导致全表扫描。
  • 6、尽量避免在where子句中对字段进行表达式操作,应尽量避免在where子句中对字段进行函数操作。
  • 7、索引虽然可以提高相应的select的效率,但同时也降低了insert及update的效率,因为insert或update时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
  • 8、尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。
  • 9、尽量避免向客户端返回大数据量,若数据量过大,应该考虑相应需求是否合理。
  • 10、常见的简化规则如下:不要有超过5个以上的表连接(JOIN),考虑使用临时表或表变量存放中间结果。少用子查询,视图嵌套不要过深,一般视图嵌套不要超过2个为宜。
  • 11、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。
  • 12、尽量使用“>=”,不要使用“>”。
  • 13、尽量使用exists代替select count(1)来判断是否存在记录,count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。
  • 14、sql语句用大写,因为oracle 总是先解析sql语句,把小写的字母转换成大写的再执行。
  • 15、别名的使用,别名是大型数据库的应用技巧,就是表名、列名在查询中以一个字母为别名,查询速度要比建连接表快1.5倍。
  • 16、避免死锁,在你的存储过程和触发器中访问同一个表时总是以相同的顺序;事务应经可能地缩短,在一个事务中应尽可能减少涉及到的数据量;永远不要在事务中等待用户输入。
  • 17、MySQL查询可以启用高速查询缓存。这是提高数据库性能的有效Mysql优化方法之一。当同一个查询被执行多次时,从缓存中提取数据和直接从数据库中返回数据快很多。
  • 18、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

6、mysql优化的效果怎么查看?

  • explain查看执行效果

7、发送报文后网线被拔掉了会发生什么?

  • 针对这个问题,要分场景来讨论: 拔掉网线后,有数据传输;拔掉网线后,没有数据传输;
  • 拔掉网线后,有数据传输 在客户端拔掉网线后,服务端向客户端发送的数据报文会得不到任何的响应,在等待一定时长后,服务端就会触发超时重传机制,重传未得到响应的数据报文。如果在服务端重传报文的过程中,客户端刚好把网线插回去了。由于拔掉网线并不会改变客户端的 TCP 连接状态,并且还是处于 ESTABLISHED 状态,所以这时客户端是可以正常接收服务端发来的数据报文的,然后客户端就会回 ACK 响应报文。此时,客户端和服务端的 TCP 连接依然存在的,就感觉什么事情都没有发生。但如果如果在服务端重传报文的过程中,客户端一直没有将网线插回去。服务端超时重传报文的次数达到一定阈值后,内核就会判定出该 TCP 有问题,然后通过 Socket 接口告诉应用程序该 TCP 连接出问题了,于是服务端的 TCP 连接就会断开。等客户端插回网线后,如果客户端向服务端发送了数据,由于服务端已经没有与客户端相同四元祖的 TCP 连接了,因此服务端内核就会回复 RST 报文,客户端收到后就会释放该 TCP 连接。此时,客户端和服务端的 TCP 连接都已经断开了。
  • 拔掉网线后,没有数据传输 如果双方都没有开启 TCP keepalive 机制,那么在客户端拔掉网线后,如果客户端一直不插回网线,那么客户端和服务端的 TCP 连接状态将会一直保持存在。如果双方都开启了 TCP keepalive 机制,那么在客户端拔掉网线后,如果客户端一直不插回网线,TCP keepalive 机制会探测到对方的 TCP 连接没有存活,于是就会断开 TCP 连接。而如果在 TCP 探测期间,客户端插回了网线,那么双方原本的TCP 连接还是能正常存在。
  • KeepAlive机制:当连接超过一段时间没有数据传输之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为连接丢失,没有必要保持连接。

8、java怎么发送http请求?

  • 通过JDK网络类Java.net.HttpURLConnection简介:java.net包下的原生java api提供的http请求
  • 使用步骤: 1、通过统一资源定位器(java.net.URL)获取连接器(java.net.URLConnection)。2、设置请求的参数。3、发送请求。4、以输入流的形式获取返回内容。5、关闭输入流。

9、aop的应用场景

  • 记录日志
  • 监控方法运行时间
  • 权限控制
  • 缓存优化
  • 事务管理

10、java使用jdbc的顺序:

  • 1):注册驱动 (告诉Java要连接什么数据库)
  • 2): 获得连接 (表示JVM的进程与数据库之间的通道打开)
  • 3): 获得数据库操作对象 (它专门执行sql语句的对象)
  • 4): 执行sql 语句
  • 5): 处理查询结果集 (只有执行select 语句才有的步骤)
  • 6): 释放资源 (使用完后,一定要关闭)

11、观察者模式

  • 观察者模式,也被称为发布订阅模式,是一种行为型设计模式,也是在实际的开发中用得比较多的一种模式,当对象间存在一对多关系时,就可以使用观察者模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象(观察者对象)都得到通知并被自动更新。

12、单例模式

  • 单例模式有以下特点: 单例类只能有一个实例;单例类必须自己创建自己的唯一实例;单例类必须给所有其他对象提供这一实例;
  • 优缺点: 优点:由于单例模式只生成了一个实例,所以能够节约系统资源,减少性能开销,提高系统运行效率。缺点:因为系统中只有一个实例,导致了单例类的职责过重,违背了“单一职责原则”,同时不利于扩展。
  • 该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

13、工厂模式

  • 工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式

14、怎么确保多线程的共享变量的可见性

  • Java中可以通过synchronized、volatile、java concurrent类来实现共享变量的可见性。

15、反问(结束,31分钟)

#海康威视#
 类似资料: