某网络科技面试题

1、jdk jre的区别

JDK:
Java Develpment Kit java 开发工具
JRE:
Java Runtime Environment java运行时环境
JVM:
java Virtual Machine java 虚拟机

jdk 是给开发人员使用的, jre和jvm是给普通用户使用,如果只是运行Java程序,安装JRE即可
JDK:
是java开发工具包,是Sun公司针对java开发人员的产品,jdk中包含jre,在jdk的安装目录下有一个jre的目录,里面有两个文件夹bin和lib,在这里可以认为bin里面就是jvm,lib中是java工作需要的类库,而java和lib合起来就称为jre
JDK(Java Development Kit) 是整个JAVA的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即Java API 包括rt.jar)。

2、spring 特性

三大特征:AOP、IOC、DI
(1)IOC:控制反转。
概念:控制反转。将创建对象的权利交给Spring来进行处理。
作用:解耦(减低程序间的耦合性)。
优缺点:
A、优点:
解耦,降低程序间的依赖关系;
B、缺点:
使用反射生成对象,损耗效率。
实现步骤:
创建Spring主配置文件,并添加约束;
在主配置文件中,使用<context:component-scan>标签,标明使用IOC的类所在的包;
使用注解标注IOC的类;
使用注解依赖注入的数据;
获取bean对象,并使用。
涉及的注解:
@Component //用于标注一般类
@Controller //用于标注表现层的类
@Service //用于标注业务层的类
@Repository //用于标注持久层的类
@Autowired //自动按照类型注入
@Qualifier //在按照类中注入的基础之上, 再按照名称注入
@Resource //直接按照bean的id注入br/>(2)AOP:面向切面编程
概念:
面向切面编程。简单描述就是:将程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对自己的已有方法进行增强。
作用:
在程序运行期间,不修改源码对已有方法进行增强。
实现方式:
使用动态代理技术。主要包括JDK实现动态代理(基于接口的动态代理)、CGLIB实现动态代理(基于子类动态代理)。
AOP相关术语:
①、JoinPoint(连接点):指那些被拦截到的点。(在Spring中这些点指的是方法,因为Spring只支持方法类型的连接点)。
②、PointCut(切入点):指的是要对哪些JoinPoint进行拦截的定义。
③、Advice(通知/增强):指拦截到JoinPoint之后所要做的事情。
④、Target(目标对象):代理的目标对象。
⑤、Weaving(织入):指把增强应用到目标对象来创建新的代理对象的过程。
spring采用动态代理织入;
Aspect采用编译器织入和类装载期织入。
⑥、Aspect(切面):是切入点和通知的结合。
通知:
前置通知:在切入点方法执行之前执行。
后置通知:在切入点方法执行之后执行。它和异常通知永远只能执行一个。
异常通知:在切入点方法执行产生异常之后执行。它和后置通知永远只能执行一个。
最终通知:无论切入点方法是否正常执行,它都会在其后面执行。
涉及的注解:(Spring基于注解的AOP配置)
@Aspect:表示当前类是一个切面类。
@Before(“ptl()”):前置通知。
br/>@AfterReturning(“ptl()”):后置通知。
@AfterThrowing(“ptl()”):异常通知。
br/>@After(“ptl()”):最终通知。
@Around(“ptl()”):环绕通知。
(3)DI:依赖注入
作用:
减低程序间的耦合。
注入方式:
使用构造函数注入;使用set方法注入;使用注解。
能注入的数据:
基本类型和string,其他bean类型(在配置文件或者注解配置过的bean),复杂类型/集合类型。

3、string stringbuilder stringbuffer的区别

(1)String是只读字符串,底层是被final修饰了,意味着String引用的字符串内容是不能被改变的;
(2)StringBuffer和StringBuilder表示的字符串对象是可以直接修改的
(3)StringBuilder在单线程环境下使用的,因为它的所有的方法都没有被synchronized,因此效率理论上比StringBuffer要高。
在线程是否安全考虑:
String由于被final修饰了,对象不可变,线程安全,适用于少量的字符串操作。
StringBuffer,由于对调用的方法加入同步锁,所以属于线程安全,但是执行效率较慢,适用于多线程下的操作字符串缓冲区大量数据。
StringBuilder,线程不安全,适用于单线程下操作字符串缓冲区大量数据。
StringBuilder 与 StringBuffer 有公共父类 AbstractStringBuilder(抽象类)。
StringBuilder、StringBuffer 的方法都会调用 AbstractStringBuilder 中的公共方法,如 super.append。
只是 StringBuffer 会在方法上加 synchronized 关键字,进行同步。最后,如果程序不是多线程的,那么使用StringBuilder 效率高于 StringBuffer
注:java拼接字符,String用“+”,而StringBuilder和StringBuffer使用的是append方法连接字符串
实际上,通过研究代码可以发现,使用+,在编译时仍然转换成StringBuilder后使用append方法,所以在java中无论使用何种方法进行字符串连接,实际上都是使用StringBuilder。但是从运行结果看,+和StringBuilder是完全等效的,但是如果从运行效率和资源消耗上看,StringBuilder的方法会更加高效。
因为每次是用+,都是在编译的时候先转为StringBuilder后使用append,也就是说,创建了StringBuilder对象,java虽然有垃圾回收机制,但是这个机制工作时间是不定的,不断产生这样的垃圾,就会占用大量的资源,解决这个问题的方法就是在程序中直接使用 StringBuilder 来连接字符串。

4、jdbc连接数据库的流程

(1)加载JDBC驱动程序:
在连接数据库之前,首先要加载想要连接的数据库的驱动到JVM(Java虚拟机),这通过java.lang.Class类的静态方法forName(String className)实现。
(2)创建数据库的连接
要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象,该对象就代表一个数据库的连接。
(3)创建一个preparedStatement
要执行SQL语句,必须获得java.sql.Statement实例,Statement实例分为以下3 种类型:
1)执行静态SQL语句。通常通过Statement实例实现。
2)执行动态SQL语句。通常通过PreparedStatement实例实现。
3)执行数据库存储过程。通常通过CallableStatement实例实现。
(4)执行SQL语句
Statement接口提供了三种执行SQL语句的方法:executeQuery 、executeUpdate和execute
1)ResultSet executeQuery(String sqlString):执行查询数据库的SQL语句,返回一个结果集(ResultSet)对象。
2)int executeUpdate(String sqlString):用于执行INSERT、UPDATE或 DELETE语句以及SQL DDL语句,如:CREATE TABLE和DROP TABLE等
3)execute(sqlString):用于执行返回多个结果集、多个更新计数或二者组合的语句。
(5)遍历结果集
两种情况:
1)执行更新返回的是本次操作影响到的记录数。
2)执行查询返回的结果是一个ResultSet对象。
(6)处理异常,关闭JDBC对象资源
操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:
1)先关闭requestSet
2)再关闭preparedStatement
3)最后关闭连接对象connection

5、对mybatis的了解

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

6、throw和throws的区别

(1)throw 在方法体内使用,throws 在方法声明上使用;
(2)throw 后面接的是异常对象,只能接一个。throws 后面接的是异常类型,可以接多个,多个异常类型用逗号隔开;
(3)throw 是在方法中出现不正确情况时,手动来抛出异常,结束方法的,执行了 throw 语句一定会出现异常。而 throws 是用来声明当前方法有可能会出现某种异常的,如果出现了相应的异常,将由调用者来处理,声明了异常不一定会出现异常。

7、终止for循环的方式

(1)continue
(2)break
(3)return

8、break和continue的区别

(1)break指的是终止、结束循环;continue指的是本次的循环,进入下一次的循环。
(2)break可以用在任何地方,常与switch分支结构合用;continue只能用在循环结构中。

9、Java项目打包成jar包和war包的区别,什么情况打成jar,什么情况打成war

相同点:
都是压缩文件,用解压文件可以解压
不同点:
war是java web打的包,jar是java打的包
jar只用于java来写的项目打包,里面只有编译后的class文件和部署文件,相当于把类和一些相关资源封装到一个包中,便于程序中引用;war包括代码编译后的class文件,依赖的包,配置文件,所有网站页面,(html,jsp==),可以理解为一个web项目里面所有东西。

10、大数据json流解析

要保证内存溢出,那么就不能把得的数据全部存放在内存然后处理。
那么对于接口,实际响应报文也是一个数据流。我们是否可以边获取数据流,别解析JSON呢?
FastJson:JSONReader
我们首先看这个Reader的构造方法,正好是传入一个流,正好符合我们要求。