面试问答

中软国际(无锡诺威特分公司)

1.事务和锁

-锁:对数据库中数据对象进行加锁,防止并发或者多用户操作破坏数据库数据的不一致性。因为可能存在多个事务同时存取同一数据的情况。

  • 事务:事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
    1
    2
    3
    4
    原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
    一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。
    隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
    持久性(Durability):一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。

2.servlet 与jsp

  • servlet:服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是服务器) 负责执行Java程序
  • jsp:(Java Server Page)则是一个页面, 由JSP容器负责执行。
  • JSP便于输出,而Servlet便于进行逻辑处理。
1
2
3
用Java开发Web应用程序时用到的技术主要有两种,即Servlet和JSP。 Servlet是在服务器端执行的Java程序,一个被称为Servlet容器的程序(其实就是服务器) 负责执行Java程序。而JSP(Java Server Page)则是一个页面, 由JSP容器负责执行。

Servlet和JSP两者最大的区别就是,Servlet以Java程序为主, 输出HTML代码时需要使用out.println函数,也就是说Java中内嵌HTML; 而JSP则以HTML页面为主,需要写Java代码时则在页面中直接插入Java代码, 即HTML中内嵌Java。

3.html和jsp

  • jsp=html+java

4.mysql 如何实现分页

  • MySql数据库提供了分页的函数limit m,n,
  • 查询第20条到第30条的数据的sql是:select from table limit 20,30; ->对应我们的需求就是查询第三页的数据:select from table limit (3-1)*10,10;
  • 分页sql格式是:select from table limit (start-1)limit,limit; 其中start是页码,limit是每页显示的条数。

5.简诉ssm

  • Spring+SpringMVC+MyBatis
  • 存储层:MyBatis
  • 控制层:

6.转发和重定向

  • 重定向:其实是两次request
  • 转发:转发是服务器行为,重定向是客户端行为。
1
2
3
4
5
6
7
第一次,客户端request?? A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。
重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
1.转发过程:客户浏览器发送http请求——》web服务器接受此请求——》调用内部的一个方法在容器内部完成请求处理和转发动作——》将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。
在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
2.重定向过程:客户浏览器发送http请求——》web服务器接受后发送302状态码响应及对应新的location给客户浏览器——》客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址——》服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL, 既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。
重定向行为是浏览器做了至少两次的访问请求的。

粤嵌公司

1.maven是什么?

  • 我答 包管理工具
  • 正确答案:包管理工具+(相同的目录结构)Java项目管理(构建 文档 生成报告 依赖 SCMs 发布 分发 邮件列表)
1
2
总的来说,Maven 简化了工程的构建过程,并对其标准化。它无缝衔接了编译、发布、
文档生成、团队合作和其他任务。Maven 提高了重用性,负责了大部分构建相关的任务。

2.springMVC 前端控制器是哪个类

  • 正确答案:DispatcherServlet
  • springMVC:前端控制器 视图解析器 分发器/控制器

3.分页怎么实现的?

  • 我答 limit函数 /springboot框架的Page对象
  • 正确答案:有20,30种 通常自己写工具类。
  • 还可以用插件pageHelper

擎动公司

1.tcp 三次握手

  • 客户端发送位码SYN=1到服务器 随机产生seq客
  • 服务器收到 返回SYN=1+ACK=1 产生seq服
  • 客户端收到 确认 ack=1 且得到的seq=原seq客+1 正确发送ack+seq 服务器收到确认seq服=seq服+1 ack=1 连接建立成功
    -
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IP 192.168.1.116.3337 > 192.168.1.123.7788: S 3626544836:3626544836
    IP 192.168.1.123.7788 > 192.168.1.116.3337: S 1739326486:1739326486 ack 3626544837
    IP 192.168.1.116.3337 > 192.168.1.123.7788: ack 1739326487,ack 1

    第一次握手:192.168.1.116发送位码syn=1,随机产生seq number=3626544836的数据包到192.168.1.123,192.168.1.123由SYN=1知道192.168.1.116要求建立联机;

    第二次握手:192.168.1.123收到请求后要确认联机信息,向192.168.1.116发送ack number=3626544837,syn=1,ack=1,随机产生seq=1739326486的包;

    第三次握手:192.168.1.116收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,192.168.1.116会再发送ack number=1739326487,ack=1192.168.1.123收到后确认seq=seq+1,ack=1则连接建立成功。

2.有10条数据 计算数据库消费表最近3个月的消费总额。(前提要有时间字段)

1
SELECT * FROM product where DATE_SUB(CURDATE(), INTERVAL 90 DAY) <= date("creatDate");

3.单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class SingleObject {

//创建 SingleObject 的一个对象
private static SingleObject instance = new SingleObject();

//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}

//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}

public void showMessage(){
System.out.println("Hello World!");
}
}

连接池写成单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package com.esen.study.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import com.esen.jdbc.SimpleConnectionFactory;
import com.esen.study.dao.CategoryDao;

public class JdbcUtil {
private JdbcUtil() {
// TODO Auto-generated constructor stub
}

private static SimpleConnectionFactory instance = getFctInstance();

public static SimpleConnectionFactory getFct() {
return instance;
}

private static SimpleConnectionFactory getFctInstance() {

try {
Class.forName("oracle.jdbc.driver.OracleDriver");
InputStream is = CategoryDao.class
.getResourceAsStream("/com/esen/study/resources/jdbc.properties");// db.properties
// 是一个用户配置文件传用户名密码
Properties prop = new Properties();
try {
prop.load(is);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String pwd = prop.getProperty("pwd");
String driver = prop.getProperty("driver");
return new SimpleConnectionFactory(driver, url, user, pwd, "debug");

} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;

}

}

武汉百胜睿迪有限公司

mysql数据库去重问题

  • 删除表中多余的重复记录(多个字段),只留有id最小的记录
  • distinct

JAVA理论知识点

1.StringBuffer/StringBuilder

  • StringBuffer的方法都是有synchronized修饰的,StringBuffer就叫做线程安全的类 而StringBuilder就不是线程安全的类
  • 线程安全(不会同时被多线程修改而变成脏数据)

2.基本数据类型

  • 整型:byte 8位 -2^7~2^7-1 shrot int long
  • 字符型:char 2byte
  • 浮点型:float 4byte double 8byte
  • 布尔型:Boolean 1位

3.final

  • 准确的描述是 当一个变量被final修饰的时候,该变量只有一次赋值的机会

4.获取类对象的3种方法/synchronized修饰类/类方法 同步对象的区别

  • Class c1=Class.forName()
  • Class c2=hero.class;
  • Class c3=new Hero().getClass();
  • 在对象方法前,加上修饰符synchronized ,同步对象是当前实例。
  • 在类前,加上修饰符synchronized ,同步对象是当前类对象。

5.反射机制

  • 通过字符串结合配置文件达到构造类对象的目的

6.自定义注解 @interface eg:DButil类用注解 教程

  • 1.设置存储信息
1
2
3
4
5
6
7
8
public @interface JDBCConfig {
String ip();
int port() default 3306;
String database();
String encoding();
String loginName();
String password();
}
  • 2.给属性赋值
1
@JDBCConfig(ip = "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")
  • 3.获得存储信息 通过反射,获取这个DBUtil这个类上的注解对象
1
JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);
  • 4.整合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@JDBCConfig(ip = "127.0.0.1", database = "test", encoding = "UTF-8", loginName = "root", password = "admin")
public class DBUtil {
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}

public static Connection getConnection() throws SQLException, NoSuchMethodException, SecurityException {
JDBCConfig config = DBUtil.class.getAnnotation(JDBCConfig.class);

String ip = config.ip();
int port = config.port();
String database = config.database();
String encoding = config.encoding();
String loginName = config.loginName();
String password = config.password();

String url = String.format("jdbc:mysql://%s:%d/%s?characterEncoding=%s", ip, port, database, encoding);
return DriverManager.getConnection(url, loginName, password);
}

public static void main(String[] args) throws NoSuchMethodException, SecurityException, SQLException {
Connection c = getConnection();
System.out.println(c);
}
}

7.staic/final

  • static修饰的成员变量和方法都属于类成员,可以通过类名直接调用
  • final 不可修改
1
2
3
4
5
6
7
8
9
private static SingleObject instance = new SingleObject();

//让构造函数为 private,这样该类就不会被实例化
private SingleObject(){}

//获取唯一可用的对象
public static SingleObject getInstance(){
return instance;
}
  • 1.collections/Arrays 工具类

    1
    2
    List<Integer> numbers = new ArrayList<>();
    Collections.reverse(numbers);
  • 2.ArrayList vs hashSet
    | 集合框架&区别 | 是否有序 | 内容是否可重复 |
    | —— | —— | —— |
    | ArrayList | Y | Y |
    | HashSET | N | N |

  • 3.ArrayList/LinkList

  • 插入&定位数据 ArrayList慢
  • 这是因为表结构不同

9.类实例化顺序

  • 1.类的实例化顺序:先静态再父子
  • 2.父类静态变量->父类静态代码块->子类静态变量->子类静态代码块->父类非静态变量(父类实例成员变量)->父类构造函数->子类非静态变量(子类实例成员变量)->子类构造函数。

10.继承/聚合

  • 聚合体现的是整体与部分 并不一定指类
  • 继承 一个类继承另一个类 有父类属性方法 还可自定义方法。

11.抽象类/接口

  • 1.实现类区别 抽象类由子类实现 接口由类(包括抽象类)实现
  • 2.有无方法声明/实现区别 抽象类可以有方法声明/方法实现 接口类无方法实现。
  • 3.有无抽象方法 抽象类可以没有 接口没有
  • 4.多继承区别 接口可多继承接口 类只能单根继承。

12.把这几个方法封装一下 | 属性的封装就不说啦

  • eg:封装System.out.println()方法
  • 思路:新建一个类 定义一个静态方法(这样直接可以类名访问) 然后把需要封装的方法写进去
  • 需要用 System.out.println() 时 直接调用该类的静态方法。
1
2
3
4
5
6
7
8
9
10
11
public class Util{
public staic void out(String str){
System.out.println(str)
}
}

public class use{
public staic void main(String[] args){
Util.out("方法的封装")
}
}

13.把super换成父类名 就一目了然啦

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class ADHero extends Hero{
public ADHero(String name){
super(name);//在子类构造方法中调用父类构造方法=Hero(name)
System.out.println("AD Hero的构造方法");
}
}

public class ADHero extends Hero{
public int getMoveSpeed(){
return this.moveSpeed;//换成当前类名
}

public int getMoveSpeed2(){
return super.moveSpeed;//换成父类名
}
}

14.4种内部类 详细教程

  • 非静态内部类:可以访问私有方法
  • 静态内部类:可以访问静态方法

  • 匿名类:

  • 本地类:有名字的匿名类

15.注解 how2j教程

  • 元注解 @Target。。
  • 自定义注解
  • 第三方框架注解