1、手写二分查找(递归)
public static int binarySerch(int [] a,int low,int high,int key){ int mid=(high+low)/2; if(key<a[low]||key>a[high]){ return -1; }else if(key==a[mid]){ return mid; }else if(key<a[mid]){ return binarySerach(a,low,mid-1,key); }else if(key>a[mid]){ return binarySerach(a,mid+1,high,key); } return -1; }
2、
String a="abc"; String b="abc"; a.equal(b); a==b;
各自的返回值是什么?String对象存在什么里?堆还是栈?
返回值都是true。
equal方法比较的是内容,==对基本数据类型比较的是值,对引用数据类型比较的是地址。在当前例子中,a和b都是对字符串abc的引用,所以地址是一致的。
String对象存在堆里。
栈存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
堆:存放所有new出来的对象。
4、构造方法能否重写?能否重载?
构造方法无法被子类继承,所以无法重写。
可以重载,通过创建不同参数的构造方法,灵活地创建对象。
3、说一下finally,有什么用途?
finally:在try catch异常捕捉代码块中,不管是否发生异常,finally代码块一定会被执行。
一般情况下,把关闭物理连接池(数据库连接、IO流、Socket连接)放在其中。
4、你怎么做数据库查询优化?
1、尽量避免出现select * from 表,要尽可能明确查询的字段。
2、在一个SQL语句中,如果一个where条件过滤的数据库记录越多,定位越准确,则该where条件越应该前移。
3、查询时尽量用索引覆盖,即对SELECT的字段建立复合索引,这样查询时只进行索引扫描,不读取数据块。
4、在判断有无符合条件的记录时尽量不要使用select count(*)和select top 1。
5、使用内层限定原则,在拼写SQL语句时,将查询条件分解、分类,并尽量在SQL语句最里层限定,以减少数据的处理量。
6、应避免在order by字句中使用表达式。
7、小心使用in和or,在in中的数据尽量不超过两百个。
5、索引怎么创建,为什么要用索引?
创建索引语法:
CREAT INDEX index_name ON table_name(colume name1,colume name2……)
索引相当于书籍的目录,能提高数据的检索速度。
6、说一说你理解的事务?
SQL采用事务将一系列不可分割的数据库操作作为整体来执行,保证数据库数据库的时效性和完整性。
7、讲一下Object,它有什么常用方法?
java.lang.Object,所有类都直接或间接继承了Object类,Object类是所有类的父类。
Object类的常用方法:
equals()方法:比较两个对象的引用是否相同。
toString()方法:返回一个“以文本方式表示”此对象的字符串。
getClass()方法:返回调用该方法的对象的类。
hashCode()方法:返回对象的散列值。
clone()方法:快速创建一个对象的引用副本。
finalize()方法:垃圾回收器准备释放内存的时候,会先调用finalize()。
wait()、notify()、notifyAll()用于线程相关操作。
8、@Service有什么用?
标记服务层,完成依赖注入,在控制层中可以用@AutoWired自动装配。
9、说一下@RestController
@RestController相当于@ResponseBody+@Cpmtroller合在一起。
在方法中使用@ResponseBody注解,如果方法需要返回json数据,就可以使用@ResponseBody注解。
而如果某个控制器类下的所有方法需要返回json数据的话,就可以使用@RestController。但需要注意的是,如果使用了@RestController注解,那么该控制器下的方法都不会再返回视图。
10、RabbitMQ分发多个消息的原理
RabbitMQ有四种消息分发模式,主要用的有3种,Fanout(广播模式)、Direct(队列模式)、Topic(主题模式),分发多个消息指的就是广播模式。
RabbitMQ拿到消息之后,会先交给 交换机 (Exchange), 然后交换机再根据预先设定的不同绑定( Bindings )策略,来确定要发给哪个队列。
而对广播模式而言,它不处理路由键,只需要简单的将队列绑定到exchange上,一个发送到exchange的消息都会被转发到与该exchange绑定的所有队列上。
11、Redis最多可以存储多少数据(也好像是每秒内查询次数)?是单线程还是多线程?怎么证明?
Redis没有存储多少数据的指标,存储的数据实际上是根据实际容量。在配置时:
设置redis.conf中的maxmemory选项,该选项是告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。
(Redis可以达到100000+的QPS(每秒内查询次数))
Redis是单线程。
证明:可以通过显示线程命令来查看。[参考【1】]
参考:
【1】、https://blog.csdn.net/bntX2jSQfEHy7/article/details/79479152
三分恶
微信公众号
基础、原理、实战,搞Java,玩真的。