java相关大杂烩

##基础

###类

抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。

一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就可以认为是抽象类

抽象类可以有构造方法,接口中不能有构造方法。(构造方法,日常初始化数据的那个)

native作用:通知虚拟机,我要调用外部代码了(一般是c或者c++)

###异常

try {}里有一个return语句,什么时候执行finally{}?在执行return后,他继续执行finally,return的结果是没有执行finally前的。

运行时异常与一般异常有何异同?异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。

Javaweb

Servlet的生命周期包括 加载 、 实例化 、初始化、处理请求、服务结束。这个生存期由javax.servlet.Servlet接口的init(),service()和destroy方法表达。

request.getAttribute()和 request.getParameter()

getParameter()取得是通过容器的实现来取得通过类似post,get等方式传入的数据;

setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段;只有先用setAttribute()设置之后,才能够通过getAttribute()来获得值,它们传递的是Object类型的数据

getAttribute是返回对象,getParameter返回字符串

**jsp有哪些内置对象?作用分别是什么?**JSP共有以下9个内置的对象:

1
2
3
4
5
6
7
8
9
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外

JDBC访问数据库的基本步骤 加载驱动,通过DriverManager获取连接对象,通过连接对象获取会话,通过会话进行数据的增删改查,封装对象,关闭连接

JDBC编程中处理事务

1
2
3
conn.setAutoComit(false);设置提交方式为手工提交
conn.commit()提交事务
出现异常,回滚 conn.rollback();

数据库连接池的原理。为什么要使用连接池。

创建连接费时,所以统一创建,多个操作共享同一连接。使用连接池可以提高对数据库连接资源的管理。基本思想是为数据库连接建立“缓冲池”,创建几个连接在缓冲区,调用时获取缓冲池,用完再放回去。

脏读,幻读问题 脏读:数据为读取到了还没持久化,可能进行回滚的数据。幻读:表示在使用事务过程中,多次查询一条数据得到的结果不同。解决方案都是使用事务隔离级别配置。

JDBC的DriverManager用来做什么JDBC的DriverManager是一个工厂类,用来创建连接,当Driver类被加载,会自动注册到工厂中。

execute,executeQuery,executeUpdate的区别

Statement的execute(String query)方法用来执行任意的SQL查询,如果查询结果是一个ResultSet,这个方法就返回true。如果不是ResultSet,比如insert或者update查询,它就会返回false。

Statement的executeQuery(String query)接口用来执行select查询,并且返回ResultSet。即使查询不到记录返回的ResultSet也不会为null。我们通常使用executeQuery来执行查询语句。如果传insert或者update会抛异常。

Statement的executeUpdate(String query)方法用来执行insert或者update/delete(DML)语句,或者 什么也不返回,对于DDL语句,返回值是int类型,如果是DML语句的话,它就是更新的条数,如果是DDL的话,就返回0。

只有当你不确定是什么语句的时候才应该使用execute()方法

JDBC的ResultSet是什么ResultSet对象维护了一个游标,指向当前的数据行。开始的时候这个游标指向的是第一行。如果调用了ResultSet的next()方法游标会下移一行,如果没有更多的数据了,next()方法会返回false。可以在for循环中用它来遍历数据集。

Get与Post 按HTTP规范来讲,Get用于信息获取,应该是幂等的,Post用于数据修改提交等。但是多数开发情况下,Get也用作提交了,写起来方便。Get最多提交1014个字节

###泛型

Java中的泛型是什么 ? 使用泛型的好处是什么参数化类型,也就是说所操作的数据类型被指定为一个参数。1、类型安全,提供编译期间的类型检测 2、前后兼容 3、泛化代码,代码可以更多的重复利用 4、性能较高,用GJ(泛型JAVA)编写的代码可以为java编译器和虚拟机带来更多的类型信息,这些信息对java程序做进一步优化提供条件。

框架

Struts其实就是个Servlet,已经多年没人用了。

Hibernate 对象关系映射,坑爹的缓存

使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、创建session对象,启动事务,完成CRUD操作,提交事务,关闭session。

行级锁

开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

表级锁

开销小,加锁快;不会出现死锁;锁定粒度大,发出锁冲突的概率最高,并发度最低。

页级锁

页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁.表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。BDB支持页级锁

MyBatis中使用#和$书写占位符有什么区别?
#将传入的数据都当成一个字符串,会对传入的数据自动加上引号;

​ $将传入的数据直接显示生成在SQL中。

​ 注意:使用$占位符可能会导致SQL注射攻击,能用#的地方就不要使用$,写order by子句的时候应该用​$而不是#。

MyBatis中的动态SQL

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MyBatis中用于实现动态SQL的元素主要有: 
- if - choose / when / otherwise - trim - where - set - foreach
<select id="foo" parameterType="Blog" resultType="Blog">
select * from t_blog where 1 = 1
<if test="title != null">
and title = #{title}
</if>
<if test="content != null">
and content = #{content}
</if>
<if test="owner != null">
and owner = #{owner}
</if>
</select>

JDBC编程有哪些不足之处,mybatis如何优化**

JDBC连接频繁创建,mybatis在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接

JDBC代码混写,mybatis在XXXXmapper.xml文件中与java代码分离

JDBC解析麻烦,mybatis自动映射java对象

MyBatis的一级缓存和二级缓存?

Mybatis首先去缓存中查询结果集,如果没有则查询数据库,如果有则从缓存取出返回结果集就不走数据库。Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象
Mybatis的二级缓存即查询缓存,它的作用域是一个mapper的namespace,即在同一个namespace中查询sql可以从缓存中获取数据。二级缓存是可以跨SqlSession的。

iBatis与Hibernate

相同点:屏蔽jdbc api的底层访问细节,使用我们不用与jdbc api打交道,就可以访问数据。

ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。

Hibernate是一个全自动的orm映射工具,它可以自动生成sql语句,ibatis需要我们自己在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大很多。但是对于复杂sql,batis更好写。

Hibernate的二级缓存

缓存的作用是可以快速查询,减少数据库压力。Hibernate的Session就是一种缓存,通常将之称为Hibernate的一级缓存,使用session从数据库中查询出一个对象时,Session也是先从自己内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在自己内部。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务都可以共享这个缓存。我们希望的是一个人使用过,其他人也可以使用,session没有这种效果。

###其他

单例模式

单例的类别:懒汉、饿汉、枚举、静态内部类、双重校验锁 等等 , 选择线程安全我选最后一种,双重校验锁。

int强转byte会如何?可以强转,但是int是32位的,byte是8位的,导致,强转后,int的高24位会丢失只会保留后低8位

a.hashCode() 有什么用?与 a.equals(b) 有什么关系? hashCode() 方法对应对象整型的 hash 值。两个使用 equal() 方法来判断相等的对象,必须具有相同的 hash code。

i18n 国际化,多套语言模板。

生产者——消费者 问题

日常使用队列存就好了,然后获取,如果队列满了。就找个地方存呗,当队列处理完后,获取存储内容即可。

哲学家进餐

谈谈你对NIO的理解

答:IO是面向流,NIO是面向缓冲 ,这里不细讲了,具体参照:Java NIO和IO的区别

io是面向流的,nio面向的是缓冲区

io是直接读取一个或多个字符,知道全部读完,没有缓存,不能前后移动流中的数据.阻塞的

nio可以前后移动了,非阻塞,

来源地址:

https://www.cnblogs.com/peke/p/7894685.html

https://www.cnblogs.com/lyldaisy/p/10952180.html