spring框架面試題目:https://blog.csdn.net/m0_37852553/article/details/78678278(這是必須要看的)javascript
https://blog.csdn.net/WYpersist/article/details/80274561html
1.mysql怎样调优:java
禁止使用select * ; 禁止使用in ,not in,or,having,使用exists 和not exists代替mysql
避免使用 union ,使用union all来代替jquery
避免使用两端模糊查询 like '%###%'面试
尽可能少用链接查询 join 尽可能使用join代替子查询、ajax
尽可能提早筛选条件(筛选条件的时候要,先筛选大条件,再筛选小条件 例子:筛选小于30岁的男生,(注意先筛性别,在筛选年龄) )算法
尽可能使用索引来提升查询效率 尽可能避免在where条件中进行运算 尽可能批量的操做数据(好比说插入100条数据,建议一次性插完,而不是插入100次)spring
尽可能避免使用is null is not null <> !=之类的sql
少用排序(若是项目中没有让使用排序,那就尽可能少使用排序)
2.HashMap的源码,实现原理,JDK8中对HashMap作了怎样的优化。
数组+链表 这是1.8版本以前的。 数组+链表+红黑树 这是1.8版本以后的。
3.HaspMap扩容是怎样扩容的,为何都是2的N次幂的大小
4.HashMap,HashTable,ConcurrentHashMap的区别。
HashTable底层数组+链表实现,不管key仍是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,初始size为11
HashMap底层数组+链表实现,可以存储null键和null值,线程不安全,初始size为16
5.极高并发下HashTable和ConcurrentHashMap哪一个性能更好,为何,如何实现的
HashTable使用一把锁处理并发问题,当有多个线程访问时,须要多个线程竞争一把锁,致使阻塞
ConcurrentHashMap则使用分段,至关于把一个HashMap分红多个,而后每一个部分分配一把锁,这样就能够支持多线程访问
6.HashMap在高并发下若是没有处理线程安全会有怎样的安全隐患,具体表现是什么
多线程put时可能会致使get无限循环,具体表现为CPU使用率100%;
缘由:在向HashMap put元素时,会检查HashMap的容量是否足够,若是不足,则会新建一个比原来容量大两倍的Hash表,而后把数组从老的Hash表中迁移到新的Hash表中,迁移的过程就是一个rehash()的过程,多个线程同时操做就有可能会造成循环链表,因此在使用get()时,就会出现Infinite Loop的状况
7.java中四种修饰符的限制范围。
8.Object类中的方法
该方法用于哈希查找,重写了equals方法通常都要重写hashCode方法。这个方法在一些具备哈希功能的Collection中用到。
通常必须知足obj1.equals(obj2)==true。能够推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不过为了提升效率,应该尽可能使上面两个条件接近等价。
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具备该对象的锁。wait()方法一直等待,直到得到锁或者被中断。wait(longtimeout)设定一个超时间隔,若是在规定时间内没有得到锁就返回。
调用该方法后当前线程进入睡眠状态,直到如下事件发生。
(1)其余线程调用了该对象的notify方法。
(2)其余线程调用了该对象的notifyAll方法。
(3)其余线程调用了interrupt中断该线程。
(4)时间间隔到了。
此时该线程就能够被调度了,若是是被中断的话就抛出一个InterruptedException异常。
9.接口和抽象类的区别,注意JDK8的接口能够有实现。
Java 8新特性–接口默认方法
默认方法是在接口中的方法签名前加上 default 关键字的实现方法。
10.动态代理的两种方式,以及区别。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Intermediary implements InvocationHandler{ private Object post; Intermediary(Object post){ this.post = post; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object invoke = method.invoke(post, args); System.out.println("中介:该房源已发布!"); return invoke; } }
import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { Rent rent = new Landlord(); Intermediary intermediary = new Intermediary(rent); Rent rentProxy = (Rent) Proxy.newProxyInstance(rent.getClass().getClassLoader(), rent.getClass().getInterfaces(), intermediary); rentProxy.rent(); } }
2.CGLIB动态代理:
public class Landlord { public void rent(){ System.out.println("房东要出租房子了!"); } }
import java.lang.reflect.Method; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; public class Intermediary implements MethodInterceptor { @Override public Object intercept(Object object, Method method, Object[] args,MethodProxy methodProxy) throws Throwable { Object intercept = methodProxy.invokeSuper(object, args); System.out.println("中介:该房源已发布!"); return intercept; } }
import net.sf.cglib.proxy.Enhancer; public class Test { public static void main(String[] args) { Intermediary intermediary = new Intermediary(); Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Landlord.class); enhancer.setCallback(intermediary); Landlord rentProxy = (Landlord) enhancer.create(); rentProxy.rent(); } }
11.java序列化的方式
Serializable:一个对象想要被序列化,那么它的类就要实现 此接口,这个对象的全部属性(包括private属性、包括其引用的对象)均可以被序列化和反序列化来保存、传递。
Externalizable:他是Serializable接口的子类,有时咱们不但愿序列化那么多,可使用这个接口,这个接口的writeExternal()和readExternal()方法能够指定序列化哪些属性;
12.传值和传引用的区别,Java是怎么样的,有没有传值引用。
一、传值:传值就是指将一个值传递到方法的内部。例如int a = 5,那么也就是给int型变量a赋值,值为5.若是一个方法,将这个变量传进方法的内部,则进行的就是传值。在java中,有8种基本数据类型,它们分别为:int、long、float、double、char、boolean、short、byte.这8种基本的数据类型做为参数进行传递是,都是进行的传值。·除此以外,还有一种特殊的状况,String。自己String是一个引用类型,不少人认为在向方法中传递String类型参数时,是进行传引用。其实在这里,String能够看作为一个包装类,由于String其自己就是经过字符数组实现的,那么它在实现参数传递的时候,也就是以char型数据的方式进行的,也就是进行传值。
二、传引用:java中的引用能够初步的理解为地址。也是在new了一个对象后,该对象是存在JVM的Heap区,也就是堆。那么必然有一个地址要指向这个对象的在JVM中的位置,那么,指向这个对象的这个地址就能够简单的理解为“引用”。
13.一个ArrayList在循环过程当中删除,会不会出问题,为何。
14.@transactional注解在什么状况下会失效,为何。
通俗的说,编译器能检测到的是checked,检测不到的就是unchecked。
派生于Error或者RuntimeException(好比空指针,1/0)的异常称为unchecked异常。
继承自Exception得异常统称为checked异常,如IOException、TimeoutException等。
四、只读事务:
@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
只读标志只在事务启动时应用,不然即便配置也会被忽略。
启动事务会增长线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。一般状况下,仅是读取数据时,没必要设置只读事务而增长额外的系统开销。
15.线程池的参数有哪些,在线程池建立一个线程的过程。
16.volitile关键字的做用,原理。
17.能够考Spring中使用了哪些设计模式
单例模式
对象的建立都是单例模式
工厂模式
beanfactory建立对象用的是工厂模式
模版方法
jdbcTemplate
代理模式
spring的AOP
还有不少,可是暂时不懂,能说出来的就是这些
18.dubbo的组件有哪些,各有什么做用。
Provider:提供者
Consumer:消费者
registry:注册中心(至关于中介)
monitor:监控中心(dubbo本身的监控项目,直接解压在tomcat下就能启动了,能够查看消费者,生产者)-----------
https://blog.csdn.net/qq_24853627/article/details/79380707
container:服务容器
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册本身提供的服务。
服务消费者在启动时,向注册中心订阅本身所需的服务。
注册中心返回服务提供者地址列表给消费者,若是有变动,注册中心将基于长链接推送变动数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,若是调用失败,再选另外一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
19.zookeeper的负载均衡算法有哪些。
通常来讲负载均衡设备都会默认支持多种负载均衡分发策略,例如:
Ø 轮询(RoundRobin)将请求顺序循环地发到每一个服务器。当其中某个服务器发生故障,AX就把其从顺序循环队列中拿出,不参加下一次的轮询,直到其恢复正常。
Ø 比率(Ratio):给每一个服务器分配一个加权值为比例,根椐这个比例,把用户的请求分配到每一个服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 优先权(Priority):给全部服务器分组,给每一个组定义优先权,将用户的请求分配给优先级最高的服务器组(在同一组内,采用预先设定的轮询或比率算法,分配用户的请求);当最高优先级中全部服务器或者指定数量的服务器出现故障,AX将把请求送给次优先级的服务器组。这种方式,实际为用户提供一种热备份的方式。
Ø 最少链接数(LeastConnection):AX会记录当前每台服务器或者服务端口上的链接数,新的链接将传递给链接数最少的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 最快响应时间(Fast Reponse time):新的链接传递给那些响应最快的服务器。当其中某个服务器发生故障,AX就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
以上为通用的负载均衡算法,还有一些算法根据不一样的需求也可能会用到,例如:
Ø 哈希算法( hash): 将客户端的源地址,端口进行哈希运算,根据运算的结果转发给一台服务器进行处理,当其中某个服务器发生故障,就把其从服务器队列中拿出,不参加下一次的用户请求的分配,直到其恢复正常。
Ø 基于策略的负载均衡:针对不一样的数据流设置导向规则,用户可自行编辑流量分配策略,利用这些策略对经过的数据流实施导向控制。
Ø 基于数据包的内容分发:例如判断HTTP的URL,若是URL中带有.jpg的扩展名,就把数据包转发到指定的服务器。
20.dubbo是如何利用接口进行通讯的
Dubbo的整个远程通讯层由exchange,transport, serialize
exchange,信息交换层,封装请求响应模式,同步转异步,以Request, Response为中心,扩展接口为Exchanger, ExchangeChannel, HeaderExchangeHandler,ExchangeClient, ExchangeServer
transport,网络传输层,抽象mina和netty为统一接口,以Message为中心,扩展接口为Channel, Transporter, Client, Server,Codec
serialize,数据序列化层,可复用的一些工具,扩展接口为Serialization, ObjectInput, ObjectOutput,ThreadPool
21.JDK8的新特性,流的概念及优点,为何有这种优点
package com.bjsxt.dp.jdk; import java.text.Collator; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.Collector; //这是在jdk8以前对集合进行排序 public class Jdk8Before { public static void main(String[] args) { List<String> asList = Arrays.asList("d","c","a","f","g","k"); /* Collections.sort(asList,new Comparator<String>() { @Override public int compare(String o1, String o2) { // TODO Auto-generated method stub return Collator.getInstance().compare(o1, o2); } });*/ //使用lambda表达式对集合进行遍历 Collections.sort(asList,(String o1,String o2)->{ return Collator.getInstance().compare(o1, o2); }); System.out.println(asList); } } 最后的运行结果:[a, c, d, f, g, k]
22.json的解析
json的格式:
{} 对象 {“key”:"value","k1":"v1"}
[] 数组 [{},{}]
json示例:描述一个学生
{"name":"张三",“age”:18,"gender":1}
写json和获取json:注意json就是一种javascript类型的语言
上面是存储一个对象,下面是存储两个对象
描述班级的信息:
其中双引号是能够省略的,可是不建议省略
var json={“classname”:"三年一班",“students”:[{"name":"lilei","age":18,"sex":true},{"name":"hanmeimei","age":17,"sex":true}]}
alert(json.students[1].name);
从上面的案例中能够看出:json就是一个对象。可以直接点出来他的属性,最后拿到他的值。
json的解析:
服务器给浏览器使用ajax返回数据xml的,html的,json的
使用jquery的方式遍历数组的方式:使用的是each(function(){})
json数据格式的优势:轻量级交互语言 结构简单 易于解析
同窗面试题目:
编写java方法,经过反射的机制,调用String 类型的toUpperCase方法将小写字符串转换成大写的字符串。
中科软今天的电话面试题目:
有一个数组,其中可能保存这相同的数字,请你编程实现统计其中的每一个数字一共出现了多少次? (这个必定要记住!!!)
一般咱们看到的考试页面,其中会设计到几个数据库,请说出你的设计?
这是网上的答案:
https://jingyan.baidu.com/article/afd8f4de86ddef34e286e9a2.html (怎样安全的度过试用期)