卷一
Java基础
1、java中的内存泄漏是怎么回事
答:在可达性分析法种,不可达的会被清理掉,但有些对象是无用的不会在被调用,这些对像就是java 的内存泄漏
长生命周期的对象,持有短生命周期的引用就可能会出现内存泄漏
序列已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统奔溃等严重后果。
2、equals和==区别
1、==是比较运算符,equals()是object类中的方法
2、 = =比较的是两个变量或者实例是不是指向同一个内存空间,equals比较的是内存空间内的值
3、= =比equals快,因为= =只是比较
3、实现clone和equals需要注意什么
clone
1、需要克隆的对象要实现cloeable
2、首先获得与原对象相同的内存,将原对象的二进制复制到副本称为按位赋值
3、基本数据浅克隆,引用数据深克隆
equals
1、重写equals()需要重写hascode()
在hash表中hascode相等,equals也相等,如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置
2、重写 equals(),必须满足,自反性、对称性、一致性、传递性等特性
对称性(symmetric) 对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true
c.传递性(transitive) 对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)返回true,那么x.equals(z)返回true
d.一致性对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回
true,或者一致地返回false
e.对于任何非null的引用值x,x.equals(null)必须返回false
4、下面方法输入为2返回值是u多少
public static int getValue(int i) {
int result = 0;
switch (i) {
case 1:
result = result + i;
case 2:
result = result + i * 2;
case 3:
result = result + i * 3;
}
return result;
}
10,没有break不会跳出
5、
a.下述代码在多线程环境中是否存在问题?若有,如何修正?
b.下述代码中的volatile关键字是什么意思?如果删除对该段代码有何影响?
class Counter {
private volatile int count = 0;
public int getNext() {
return ++count;
}
}
答:a:++count不是原子操作,
1、方法添加synchronized
每个线程有自己的私有空间,会拉取到私有空间,当再次写到方法中时候,count值可能已经产生了变化,count不能加锁,因为是基本类型,每次值得改变都会产生内存地址得变化,所以永远锁得是以前得值。
2、++量用原子类进行操作。
这是因为 count++ 是一个复合操作,包括三个部分:
读取 count 的值;
对 count 加 1;
将 count 的值写回内存;
b:使用volatile关键字确保共性变量能够准确和一致地更新关键字,保证可见性。
6、 BlockingQueue相比普通的Queue最大的区别是什么?
答:
1.阻塞队列获取元素时,如果队列为空,则会等待队列有元素,否则就阻塞队列(普通队列返回结果,无元素)
2.阻塞队列放入元素时,如果队列满,则等待队列,直到有空位置,然后插入。(普通队列,要么直接扩容,要么直接无法插入,不阻塞)
阻塞队列的最佳场景就是生产者和消费者,使用代码时无需判断直接获取并处理(普通队列得判断有没有元素,阻塞队列不用判断,无元素自身就会阻塞,直到有东西)
7、Thread.sleep() 可能抛出的 InterruptedException 代表什么?如何处理?
答:该线程被中断,取消中断状态,捕获异常
如何实现一个方法,该方法执行某项任务并设定某个时间限制,如果该任务能在限制时间内完成则返回任务执行结果,否则返回null?写出核心代码。
8、不使用SDK自带库,使用基本Java语言实现将传入的数组内容反转
public class reverse {
public static void main(String[] args) {
char [] data={'q','w','e','e'};
reverse(data);
for (int i = 0; i < data.length - 1; i++) {
System.out.println(data[i]);
}
}
public static char[] reverse(char [] data){
if (data==null||data.length-1<1){
return null;
}
for (int i = 0; i < data.length / 2; i++) {
char temp = data[data.length - i - 1];
data[data.length - i - 1]=data[i];
data[i]=temp;
}
return data;
}
}
10、有一个字符串List,如下代码所示。续写代码,将words中的元素再按照字符拆分,合并成一个数组,然后字符去重,最终得到[“h”, “e”, “l”, “o”, “w”, “r”, “d”]
List<String> words = new ArrayList<>();
words.add("hello");
words.add("world");
答
Set set=new LinkedHashSet();
for(int i=0;i<words.size();i++){
String s=words.Get(i);
String[] split=s.splir(“”);
For(String ss:split){
Set.add(ss);
}
Spring
1、 @Controller中,跳转(“redirect: url”)和转发(“forward: url”)有什么区别?
答:redict是重定向,是服务端发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.,原来页面和后来的页面不能用于共享数据,一般用于用户注销登录返回页面和跳转到其他网站,效率相对来说比较低,
Forward是转发,服务器请求资源,直接访问目标地址的URL,读取到那个URL的响应内容,然后把这些内容再转发给浏览器,地址栏还是原来的地址栏,转发页面和转发到的页面可以共享request里的数据,相对来说效率比较高。
2、 下面是HTTP请求报文:
POST /example?param1=value HTTP/1.1
Host: www.nowhere123.com
Accept: image/gif, image/jpeg, /
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=UTF-8
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
X-Auth-Token: token-xxxxx
{
“param2”: “value”
}
如何在Controller的方法中获取框中的数值?
答:通过HttpServletRequest获得到请求头的集合,遍历,通过键获取值从request域中获取集合,在通过键值对获取数据。
后端接口对比
3、 使用注解(如@Component)声明Bean,如何指定Bean加载顺序?
@Order注解不能指定bean的加载顺序,它适用于AOP的优先级,以及将多个Bean注入到集合时,这些bean在集合中的顺序
@AutoConfigureOrder指定外部依赖的AutoConfig的加载顺序(即定义在/META-INF/spring.factories文件中的配置bean优先级),在当前工程中使用这个注解并没有什么鸟用
同样的 @AutoConfigureBefore和 @AutoConfigureAfter这两个注解的适用范围和@AutoConfigureOrder一样
4、多个同类型的Bean,使用注解注入时如何指定?
答:通过使用@Qualifier注解。
使用@Primary注解
使用@Primary注解
Mybatis
1、 XML映射中,SQL语句的两种参数注入方法:#和$的区别?
#{}将传入的数据当做一个字符串,对自动传入的数据加一个双引号。是预编译可以方式sql注入。
${}将传入的数据直接生成在sql中,字符串替换。
2. XML映射中,如何使用LIKE进行模糊查询?
答:like ‘{%条件%}’
3. XML映射中,如何批量插入传入的集合(Collection)?
即,如何根据集合生成如下SQL?
INSERT INTO TABLE_NAME(a, b, c)
VALUES (a1, b1, c1), (a2, b2, c2) …
答:主要用foreach
4. XML映射中,如何在插入的同时获取MySQL自增字段(AUTO_INCREMENT)的生成值?
答:mapper的insert节点下添加selectKey子节点的方式
就是有个A表的主键是mysql自动递增的序列,而这个A表的主键又是B表的外键。有时候会在同一个方法事务里先插入A表,然后插入B表,但是这时后在程序中还无法获得这个A表的自动递增的序列主键,导致插入B表的时候外键插入为空或报错。这种情况可以通过在MyBatis中配置selectKey 为mysql的LAST_INSERT_ID()函数获得插入时的自增序列值来获得。
Redis
1. 如何使key对应的值过5秒后失效?
expire key 5
设置了失效时间,redis也可能存放在redis 的内存中,redis采用的是软清理的方式,通过以一定的算法进行处理。
2. scan和keys命令的区别?
答:keys用来删除相关key的时候使用,但在有数百万数据以上的时候执行很慢,而且会足协多路复用的io主线程,是以阻塞方式运行的
Scan通过游标分布进行的不会阻塞线程,
3. 如何开启和执行事务?
答:通过multi命令开启事务,通过exec命令执行事务
4. 使用管道(Pipeline)有什么好处?
答:减少服务器压力,减少链路层中的事件消耗,将大量操作结合成少量的操作。
原生命令(mset、mget)与pipeline的对比
数据库
1. 请写出以下MySQL语句的格式 : 插入 ,更新 ,删除。
表名 students
username tel content date
张三 13801281191 大专毕业 2006-10-11
李四 13612312331 本科毕业 2006-10-15
王五 021-55665566 硕士毕业 2006-10-15
a) 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
答:Insert into students values(‘小王’,’ 13254748547’,’ 高中毕业’,’ 2007-05-06’)
b) 请用sql语句把张三的时间更新成为当前系统时间
答:Update students set date=date(now()) where username=’张三’
请写出删除名为张四的全部记录
答:Delete from student where username in (‘张’,’四’)
c) 请给date 字段列增加一个普通索引
**mysql** ALTER TABLE 表名 ADD 索引类型 (unique,primary key,fulltext,index)[索引名](字段名)
**pg** CREATE INDEX index_name ON table_name;
**oracle** create index 索引名 on 表名(列名);
2. 表中有 A B C 三列,用 MySQL 语句实现:当 A 列大于 B 列时选择 A 列,否则选择 B 列,当B 列大于 C 列时选择 B 列否则选择 C 列。
:select
(case when a>b then a else b end),
(case when b>c else c end)
from table_name
3. 如何处理大数据表分页?提供SQL语句即可。
答:
**mysql** Select * from table order by id limit 1000,10()
**oracle**SELECT *
FROM (SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A
WHERE ROWNUM <= 40)
WHERE RN > 20
**pg**SELECT * FROM table_name
LIMIT [pageSize] OFFSET [pageNum]
-- pageSize:每页显示条数
-- pageNum:从第几条开始查询
select * from class_name LIMIT 3;
- 表连接的左关联和右关联有什么区别?
答:1、左连接查询以左边的表为主,左表字段全显示,右边有就显示,没有就不显示
2、右连接以右表为主,右边表的字段全部显示,右表有就显示,没有就不显示。
建立索引:是一种单独的、物理的堆数据库一列或多列 的值进行排序的存储结构,索引维护这这种查询树,频繁的对数据进行修改,就会影响树的每个节点变化,不停的进行IO操作对数据库有影响的,所以一般建立所有都是在数据变化不大,查询频率比较高的数据进行建立索引。
卷二
1.(小型,共100分)有如下数据库表 inf_organization:
字段名 字段类型 说明
id int 主键,自增主键
name varchar(50) 机构名称,非空
name_pinyin varchar(50) 机构名称拼音首字母,可空
create_time datetime 创建日期
要求:实现一个Java程序,利用Jdbc和第三方拼音库(自选)将name中的中文文本转为拼音首字母填入name_pinyin字段。(占35分)
加分项:
-
利用多线程加快执行速度,合理运用多线程的设计模式;(占35分)
-
合理运用Java和Jdbc的各种特性,使得代码高效;(占10分)
-
使用Maven或其他常见包管理;(占5分)
-
充分利用面向对象抽象;(占5分)
-
代码条理清晰,格式好。(占10分)
-
(中型,共100分)下面是百度提供的免费接口,用以识别手机号码:
GET http://mobsec-dianhua.baidu.com/dianhua_api/open/location?tel=13888888888
其返回如下所示:
{
“response”: {
“13888888888”: {
“detail”: {
“area”: [
{
“city”: “昆明”
}
],
“province”: “云南”,
“type”: “domestic”,
“operator”: “移动”
},
“location”: “云南昆明移动”
}
},
“responseHeader”: {
“status”: 200,
“time”: 1580896481103,
“version”: “1.1.0”
}
}文章来源:https://www.toymoban.com/news/detail-406054.html
要求:利用Spring Boot和Maven包管理,实现一个Web程序。该Web程序采用前后端分离技术,前端页面提供输入框输入手机号码,并发至后端查询,最终展示该手机号码的归属地和运营商信息(即以上Json中的云南/昆明和移动字样)。(占20分)
注意:对前端不做要求,可以相对简陋。
加分项:文章来源地址https://www.toymoban.com/news/detail-406054.html
- 采用缓存机制,加快已经查过的手机号码的查询速度。缓存可采用关系型数据库或其他存储媒介。如果用到,需提供对应的结构信息。可采用多级缓存机制,视复杂情况和流程给分,需要注意避免无谓的复杂和逻辑混乱;(占20分)
- 外部接口调用失败时,采用重试机制。屡次失败返回错误提示;(占10分)
- 实现一种时间上限的机制,当外部接口超过5s仍未返回时,返回超时错误提示;(占15分);
- 避免使用Java原生方法,Spring框架提供的机制要充分利用;(占10分)
- 充分考虑各种边界条件,异常处理合理;(占10分);
- 采用Restful规范实现接口,结构简单清楚明了;(占5分)
- 代码条理清晰,格式好。(占10分)
到了这里,关于车300面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!