java面试题总结

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();   
    }  
}  
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值