2019面试问题总结
一、JDBC操作流程
1、 定义driver,url,user,password,加载数据库驱动DriverManager
2、 创建并获取数据库链接Connection
3、 创建jdbc statement对象
4、 设置sql语句
5、 设置sql语句中的参数(使用preparedStatement)
6、 通过statement执行sql(executeQuery等方法),并获取结果集ResultSet
7、 对sql执行结果进行解析处理
8、 释放资源(resultSet、preparedstatement、connection)
jdbc问题总结如下:
1、 数据库链接创建和释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。
3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。
4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
二、单例模式的实现方式:
参考文章:https://www.cnblogs.com/ngy0217/p/9006716.html
三、输出9*9乘法口诀
public static void main(String[] args) {
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(j+"*"+i+"="+(i*j)+"\t");
}
System.out.println();
}
}
四、JDK、JRE和JVM的联系和区别
JDK(Java Development Kit)是针对Java开发人员的产品,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。Java Runtime Environment(JRE)是运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。JVM是Java Virtual Machine(Java虚拟机)的缩写,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。
详见文章:https://www.cnblogs.com/zhangzongxing01/p/5559126.html
五、求其中每个字母出现的次数。 String String str =“2342asfghgyu56asdasda”
public static void main(String[] args) {
String str ="2342asfghgyu56asdasda";
Map<String,Integer> maps = new HashMap<String,Integer>();
for(int i=0;i<str.length();i++){
String key = String.valueOf((str.charAt(i)));
if(!maps.containsKey(key))
maps.put(key, 1);
else{
int val =maps.get(key);
maps.put(key, val+1);
}
}
for(Map.Entry i : maps.entrySet()){
System.out.println(i.getKey()+ "=="+i.getValue());
}
}
六、get和post的区别
详见:https://blog.csdn.net/qq_41939384/article/details/87628188
七、线程和进程的区别
根本区别:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。
在开销方面:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。
所处环境:在操作系统中能同时运行多个进程(程序);而在同一个进程(程序)中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)
内存分配方面:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线程组之间只能共享资源。
包含关系:没有线程的进程可以看做是单线程的,如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。
八、如何实现跨域
详见:https://blog.csdn.net/meism5/article/details/90414283
九、什么是servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
相比于 CGI,Servlet 有以下几点优势:
性能明显更好。
Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
Servlet 是独立于平台的,因为它们是用 Java 编写的。
服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
十、对HashMap的理解
HashMap 是一种存取高效但不保证有序的常用容器。它的数据结构为“数组+链表”,是解决哈希冲突的产物,也就是我们常说的链地址法。它实现了Map 接口采用K-V 键值对存储数据,并实现了浅拷贝和序列化。
在第一次添加操作中,HashMap 会先判断存储数组有没有初始化,如果没有先进行初始化操作,初始化过程中会取比用户指定的容量大的最近的2 的幂次方数作为数组的初始容量,并更新扩容的阈值。
解决并发问题可以采用
Java 类库提供的Collections 工具包下的Collections.synchronizedMap()方法,返回一个线程安全的Map。或者使用并发包下的 ConcurrentHashMap,ConcurrentHashMap采用分段锁机制实现线程安全。使用HashTable (不推荐)
Hash1.7 和1.8 最大的不同在于1.8 采用了“数组+链表+红黑树”的数据结构,在链表长度超过8 时,把链表转化成红黑树来解决HashMap 因链表变长而查询变慢的问题。
十一、MVC模式的理解
MVC 是 Model - View - Controller 的简称, 即模型-视图-控制器, MVC 是一种设计模式它强制性的把应用程序中的输入, 处理 和 输出分开。MVC中的 模型, 视图, 控制器分别承担不同的任务。
视图: 就是用户看到并与之交互的页面, 视图向用户显示相关的数据 , 并接收用户的数据, 视图不进行任何业务逻辑处理
模型: 模型表示业务数据 和 业务处理, 相当于 JavaBean …一个模型能为多个 视图 提供数据, 这提高了应用程序的重用性
控制器: 当用户点击 Web 页面中提交按钮时, 控制器接收请求并调用相应的模型去处理请求,然后根据处理的结果调用相应的视图来显示处理的结果
MVC的处理流程: 首先控制器接收用户的请求, 调用相应的模型来进行业务处理, 并返回数据给控制器,控制器调用相应的视图来显示处理的结果 , 并通过视图呈现给用户
它的优势在与: 开发人员可以只关注整个结构中的某一层, 可以很容易的用新的实现来替换原有层次的实现,可以降低层与层之间的依赖,有利于标准化,利于实现各层逻辑的复用。
十二、什么是反射
Java反射就是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;并且能改变它的属性。而这也是Java被视为动态(或准动态,为啥要说是准动态,因为一般而言的动态语言定义是程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言。从这个观点看,Perl,Python,Ruby是动态语言,C++,Java,C#不是动态语言。)语言的一个关键性质。
我们知道反射机制允许程序在运行时取得任何一个已知名称的class的内部信息,包括包括其modifiers(修饰符),fields(属性),methods(方法)等,并可于运行时改变fields内容或调用methods。那么我们便可以更灵活的编写代码,代码可以在运行时装配,无需在组件之间进行源代码链接,降低代码的耦合度;还有动态代理的实现等等;但是需要注意的是反射使用不当会造成很高的资源消耗。
十三、抽象类和普通类的区别
1.抽象类不能被实例化。
2.抽象类可以有构造函数,抽象方法不能被声明为静态。
3.抽象方法只需声明,而无需实现,抽象类中可以允许普通方法有主体。
4.含有抽象方法的类必须申明为抽象类。
5.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。