本套题目共7页,请在30分钟内选择作答,正确率优先。
Java基础
- Java中的内存泄漏是怎么回事?请举例。
答:内存泄漏就是不再使用的对象占用内存而无法及时回收。
ThreadLocalMap使用ThreadLocal的弱引用作为key。如果一个ThreadLocal不存在外部强引用时,Key (ThreadLocal)势必会被GC回收,这样就会导致ThreadLocalMap中key为null,而value还存在着强引用。只有thead线程退出以后,value的强引用链条才会断掉.
- equals和==的区别是什么?
答:① ==是运算符,而equals是Objec类中的方法;
② ==可以比较基本类型和引用类型,而equals只能比较引用类型;
③ ==判断基本类型时,是比较大小,判断引用类型时比较地址, equals方法在重写之前默认以==实现,而重写之后会比较引用类型中的值。
- 实现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
- 下面的方法,当输入为2的时候返回值是多少?
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
a.下述代码在多线程环境中是否存在问题?若有,如何修正?
b.下述代码中的volatile关键字是什么意思?如果删除对该段代码有何影响?
class Counter { private volatile int count = 0; public int getNext() { return ++count; } } |
答:a:存在问题,不能保证++count的原子性,可以使用synchronized关键字来同步对getNext()方法的访问,或者使用原子类比如AtomicInteger替换普通整型变量。
b:volatile关键字修饰的变量能保证有序性和可见性。
如果删除可能会出现其他线程修改了变量而另一个线程不能立刻看到修改的新值。
还可能造成++count错误赋值。
- BlockingQueue相比普通的Queue最大的区别是什么?
可以使用@Qualifier注解来指定具体要注入哪个Bean。例如,假设有两个同类型的Bean分别命名为"beanA"和"beanB",则可以在使用@Autowired注解进行自动装配时,通过添加@Qualifier("beanA")或@Qualifier("beanB")来指定具体要注入哪个Bean。@
- Thread.sleep() 可能抛出的 InterruptedException 代表什么?如何处理?
该线程被中断,取消中断状态,捕获异常
如何实现一个方法,该方法执行某项任务并设定某个时间限制,如果该任务能在限制时间内完成则返回任务执行结果,否则返回null?写出核心代码。@
- 如何实现一个方法,该方法执行某项任务并设定某个时间限制,如果该任务能在限制时间内完成则返回任务执行结果,否则返回null?写出核心代码。
- 不使用SDK自带库,使用基本Java语言实现将传入的数组内容反转
void reverse(char[] data)
答: 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"); |
Spring
- @Controller中,跳转(“redirect: url”)和转发(“forward: url”)有什么区别?
- 下面是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的方法中获取框中的数值?
- 使用注解(如@Component)声明Bean,如何指定Bean加载顺序?
- 多个同类型的Bean,使用注解注入时如何指定?
答:可以使用@Qualifier
注解来指定具体要注入哪个Bean。例如,假设有两个同类型的Bean分别命名为"beanA"和"beanB",则可以在使用@Autowired
注解进行自动装配时,通过添加@Qualifier("beanA")
或@Qualifier("beanB")
来指定具体要注入哪个Bean。
MyBatis
- XML映射中,SQL语句的两种参数注入方法:#和$的区别?
答:#{}将传入的数据当做一个字符串,对自动传入的数据加一个双引号。是预编译可以方式sql注入。
${}将传入的数据直接生成在sql中,字符串替换。
- XML映射中,如何使用LIKE进行模糊查询?
答:like ‘{%条件%}’
- XML映射中,如何批量插入传入的集合(Collection<E>)?
即,如何根据集合生成如下SQL?
INSERT INTO TABLE_NAME(a, b, c) VALUES (a1, b1, c1), (a2, b2, c2) … |
- XML映射中,如何在插入的同时获取MySQL自增字段(AUTO_INCREMENT)的生成值?
Redis
- 如何使key对应的值过5秒后失效?
答: EXPIRE命令可以设置键的过期时间
设置key对应的值五秒过期命令:EXPIRE key 5
- scan和keys命令的区别?
答:keys用来删除相关key的时候使用,但在有数百万数据以上的时候执行很慢,而且会足协多路复用的io主线程,是以阻塞方式运行的
Scan通过游标分布进行的不会阻塞线程,所以在数据多的时候用sacn命令时性能更好
- 如何开启和执行事务?
答:multi开启事务,exec 执行事务
- 使用管道(Pipeline)有什么好处?
答:可以显著提高客户端与服务器之间的通信效率。
当需要在Redis中执行多个命令时,如果不使用管道,那么客户端将需要为每个命令单独发送请求并等待响应。这会导致大量的网络延迟,并降低整体性能。
而使用管道可以将多个命令一次性发送到服务器,并在所有命令执行完成后一次性返回所有响应。这样可以减少网络延迟,并大大提高整体性能。
而且由于管道允许一次性发送多个命令,因此它还可以帮助更好地组织代码,并使代码更易于阅读和维护
数据库
- 请写出以下MySQL语句的格式 : 插入 ,更新 ,删除。
表名 | students | ||
username | tel | content | date |
张三 | 13801281191 | 大专毕业 | 2006-10-11 |
李四 | 13612312331 | 本科毕业 | 2006-10-15 |
王五 | 021-55665566 | 硕士毕业 | 2006-10-15 |
- 有一新记录(小王 13254748547 高中毕业 2007-05-06)请用SQL语句新增至表中
答: insert into students values(‘小王’,’13254748547’,’ 13254748547’,’高中毕业’,’ 2007-05-06’);
- 请用sql语句把张三的时间更新成为当前系统时间
答:Update students set date=date(now()) where username=’张三’;
- 请写出删除名为张四的全部记录
答:Delete from students where username = ‘张四’;
- 请给date 字段列增加一个普通索引
- 表中有 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
- 如何处理大数据表分页?提供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;
- 表连接的左关联和右关联有什么区别?
答:表连接的左关联(LEFT JOIN)和右关联(RIGHT JOIN)之间的主要区别在于它们返回结果中包含哪些行。
使用左关联连接两个表时,结果集将包含左表中的所有行,即使右表中没有匹配的行。对于右表中没有匹配行的左表行,结果集中相应的右表列将为NULL。
使用右关联连接两个表时,结果集将包含右表中的所有行,即使左表中没有匹配的行。对于左表中没有匹配行的右表行,结果集中相应的左表列将为NULL。
- 下面哪些语句可以使用索引,而哪些不能?为什么?可以用索引的,怎么建索引?
a)select account_name from trans where amount!=0
b)select account_name,amount from trans where account_name='amex' and account_type='a'
c)select account_name,amount from trans where account_name like ‘zhang%’
答:a语句不能使用索引。因为它使用了不等于(!=)运算符,这会导致MySQL无法有效地使用索引来优化查询。
b语句可以使用索引。可以在account_name和account_type列上创建索引来优化此查询。可以使用以下SQL语句创建复合索引:
CREATE INDEX idx_account_name_type ON trans (account_name, account_type);
c) 此语句也可以使用索引。您可以在account_name列上创建索引来优化此查询。例如,可以使用以下SQL语句创建索引:
CREATE INDEX idx_account_name ON trans (account_name);