java面试题目

spring框架面試題目:https://blog.csdn.net/m0_37852553/article/details/78678278(這是必須要看的)

https://blog.csdn.net/WYpersist/article/details/80274561

1.mysql怎样调优:

禁止使用select * ; 禁止使用in ,not in,or,having,使用exists 和not exists代替

避免使用 union ,使用union all来代替

避免使用两端模糊查询 like '%###%'

尽量少用连接查询 join 尽量使用join代替子查询、

尽量提前筛选条件(筛选条件的时候要,先筛选大条件,再筛选小条件 例子:筛选小于30岁的男生,(注意先筛性别,在筛选年龄) )

尽量使用索引来提高查询效率 尽量避免在where条件中进行运算 尽量批量的操作数据(比如说插入100条数据,建议一次性插完,而不是插入100次)

尽量避免使用is null is not null <> !=之类的

少用排序(如果项目中没有让使用排序,那就尽量少使用排序)

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是怎么样的,有没有传值引用。

1、传值:传值就是指将一个值传递到方法的内部。例如int a = 5,那么也就是给int型变量a赋值,值为5.如果一个方法,将这个变量传进方法的内部,则进行的就是传值。在java中,有8种基本数据类型,它们分别为:int、long、float、double、char、boolean、short、byte.这8种基本的数据类型作为参数进行传递是,都是进行的传值。·除此之外,还有一种特殊的情况,String。本身String是一个引用类型,很多人认为在向方法中传递String类型参数时,是进行传引用。其实在这里,String可以看做为一个包装类,因为String其本身就是通过字符数组实现的,那么它在实现参数传递的时候,也就是以char型数据的方式进行的,也就是进行传值。

        2、传引用: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等。
4、只读事务:
@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  (怎样安全的度过试用期)

原文地址:https://www.cnblogs.com/dongyaotou/p/9901954.html