欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019面试问题总结

程序员文章站 2024-03-20 14:59:22
...

一、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)
2019面试问题总结

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语言写作的软件程序。
2019面试问题总结
详见文章: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.抽象的子类必须实现抽象类中所有抽象方法,否则这个子类也是抽象类。