Java基础面试题

java基础

1.List,set,Map的区别

有序和无序的理解:即是否按照元素添加的顺序来存储对象。

  • List按对象进入的顺序保存对象,不做排序或编辑操作,可以保存重复元素。有序,List 继承了Conllection接口
  • Set对每个对象只接受一次,并使用自己内部的排序方法,Set不保存重复元素,无序,Set 继承了Conllection接口
  • Map同样对每个元素保存一份,但这是基于"键"的,Map也有内置的排序,因而不关心元素添加的顺序。如果添加元素的顺序对你很重要,应该使用 LinkedHashSet或者LinkedHashMap.元素不可重复,Map没有继承于Collection接口 ,它的键是不允许重复的,值是可以重复的。

在这里插入图片描述

2.多线程

在 Java 中实现多线程有4种手段:

  • 继承于Thread类

    1.创建一个继承于Thread类的子类 (通过ctrl+o(override)输入run查找run方法)
    2.重写Thread类的run()方法
    3.创建Thread子类的对象
    4.通过此对象调用start()方法

  • 实现Runable接口方式

    1.创建一个实现了Runable接口的类
    2.实现类去实现Runnable中的抽象方法:run()
    3.创建实现类的对象
    4.将此对象作为参数传递到Thread类中的构造器中,创建Thread类的对象
    5.通过Thread类的对象调用start()

  • 实现callable接口方式:
    • 与使用runnable方式相比,callable功能更强大些:
      runnable重写的run方法不如callaalbe的call方法强大call方法可以有返回值
      方法可以抛出异常
      支持泛型的返回值
      需要借助FutureTask类,比如获取返回结果,比runable多一个FutureTask类,用来接收call方法的返回值。 适用于需要从线程中接收返回值的形式
  • 使用线程池的方式:
    • 背景:经常创建和销毁,使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
    • 思路:提前创建好多个线程,放入线程池之,使用时直接获取,使用完放回池中。可以避免频繁创建销毁,实现重复利用。类似生活中的公共交通工具。(数据库连接池)
    • 好处:提高响应速度(减少了创建新线程的时间)
      降低资源消耗(重复利用线程池中线程,不需要每次都创建)
      便于线程管理
      corePoolSize:核心池的大小
      maximumPoolSize:最大线程数
      keepAliveTime:线程没有任务时最多保持多长时间后会终止

多线程中记得调用start()方法启动多线程,没有启动多线程调用的run方法也只是一个普通的方法:JVM执行start方法,会另起一条线程执行thread的run方法,这才起到多线程的效果「为什么我们不能直接调用run()方法?」如果直接调用Thread的run()方法,其方法还是运行在主线程中,没有起到多线程效果

3.面向对象的特性:继承 多态 封装

参考链接:https://blog.csdn.net/weixin_41792162/article/details/83684384

继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。

封装:

4.网络编程(nio)

udp,tcp参考连接:https://blog.csdn.net/allenfoxxxxx/article/details/90707505

UDP:UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时,不建议使用UDP协议。

TCP:TCP协议是面向连接的通信协议,即传输数据之前,在发送端和接收端建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠无差错的数据传输。

在TCP连接中必须要明确客户端与服务器端,由客户端向服务端发出连接请求,每次连接的创建都需要经过“三次握手”。

JAVA Socket:

所谓socket 通常也称作”套接字“,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过”套接字”向网络发出请求或者应答网络请求。

以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的。在连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过SocketImpl类及其子类完成的。

NIO:

NIO:同步非阻塞
服务器的实现模式为:多个请求,一个线程。请求会注册在IO复用器selector上,多路复用器轮询,直到连接有IO请求时才启动一个线程进行处理。

BIO:同步并阻塞
服务器的实现模式为:一个连接,一个线程。
缺点:客户端连接数与服务端连接数成正比,容易造成不必要的线程开销,甚至导致内存溢出。

1、NIO与BIO的不同
NIO解决的是BIO的并发问题,在使用BIO时由于每创建一个线程,就要为这个线程分配一定的内存空间,而操作系统本身对线程的总数也会有一定的限制,如果客户端的请求过多,服务端程序可能因为不堪重负而拒绝客户端请求 ,甚至瘫痪。而 NIO中当一个连接创建后,不需要新创新一个线程,这个连接会被注册到复用器上,所有连接只需要一个线程即可 ,这个线程中的复用器会进行轮询,发现连接上有请求时才开启一个线程进行处理。

5.输入输出流(需补充)

字节输入流:InputStream,字节输出流:OutputStream

字符输入流:Reader,字符输出流:Writer

字节流继承inputStream和OutputStream,字符流继承自Reader和Writer;

字符流和字节流有什么区别?

字符流和字节流的使用非常相似,但是实际上字节流的操作不会经过缓冲区(内存)而是直接操作文本本身的,而字符流的操作会先经过缓冲区(内存)然后通过缓冲区再操作文件

6.异常类有哪些

1.异常系列的父类:java.lang.Throwable类

2.Java从Throwable直接派生出Exception和Error,Exception表示可以恢复的异常,是编译器可以捕捉到的;Error表示系统在运行期间出现了严重的错误,属于不可恢复的异常,而且Error会导致程序的终止执行;

3.Exception又分为两大类:

  • 运行时异常:包括NullPointerException, ClassCastException(类型转换异常),IndexOutOfBoundsException(越界异常), IllegalArgumentException(非法参数异常),ArrayStoreException(数组存储异常),AruthmeticException(算术异常),BufferOverflowException(缓冲区溢出异常)等;

  • 编译时异常:包括IOException, SQLException,InterruptedException(中断异常-调用线程睡眠时候),NumberFormatException(数字格式化异常)等。

4.异常处理:

  • 捕捉异常:try…catch,try…catch…finally,try…finally

  • 手动抛出异常:throw 一个异常对象;

    • throws出现在方法函数头,而throw出现在函数体。
    • throws表示出现异常的一种可能性,并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
  • 自定义异常:

    • 必须继承Throwable或它的子类,比较多的是继承RuntimeException和Exception.

    • 如果继承RuntimeException或它的子类,那么自定义的这个异常就是运行时异常。编译器不提醒处理。

      如果继承Exception,那么它属于编译时异常,编译器会强制你处理。

7.JDBC(需补充)

a.如何连接数据库

1、加载JDBC驱动程序:

Class.forName(“com.mysql.jdbc.Driver”) ;

2、创建数据库的连接

Connection con = DriverManager.getConnection(url , username , password ) ;

3、创建一个preparedStatement

PreparedStatement pstmt = con.prepareStatement(sql) ;

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):用于执行返回多个结果集、多个更新计数或二者组合的语句。

 ResultSet rs = stmt.executeQuery("SELECT * FROM ...") ;  
 int rows = stmt.executeUpdate("INSERT INTO ...") ;

5、遍历结果集

两种情况:
1、执行更新返回的是本次操作影响到的记录数。
2、执行查询返回的结果是一个ResultSet对象。
• ResultSet包含符合SQL语句中条件的所有行,并且它通过一套get方法提供了对这些
行中数据的访问。
• 使用结果集(ResultSet)对象的访问方法获取数据:
while(rs.next()){
String name = rs.getString(“name”) ;
String pass = rs.getString(1) ; // 此方法比较高效
}

(列是从左到右编号的,并且从列1开始)

6、处理异常,关闭JDBC对象资源

•操作完成以后要把所有使用的JDBC对象全都关闭,以释放JDBC资源,关闭顺序和声 明顺序相反:
1、先关闭resultSet
2、再关闭preparedStatement
3、最后关闭连接对象connection

if(rs !=null){ // 关闭记录集
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt !=null){ // 关闭声明
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn !=null){ // 关闭连接对象
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

b.数据库连接池

数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

8.接口

1.概念:

  • 官方解释:Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)

  • 我的解释:接口可以理解为一种特殊的类,里面全部是由****全局常量*公共的抽象方法所组成。接口是解决***Java无法使用多继承*的一种手段,但是接口在实际中更多的作用是*制定标准*的。或者我们可以直接把接口理解为*100%的抽象类*,既接口中的方法*必须全部****是抽象方法。(JDK1.8之前可以这样理解)

2.特点:

  • 就像一个类一样,一个接口也能够拥有方法和属性,但是在接口中声明的方法默认是抽象的。(即只有方法标识符,而没有方法体)。

  • 接口指明了一个类必须要做什么和不能做什么,相当于类的蓝图。

  • 一个接口就是描述一种能力,比如“运动员”也可以作为一个接口,并且任何实现“运动员”接口的类都必须有能力实现奔跑这个动作(或者implement move()方法),所以接口的作用就是告诉类,你要实现我这种接口代表的功能,你就必须实现某些方法,我才能承认你确实拥有该接口代表的某种能力。

  • 如果一个类实现了一个接口中要求的所有的方法,然而没有提供方法体而仅仅只有方法标识,那么这个类一定是一个抽象类。(必须记住:抽象方法只能存在于抽象类或者接口中,但抽象类中却能存在非抽象方法,即有方法体的方法。接口是百分之百的抽象类)

3.JDK8新特性:

JDK8及以后,允许我们在接口中定义static方法和default方法。

  • static必须通过接口类调用(静态方法)
  • default方法必须通过实现类的对象调用(默认方法),默认方法不是抽象类,可以不用重写,如果默认方法的功能满足不了实现类,那么实现类可以覆盖默认方法;

9.泛型(补充)

10.枚举(补充)

WEB

1.get请求和post请求的区别

  • get请求的参数长度是有限制的,post请求的参数长度理论上是没有限制的;

  • POST的安全性隐私性比GET的高。通过GET请求,用户名和密码都会暴露再URL上,因为登录页面有可能被浏览器缓存以及其他人查;看浏览器的历史记录的原因,此时的用户名和密码就很容易被他人拿到了;

  • get请求可被缓存,post请求不会被缓存;

  • get请求只能进行url编码,但是post支持多种编码方式;

  • get请求刷新浏览器或回退时没有影响,post请求回退时会重新提交数据请求;

2.redirect和forward的区别

  • forword转发是服务器上的行为,而redirect重定向是客户端的行为

  • forword转发客户端浏览器上的网址是不会发生变化的,redirect重定向在浏览器上是会显示新网址的

  • forward可以共享数据,redirect不能共享数据

  • forword 一般用于用户登录的时候,根据角色转发到相应的模块,redirect一般用于用户注销登录时返回主页面或者跳转到其他网站;

  • forword效率高,而redirect效率低

  • 6. 从请求的次数来说:forword只有一次请求;而redirect有两次请求,

3.JSP有哪些内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application 【SerlvetContext】 存东西
  • config 【SerlvetConfig】
  • out
  • page ,不用了解
  • exception
  • pageContext.setAttrib
<%
        pageContext.setAttribute("name1","李四1");//保存的数据只在一个页面中有效
        request.setAttribute("name2","李四2");//保存的数据只在一次请求中有效,请求转发会携带这个数据
        session.setAttribute("name4","李四4");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name3","李四3");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

pageContext设置作用域:PageContext.SESSION_SCOPE来设置

在这里插入图片描述

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

4.MVC

什么是MVC:就是model模型,view视图,controller控制器

在这里插入图片描述

controller:控制层
1.接收用户请求
2.交给业务层处理相应的代码
3.控住视图的跳转

view:视图层
1.负责数据模型的展示
2.提供用户操作(提供链接发起servlet请求)

model:模型层
1.model里面还分有service层和dao层,service层可以通过sql语句去操作dao层,
dao层通过jdbc操作数据库
2.主要处理业务和业务逻辑的,就是控制业务操作的
(删除数据,更新数据,查询数据,保存数据)

总结MVC流程:用户在view层进行操作,这时候view层再去操作contrller层,controller层就会去model层拿数据,model层拿到数据的 过程是这样的:service层会去找dao层要数据,dao层通过jdbc去操作数据库,最终拿到数据后返回给service层;这时候 model层就拿到数据了,然后把数据返回给controller层,如果是在javaweb阶段的话,controller层一般都是servlet,

​ servlet就会通过重定向或转发的方式把数据返回给view层,这时候view层返回给用户的页面就存在数据;

5.MVVM

  • MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式;即所谓的数据双向绑定
  • MVVM 由 Model、View、ViewModel 三部分构成,Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI 展现出来,ViewModel 是一个同步View 和 Model的对象。
  • 在MVVM架构下,View 和 Model 之间并没有直接的联系,而是通过ViewModel进行交互,Model 和 ViewModel 之间的交互是双向的, 因此View 数据的变化会同步到Model中,而Model 数据的变化也会立即反应到View 上
  • ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。

6.restful接口

  • 它是一种设计风格,不是一种标准,是一种思想;Rest是web服务的一种架构风格;

在这里插入图片描述

RESTful用法:
http://127.0.0.1/user/1 GET 根据用户id查询用户数据
http://127.0.0.1/user POST 新增用户
http://127.0.0.1/user PUT 修改用户信息
http://127.0.0.1/user DELETE 删除用户信息

Spring

  • IOC是一种设计思想
  • IOC就是一种通过描述(xml或注解)并通过第三方去生产获取特定对象的方式;在Spring中实现控制反转的是IOC容器,实现方法是依赖注入;
  • IOC中,已经不需要手动的去new对象,而是在xml中去配置对象
  • 控制:谁来控制对象,在传统程序应用中,对象由程序本身控制创建的,使用spring后,对象由spring创建;
  • 反转:程序由主动的创建对象变为被动的接收对象;
  • 依赖注入:就是利用set方法注入;

IOC是一种编程思想,由主动的编程变为被动的接收,所谓的IOC,即对象由spring来创建,管理和装配;

IOC创建对象的方式:

默认使用无参构造进行创建对象;

有参构造创建有三种方式:

1.下标赋值

2.变量类型赋值

3.变量名称赋值

1.IOC

1.IOC理解:

  • 控制反转IOC(Inversion of Control),是一种设计思想,

  • 控制反转是一种通过描述(xml或注解)并通过第三方去生产或获取特定对象的方式。在spring中实现控制反转的是IOC容器,其实现方法是依赖注入(Dependency Injection,DI)

会发现,已经不需要手动new对象,对象是在xml文件中配置。或者通俗来讲,不需要改底层代码,而xml文件不算底层代码。

控制反转

  • 控制: 谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的
  • 反转: 程序本身不创建对象,而变成被动的接收对象。
  • 依赖注入: 就是利用set方法来进行注入的
  • IOC是一种编程思想,由主动的编程变为被动的接收,所谓的IOC,即对象由Spring来创建,管理,装配

2.IOC创建对象的方式:

  1. 默认使用无参构造创建对象
  2. 使用有参构造创建对象的三种方式
  • 下标赋值
<bean id="user" class="com.yang.entity.User">
        <constructor-arg index="0" value="张三"/>
        <constructor-arg index="1" value="18"/>
</bean>
  • 变量类型赋值
<bean id="user1" class="com.yang.entity.User">
        <constructor-arg type="int" value="18"/>
        <constructor-arg type="java.lang.String" value="张三"/>
</bean>
  • 变量名称赋值
<bean id="user2" class="com.yang.entity.User">
        <constructor-arg name="name" value="张三"/>
        <constructor-arg name="age" value="18"/>
</bean>

在获取spring的上下文对象( new ClassPathXmlApplicationContext(“beans.xml”); )时,spring容器中的所有的对象就已经被创建了。

2.AOP

aop是oop的延续,aop可以使业务逻辑的各个部分进行隔离,使得业务逻辑的各个部分的耦合性降低,提高了程序的可重用性,也同时提高了开发的效率‘

在不影响原来程序的情况下,aop可以对方法进行增强,常用的就是增加日志操作;

  • AOP是OOP的延续,利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高 了开发的效率。
  • 在不影响原来程序的情况下,可以实现对方法的加强;比如常用的增加日志操作;

3.ResourceLoader

而Spring框架为了更方便的获取资源,尽量弱化程序员对各个Resource接口实现类的感知与分辨,降低学习与使用成本,定义了另一个接口,就是:ResourceLoader接口

此接口有一个特别重要的方法:Resource getResource(String location)。返回的对象,就是Spring容器中Resource接口的实例

Spring内所有的ApplicationContext实例(包括Spring自启动容器或者用户手动创建的其他容器),都实现了这个方法

因此程序员在使用Spring容器时,可以:

  • 不去过于计较Spring内底层Resource的实现方式

  • 也不需要自己创建Resource实现类

  • 而是直接使用applicationContext.getResource()语句,即可获取到applicationContext容器本身自有的Resource实例;

    进而用此Resource实例,去获取相关的资源数据。

    4.SpringMVC流程图

在这里插入图片描述

具体步骤:

  • 首先用户发送请求到前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;图中的 1、2 步骤;
  • 页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名);图中的 3、4、5 步骤;
  • 前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;图中的步骤 6、7;
  • 前端控制器再次收回控制权,将响应返回给用户,图中的步骤 8;至此整个结束。

springmvc执行流程:

1.用户发送请求给前端控制器,前端控制器根据请求来选择一个页面控制器进行处理并把请求委托给它,页面控制器就是控制器和控制逻辑部分;

2.页面控制器拿到请求后,先进行功能处理,然后需要收集和绑定请求参数给一个对象,在spring web mvc 中这个对象叫做命名对象,在把命名对象委托给业务对象进行处理,处理完后返回一个model and view;(模型数据和逻辑视图名)

3.前端控制器收回控制权,根据返回的逻辑视图名进行视图的渲染,加入模型数据进行视图的渲染;

4.前端控制器再次收回控制权,把响应返回给用户;

4.springboot

Spring Boot的主要优点:

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求

真的很爽,我们快速去体验开发个接口的感觉吧!

springboot优势:

方便spring开发者更快的入门;

开箱即用;提供各种默认配置来简化项目配置;

内嵌式容器简化了web项目;

没有冗余的代码生成和xml配置的要求;

5. Mybatis和jdbc的区别

  • MyBatis 是一款优秀的持久层框架.
  • MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis是对JDBC的封装
  • MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

1.2.SQL统一管理,对数据库进行存取操作

我们使用JDBC对数据库进行操作时,SQL查询语句分布在各个Java类中,这样可读性差,不利于维护,当我们修改Java类中的SQL语句时要重新进行编译。

Mybatis可以把SQL语句放在配置文件中统一进行管理,以后修改配置文件,也不需要重新就行编译部署。

3.生成动态SQL语句

我们在查询中可能需要根据一些属性进行组合查询,比如我们进行商品查询,我们可以根据商品名称进行查询,也可以根据发货地进行查询,或者两者组合查询。如果使用JDBC进行查询,这样就需要写多条SQL语句。

Mybatis可以在配置文件中通过使用标签进行SQL语句的拼接,生成动态SQL语句。比如下面这个例子:

4.能够对结果集进行映射

我们在使用JDBC进行查询时,返回一个结果集ResultSet,我们要从结果集中取出结果封装为需要的类型

在Mybatis中我们可以设置将结果直接映射为自己需要的类型,比如:JavaBean对象、一个Map、一个List等等。像上个例子中就是将结果映射为int类型。

数据库

1.创建视图的语句

create view 【视图名】 as 【select语句】

2.创建存储过程的语句

一.创建存储过程
create procedure sp_name()
begin

end

二.调用存储过程
1.基本语法:call sp_name()
注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递

三.删除存储过程
1.基本语法:
drop procedure sp_name//

2.注意事项
(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

四.其他常用命令

1.show procedure status
显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等

2.show create procedure sp_name
显示某一个mysql存储过程的详细信息

3.事务的隔离级别和传播属性

事务的隔离级别:

1.Serializable (串行化):可避免脏读、不可重复读、幻读。

2.Repeatable read (可重复读):可避免脏读、不可重复读。

3.Read committed (读已提交):可避免脏读。

4.Read uncommitted (读未提交):都避免不了

MySQL默认的方式的:可重复读。

七种传播行为:

1.PROPAGATION_REQUIRED:(支持事务)如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。

2.PROPAGATION_SUPPORTS:(支持事务)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。

3.PROPAGATION_MANDATORY:(支持事务)支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。

4.PROPAGATION_REQUIRES_NEW:(支持事务)创建新事务,无论当前存不存在事务,都创建新事务。

5.PROPAGATION_NOT_SUPPORTED:(不支持事务)以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

6.PROPAGATION_NEVER:(不支持事务)以非事务方式执行,如果当前存在事务,则抛出异常。

7.PROPAGATION_NESTED:(不支持事务)如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

4.数据库的性质

1)原子性(Atomicity)

原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

(2)一致性(Consistency)

一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。

(3)隔离性(Isolation)

隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。

(4)持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。

5.Mysql数据库表出现了乱码问题是什么原因?怎么解决?

1.原因:

  • mysql可以支持多种字符集。在同一个数据库的不同表,同一个表中的不同字段,都可以指定使用不同的字符集。
  • 之所以会显示乱码,就是因为MySQL客户端输出窗口显示中文时使用的字符编码不对造成的

2.解决:

1.在mysql的my.cnf的配置文件中修改或添加下列:
[client]
default-character-set = utf8

[mysqld]
character-set_server = utf8

这个方法能解决大多数用户的问题

2.可以看到,现在是使用utf8字符编码来显示中文数据的,但是因为操作系统是中文操作系统,默认使用的字符集是GB2312,所以需要把输出窗口使用的字符编码改成gb2312才能够正常显示中文。使用如下的命令设置输出窗口使用的字符编码

6.Mysql数据库字段类型有哪些

  • tinyint,smallint,int,bigint,float,double;
  • varchar,char;
  • date,time,datetime,year;

7.Mysql分页如何做?

语法:select * from user limit startIndex,pageSize;
select * from user limit 3; #[0,n] 这里的n=3

offset用法:offset后面跟的就是索引,所以可以把offset理解为起始索引!相当于上面的startIndex

语法:select * from user limit 3 offset 4;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: Java基础面试可以包括很多方面的知识,以下是一些常见的问和答案: 1. 什么是JNI? JNI是Java Native Interface的缩写,它提供了一组API,用于实现Java和其他语言(主要是C和C++)之间的通信。JNI允许Java代码与本地已编译的代码进行交互,尽管这可能会降低平台的可移植性。\[2\] 2. JNI的步骤是什么? JNI的步骤包括以下几个部分: - 在Java类中编写带有native声明的方法。 - 使用javac命令编译Java类。 - 使用javah命令生成头文件。 - 使用C/C++实现本地方法。 - 生成动态连接库。 - 执行Java代码。\[1\] 3. 请解释一下super.getClass()方法的作用。 super.getClass()方法是用于获取当前对象的父类的Class对象。在给定的示例中,Test类继承自Date类,当调用super.getClass().getName()时,会返回Test类的名称。因此,输出的结果是"Test"。\[3\] 希望以上回答能够帮助你理解Java基础面试。如果你有其他问,请随时提问。 #### 引用[.reference_title] - *1* *2* [Java基础常见面试及详细答案(总结40个)](https://blog.csdn.net/ayouki123456/article/details/124983188)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Java基础面试50](https://blog.csdn.net/weixin_38337769/article/details/100560220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值