java面试题目

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

  • ConcurrentHashMap底层采用分段的数组+链表实现,线程安全

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类中的方法

clone方法:保护方法,实现对象的浅复制,只有实现了Cloneable接口才能够调用该方法,不然抛出CloneNotSupportedException异常

getClass方法:final方法,得到运行时类型。

toString方法:该方法用得比较多,通常子类都有覆盖。

finalize方法:该方法用于释放资源。由于没法肯定该方法何时被调用,不多使用

equals方法:该方法是很是重要的一个方法。通常equals和==是不同的,可是在Object中二者是同样的。子类通常都要重写这个方法

hashCode方法:

该方法用于哈希查找,重写了equals方法通常都要重写hashCode方法。这个方法在一些具备哈希功能的Collection中用到。

通常必须知足obj1.equals(obj2)==true。能够推出obj1.hash-Code()==obj2.hashCode(),可是hashCode相等不必定就知足equals。不过为了提升效率,应该尽可能使上面两个条件接近等价。

wait方法:

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具备该对象的锁。wait()方法一直等待,直到得到锁或者被中断。wait(longtimeout)设定一个超时间隔,若是在规定时间内没有得到锁就返回。

调用该方法后当前线程进入睡眠状态,直到如下事件发生。

(1)其余线程调用了该对象的notify方法。

(2)其余线程调用了该对象的notifyAll方法。

(3)其余线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就能够被调度了,若是是被中断的话就抛出一个InterruptedException异常。

notify方法:该方法唤醒在该对象上等待的某个线程。

notifyAll方法:该方法唤醒在该对象上等待的全部线程。

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序列化的方式

Java中实现序列化的两种方式 Serializable 接口和 Externalizable接口

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注解在什么状况下会失效,为何。

1,通常在service里加@Transactional注解,不建议在接口上添加,加了此注解后此类会归入spring事务管理中,每一个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。
2,@Transactional注解只能应用到public修饰符上,其它修饰符不起做用,但不报错。
3,默认状况下此注解会对unchecked异常进行回滚,对checked异常不回滚。
那什么是unchecked,什么是checked呢?

通俗的说,编译器能检测到的是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的新特性,流的概念及优点,为何有这种优点

***lambada表达式*******

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  (怎样安全的度过试用期)

相关文章
相关标签/搜索