车300面试题

卷一

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 列。

selectcase 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. 表连接的左关联和右关联有什么区别?
    答: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分)
加分项:

  1. 利用多线程加快执行速度,合理运用多线程的设计模式;(占35分)

  2. 合理运用Java和Jdbc的各种特性,使得代码高效;(占10分)

  3. 使用Maven或其他常见包管理;(占5分)

  4. 充分利用面向对象抽象;(占5分)

  5. 代码条理清晰,格式好。(占10分)

  6. (中型,共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”
    }
    }

要求:利用Spring Boot和Maven包管理,实现一个Web程序。该Web程序采用前后端分离技术,前端页面提供输入框输入手机号码,并发至后端查询,最终展示该手机号码的归属地和运营商信息(即以上Json中的云南/昆明和移动字样)。(占20分)
注意:对前端不做要求,可以相对简陋。
加分项:

  1. 采用缓存机制,加快已经查过的手机号码的查询速度。缓存可采用关系型数据库或其他存储媒介。如果用到,需提供对应的结构信息。可采用多级缓存机制,视复杂情况和流程给分,需要注意避免无谓的复杂和逻辑混乱;(占20分)
  2. 外部接口调用失败时,采用重试机制。屡次失败返回错误提示;(占10分)
  3. 实现一种时间上限的机制,当外部接口超过5s仍未返回时,返回超时错误提示;(占15分);
  4. 避免使用Java原生方法,Spring框架提供的机制要充分利用;(占10分)
  5. 充分考虑各种边界条件,异常处理合理;(占10分);
  6. 采用Restful规范实现接口,结构简单清楚明了;(占5分)
  7. 代码条理清晰,格式好。(占10分)
  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值