zoukankan      html  css  js  c++  java
  • 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  (怎样安全的度过试用期)

  • 相关阅读:
    Java 中的POJO和JavaBean 的区别
    设计模式的六大原则
    AOP
    Jetbrains 全家桶
    centos7 如何关闭防护墙
    Java 面试题常见范围
    putty readme
    单机环境
    flask-caching缓存
    1.restful 规范与APIView
  • 原文地址:https://www.cnblogs.com/dongyaotou/p/9901954.html
Copyright © 2011-2022 走看看