面试题

string里怎么重写equals的

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

mysql引索

b+树与红黑树

为什么要用es

关系型数据库,把原本非常形象的对象,拍平了,拍成各个字段,存在数据库,查询时,再重新构造出对象;ES则是文档存储,把对象原原本本地放进去,取出时直接取出。

springmvc流程

requestbody、responsebody、RequestMapping

@RequestMapping
国际惯例先介绍什么是@RequestMapping,@RequestMapping 是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有。

@ResponseBody出参
@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。

@RequestBody
@RequestBody 注解则是将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。

作用:
1) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上;
2) 再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上。

控制器、拦截器哪个先执行

like走索引吗

如果是用like '数学%'这种模糊查询的是可以走范围索引的
如果开头有%号是不走索引的

${}、#{}

, #{} 占位符 ---> 参数占位符 ?,即sql 预编译
, ${} 拼接符 --->字符串替换,即 sql 拼接

1)#{}:动态解析 -> 预编译 -> 执行
2)${}:动态解析 -> 编译 -> 执行

  • {} 和 ${} 在使用中的技巧和建议
    (1)不论是单个参数,还是多个参数,一律都建议使用注解@Param("")
    (2)能用 #{} 的地方就用 #{},不用或少用 ${}
    (3)表名作参数时,必须用 ${}。如:select * from ${tableName}
    (4)order by 时,必须用 ${}。如:select * from t_user order by ${columnName}
    (5)使用 ${} 时,要注意何时加或不加单引号,即 ${} 和 '${}'

悲观锁、乐观锁

乐观锁
总是假设最好的情况,每次去读数据的时候都认为别人不会修改,所以不会上锁, 但是在更新的时候会判断一下在此期间有没有其他线程更新该数据, 可以使用版本号机制和CAS算法实现。 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。 在Java中java.util.concurrent.atomic包下面的原子变量类就是基于CAS实现的乐观锁。

悲观锁
总是假设最坏的情况,每次去读数据的时候都认为别人会修改,所以每次在读数据的时候都会上锁, 这样别人想读取数据就会阻塞直到它获取锁 (共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。 传统的关系型数据库里边就用到了很多悲观锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。 Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。

多线程join

main{
a.start();
b.start();
a.join();
}
例子3的执行顺序:
主线程开始->a 和 b 看脸谁先开始 ->a 和 b 看脸谁先死 -> 如果是a先死,那么主线程终止,b继续跑,跑完死;
|->如果是b先死,那么a继续跑,跑完a死,主线程死;

一个线程直接run,会有问题吗

不会
线程调用run方法和调用一般方法没差别,调用start方法才会开辟新线程
run的线程就是主线程

线程是在jvm还是操作系统

Java 的线程和操作系统的线程是一一对应的。使用 Java 线程就是使用一个操作系统本地线程。

在 Java1.1 的时候,Solaris 系统上的 JVM,其线程和操作系统线程并不是一一对应的,称之为 绿色线程 。
所谓绿色线程,即该线程是虚拟机层面上的线程,由虚拟机创建,调度和销毁,操作系统对这种线程一无所知。由于绿色线程实现复杂,并且相当于 OS 的原生线程又有着诸多限制,所以 Java 后续的版本就放弃采用这种方式。

posted @ 2021-08-25 23:13  Drsyq  阅读(46)  评论(0)    收藏  举报