Java基础
1、java中的内存泄漏是怎么回事
答:
内存泄漏是指你向系统申请分配内存进行使用,然后系统在堆内存中给这个对象申请一块内存空间,但当我们使用完了却没有归系统,导致这个不使用的对象一直占据内存单元,造成系统将不能再把它分配给需要的程序。
一次内存泄漏的危害可以忽略不记,但是内存泄漏堆积则后果很严重
2、 BlockingQueue相比普通的Queue最大的区别是什么?
答:
1.阻塞队列获取元素时,如果队列为空,则会等待队列有元素,否则就阻塞队列(普通队列返回结果,无元素)
2.阻塞队列放入元素时,如果队列满,则等待队列,直到有空位置,然后插入。(普通队列,要么直接扩容,要么直接无法插入,不阻塞)
阻塞队列的最佳场景就是生产者和消费者,使用代码时无需判断直接获取并处理(普通队列得判断有没有元素,阻塞队列不用判断,无元素自身就会阻塞,直到有东西)
Spring
1、 @Controller中,跳转(“redirect: url”)和转发(“forward: url”)有什么区别?
答:redict是重定向,是服务端发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.,原来页面和后来的页面不能用于共享数据,一般用于用户注销登录返回页面和跳转到其他网站,效率相对来说比较低,
Forward是转发,服务器请求资源,直接访问目标地址的URL,读取到那个URL的响应内容,然后把这些内容再转发给浏览器,地址栏还是原来的地址栏,转发页面和转发到的页面可以共享request里的数据,相对来说效率比较高。
2、 使用注解(如@Component)声明Bean,如何指定Bean加载顺序?
答:注册 Bean 的时候可以使用 @Order 注解来指定 Bean 的权重(或顺序)。
在使用有序集合(数组或 List)注入的时候,会根据权重来排序。
@Order 注解也可和 @Component 等注解一起使用。
@Order:指定注册同类型的 Bean 的权重(或顺序),值越小,权重越大。
3、多个同类型的Bean,使用注解注入时如何指定?
答:@Primary: 指定主要的 Bean,存在注入冲突时默认注入的 Bean
@Qualifier:指定注入 Bean 的名称
Mybatis
1、 XML映射中,SQL语句的两种参数注入方法:#和$的区别?
答:#{}将传入的数据当做一个字符串,对自动传入的数据加一个双引号。是预编译可以防止sql注入。如:order by #user_id#,如果传入的值是id,则解析成的sql为order by “id”。
${}将传入的数据直接生成在sql中,字符串替换。如:order by
u
s
e
r
i
d
user_id
userid,如果传入的值是id,则解析成的sql为order by id。
Redis
1. 如何使key对应的值过5秒后失效?
答:expire key 5
设置了失效时间,redis也可能存放在redis 的内存中,redis采用的是软清理的方式,通过以一定的算法进行处理。
2. scan和keys命令的区别?
答:keys用来删除相关key的时候使用,但在有数百万数据以上的时候执行很慢,而且会足协多路复用的io主线程,是以阻塞方式运行的
Scan通过游标分布进行的不会阻塞线程,
3. 如何开启和执行事务?
答:通过multi命令开启事务,通过exec命令执行事务
4. 使用管道(Pipeline)有什么好处?
答:减少服务器压力,减少链路层中的事件消耗,将大量操作结合成少量的操作。
数据库
1、请用sql语句把张三的时间更新成为当前系统时间
答:Update students set date=date(now()) where username=‘张三’;
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、 如何处理大数据表分页?
答:Select * from table order by id limit 1000,10();
4、实现一个Java程序,利用Jdbc和第三方拼音库(自选)将name中的中文文本转为拼音首字母填入name_pinyin字段。(重点)
答:
(1)、对于使用maven的项目,直接添加依赖 pinyin4j这个java工具包,(官方网站:http://pinyin4j.sourceforge.net/)
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.0</version>
</dependency>
(2)、我收集了现成的工具类,提供了三个基本的转化方法,亲测可以直接使用。
package oa.common.utils;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
/**
* 拼音工具类
*
* @author lsf
*/
public class PingYinUtil {
/**
* 将字符串中的中文转化为拼音,其他字符不变
*
* @param inputString
* @return
*/
public static String getPingYin(String inputString) {
HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
format.setCaseType(HanyuPinyinCaseType.LOWERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
format.setVCharType(HanyuPinyinVCharType.WITH_V);
char[] input = inputString.trim().toCharArray();
String output = "";
try {
for (int i = 0; i < input.length; i++) {
if (java.lang.Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) {
String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format);
output += temp[0];
} else
output += java.lang.Character.toString(input[i]);
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
return output;
}
/**
* 获取汉字串拼音首字母,英文字符不变
* @param chinese 汉字串
* @return 汉语拼音首字母
*/
public static String getFirstSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
if (temp != null) {
pybf.append(temp[0].charAt(0));
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString().replaceAll("\\W", "").trim();
}
/**
* 获取汉字串拼音,英文字符不变
* @param chinese 汉字串
* @return 汉语拼音
*/
public static String getFullSpell(String chinese) {
StringBuffer pybf = new StringBuffer();
char[] arr = chinese.toCharArray();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
for (int i = 0; i < arr.length; i++) {
if (arr[i] > 128) {
try {
pybf.append(PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat)[0]);
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pybf.append(arr[i]);
}
}
return pybf.toString();
}
}