Java面经

Java:

  1. Java类加载机制?

Java-类加载过程
Java-类加载器与双亲委派模型
JavaGuide

  1. Java中的List,Map,Set是否都实现了Collections接口?

List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。

  1. Java多线程的几种实现方式?

Java提供了三种创建线程的方法:

  • 通过实现Runnable接口;
  • 通过继承Thread类本身;
  • 通过Callable和Future创建线程;
  1. Java 中 8 个基本数据类型
  • 四种整数类型(byte、short、int、long):byte:8 位,用于表示最小数据单位,如文件中数据,-128到127;short:16位,很少用,-32768到32767;int:32 位、最常用,-2^31-1到2^31(21 亿);long:64 位。注意事项:int i=5;5叫直接量(或字面量),即直接写出的常数。整数字面量默认都为 int 类型,所以在定义的 long 型数据后面加 L或 l。小于 32 位数的变量,都按 int 结果计算。强转符比数学运算符优先级高。见常量与变量中的例子。

  • 两种浮点数类型(float、double): float:32 位,后缀 F 或 f,1位符号位,8位指数,23位有效尾数。 double:64 位,最常用,后缀 D 或 d,1 位符号位,11 位指数,52 位有效尾数。 注意事项: 二进制浮点数:1010100010=101010001.0×2=10101000.10/×2^10(2次方)=1010100.010×2^11(3次方)=.1010100010×2^1010(10次方) 尾数: . 1010100010 指数:1010 基数:2 浮点数字面量默认都为 double 类型,所以在定义的 float 型数据后面加F 或 f;double 类型可不写后缀,但在小数计算中一定要写 D 或 X.X float 的精度没有 long 高,有效位数(尾数)短。 float 的范围大于 long 指数可以很大。 浮点数是不精确的,不能对浮点数进行精确比较。

  • 一种字符类型(char):char,16 位,是整数类型,用单引号括起来的 1 个字符(可以是一个中文字符),使用 Unicode 码代表字符,0到2^16-1(65535) 。注意事项:不能为 0个字符。转义字符:\n 换行 \r 回车 \t Tab 字符 " 双引号 \ 表示一个\ 两字符 char 中间用“+”连接,内部先把字符转成 int 类型,再进行加法运算,char本质就是个二进制的数,显示的时候,经过“处理”显示为字符。

  • 一种布尔类型(boolean):true、false

  1. Java 反射的实现与作用

JAVA语言编译之后会生成一个.class文件,反射就是通过字节码文件找到某一个类、类中的方法以及属性等。反射的实现主要借助以下四个类:Class:类的对象,Constructor:类的构造方法,Field:类中的属性对象,Method:类中的方法对象。
作用:反射机制指的是程序在运行时能够获取自身的信息。在 JAVA 中,只要给定类的名字,
那么就可以通过反射机制来获取类的所有信息。

  1. synchronized 与 Lock 的区别
  • 首先 synchronized 是 java 内置关键字,在 jvm 层面,Lock 是个 java 类;
  • synchronized 无法判断是否获取锁的状态,Lock 可以判断是否获取到锁;
  • synchronized 会自动释放锁( a 线程执行完同步代码会释放锁 ;b 线程执行过程中发生异常会释放锁),Lock 需在 finally 中手工释放锁(unlock()方法释放锁),否则容易造成线程死锁;
  • 用 synchronized 关键字的两个线程1和线程2,如果当前线程1获得锁,线程2线程等待。如果线程1阻塞,线程2则会一直等待下去,而Lock锁就不一定会等待下去,如果尝试获取不到锁,线程可以不用一直等待就结束了;
  • synchronized的锁可重入、不可中断、非公平,而Lock锁可重入、可判断、可公平(两者皆可)
  • Lock 锁适合大量同步的代码的同步问题,synchronized 锁适合代码少量的同步问题。
    参考资料
  1. JVM内存管理,heap 和 stack 的区别

Spring:

  1. SpringBoot的配置文件有几种格式,他们有什么区别?

.properties 和 .yml
.yml采取的是缩进的格式 不支持@PeopertySource注解导入配置
参考资料

  1. SpringMVC是否是单例模式,如果是有什么问题,怎么解决?

是单例模式,所以在多线程访问的时候有线程安全问题,不要用同步,会影响性能,解决方案是在控制器里面不能写字段。参考资料

  1. SpringCloud和Dubbo有什么区别?

Dubbo底层是使用Netty这样的NIO框架,是基于TCP协议传输的,配合以Hession序列化完成RPC通信。而SpringCloud是基于Http协议+rest接口调用远程过程的通信,相对来说,Http请求会有更大的报文,占的带宽也会更多。但是REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合适,至于注重通信速度还是方便灵活性,具体情况具体考虑。

  1. Spring IOC原理?

MySQL:

  1. MySQL中有几种锁,怎么给SQL语句加锁?
  • 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
  • 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
  • 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
  1. MySQL模糊查询,关键字?

我们知道在 MySQL 中使用 SQL SELECT 命令来读取数据, 同时我们可以在 SELECT 语句中使用 WHERE 子句来获取指定的记录。
WHERE 子句中可以使用等号 = 来设定获取数据的条件,如 “runoob_author = ‘RUNOOB.COM’”。
但是有时候我们需要获取 runoob_author 字段含有 “COM” 字符的所有记录,这时我们就需要在 WHERE 子句中使用 SQL LIKE 子句。
SQL LIKE 子句中使用百分号%字符来表示任意字符,类似于UNIX或正则表达式中的星号*。如果没有使用百分号 %, LIKE 子句与等号 = 的效果是一样的。

语法
以下是 SQL SELECT 语句使用 LIKE 子句从数据表中读取数据的通用语法:

SELECT field1, field2,...fieldN 
FROM table_name
WHERE field1 LIKE condition1 [AND [OR]] filed2 = 'somevalue'
  • 你可以在 WHERE 子句中指定任何条件。
  • 你可以在 WHERE 子句中使用LIKE子句。
  • 你可以使用LIKE子句代替等号 =。
  • LIKE 通常与 % 一同使用,类似于一个元字符的搜索。
  • 你可以使用 AND 或者 OR 指定一个或多个条件。
  • 你可以在 DELETE 或 UPDATE 命令中使用 WHERE…LIKE 子句来指定条件。

实例
以下是我们将 runoob_tbl 表中获取 runoob_author 字段中以 COM 为结尾的的所有记录:

mysql> use RUNOOB;
Database changed
mysql> SELECT * from runoob_tbl WHERE runoob_author LIKE '%COM';
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | 学习 Java | RUNOOB.COM | 2015-05-01 |
| 4 | 学习 Python | RUNOOB.COM | 2016-03-06 |
+-----------+---------------+---------------+-----------------+
2 rows in set (0.01 sec)

参考资料

  1. join 关键字

参考资料

  1. 两表关联查询

  2. MySQL 分页

  3. 查询执行缓慢的语句

  4. 索引为什么能加快查询速度

实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
参考资料

  1. 怎么看 Java 官方文档

Oracle -> Downloads -> Java(JDK) for Developers -> Java APIS

计算机网络:

  1. HTTP 长连接和短连接,各有什么优缺点

在HTTP/1.0中默认使用短连接。也就是说,客户端和服务器每进行一次HTTP操作,就建立一次连接,任务结束就中断连接。当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会重新建立一个HTTP会话。

而从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头加入这行代码:

Connection:keep-alive

在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接需要客户端和服务端都支持长连接。

HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。
参考资料

  1. 滑动窗口和流量控制

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

  1. 三次握手和四次挥手

数据结构和算法:

  1. 给出中序遍历,前序遍历,求后序遍历,层次遍历
  • 前序遍历:访问根节点的操作在访问左右孩子之前,中->左->右
  • 中序遍历:访问根节点的操作在访问左右孩子之中,左->中->右
  • 后序遍历:访问根节点的操作在访问左右孩子之后,左->右->中
  1. 给出带括号的字符串,判断字符串是否合法
    示例输入:{x+b+b*(({1+2)}}*[a+b*(5-4)]

    public boolean checkExpr(String expression) {
            
    String left = "([{";
    String right = ")]}";
    Stack s = new Stack();
    for(int i = 0, len = expression.length(); i < len; i++) {
    char ch = expression.charAt(i);
    if (left.indexOf(ch) != -1) // 如果有左括号
    s.push(ch); // 左括号入栈
    else if (right.indexOf(ch) != -1) { // 如果有右括号
    if (!s.isEmpty()) {
    char temp = s.pop();
    if (ch != right.charAt(left.indexOf(temp))) // 如果不能匹配就返回 false
    return false;
    } else // 如果有右括号而栈为空时,返回 false
    return false;
    }
    }
    return s.isEmpty();
    }
  2. 介绍一下红黑树

你可能感兴趣的:(Java,面试,java,数据库,python,多线程,mysql)