zoukankan      html  css  js  c++  java
  • java(2019)面试题整理所

    以下java题目,为我自己面试遇到的问题,在此做个记录,以便于以后自己能随时查阅,若答案有问题,欢迎大佬指出,谢谢!!!!

    1.exist和in的区别?以及何时exist效率大于in?何时in的效率大于exist?

              in()适合B表比A表数据小的情况

              exists()适合B表比A表数据大的情况

              当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.

    参考连接:https://blog.csdn.net/lilun517735159/article/details/78826521

    2.Controller向页面传值有几种方式?如何实现传值?

    有五种传值方式:

    利用request进行值传递: request.SetAttribute()

    利用Model进行值传递: model.addAttribute()

    利用hashMap进行传递:hashMap.put();

    利用ModelAndView进行传递: xxx.addObject("admin", bean);  xxxx.setViewName("Model");

    利用Session进行传递: session.setAttribute()

    3.页面向Controller传值有几种方式?如何实现传值?

    有五种传值方式:

    直接将请求参数名作为Controller中方法的形参:   

        public  String login (String username,String password)   :

    使用@RequestParam 绑定请求参数参数值:     

        public String login(RequestParam ("username") String name) :

    用注解@RequestMapping接收参数的方法            

    使用实体类   public String login(User user){}

    使用request         public String login(HttpServletRequest request){String usernma=Request.getParameter("username");}

    4.jsp的内置对象,及其作用?

    JSP中一共预先定义了9个这样的对象,分别为:request、response、session、application、out、pagecontext、config、page、exception

    5.查询所有学科成绩大于80分的学生姓名。

        sql1: select name from table  group by  name having  min(fenshu > 80);   -------推荐 

        sql2:select  name from table group by name having  name  not in (select  name  from  table  where fenshu <=80);  (也可使用 not exist)

        sql3:  select  distinct  from table where  name  not in (select  name  from  table  where fenshu <=80);   (也可使用 not exist)

    6.面向对象的特征,并分别解释下

    封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别.

    继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为

    多态:多态就是同一个行为具有多个不同表现形式或形态的能力(多态存在条件:继承、重写、父类引用指向子类对象)。

    7.==和equals的区别?

    ==是一个比较运算符,基本数据类型比较的是值,引用类型则比较的是所指向的对象的地址是否相同。

    equals()是一个方法,只能比较引用数据类型。默认比较的是所指向的对象的地址是否相同,如String等重写后比较的是所指向的对象的内容是否想等

    8.书写一个单列模式

    单列模式的书写公有8中方法,下面只列出推荐使用的几种:

    1.饿汉式(线程安全,类加载时就初始化,可能会浪费内存)

    public class Singleton {
        private static Singleton instance = new Singleton();
        private Singleton() {}
        public static Singleton getInstance() {
            return instance;
        }
    }

    2.懒汉式(线程安全)---推荐

    public class Singleton {
        private Singleton() {}
        private static class SingletonInstance {
            private static final Singleton INSTANCE = new Singleton();
        }
        public static Singleton getInstance() {
            return SingletonInstance.INSTANCE;
        }
    }

    9.如何查询出2个字段完全一样的表的所有数据

    使用union或者union all

    10.如何查询一个表中重复的数据

    select NAME,scoure,SUBJECT  from student GROUP BY NAME,scoure,SUBJECT HAVING COUNT(1) >1    -----除了主键外其余相同的字段都要放到group by中

     11.书写一个jdbc连接代码?

    package mysql;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.Statement;
    
    public class Day01 {
    //    public static void main(String[] args) {
    //        try {
    //            Class.forName("com.mysql.jdbc.Driver");
    //            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","123456");
    //            Statement statement = conn.createStatement();
    //            statement.executeUpdate("insert  into test (id,name) values(2,'魏义己')");
    //            System.out.println("执行完毕");
    //            
    //        } catch (Exception e) {
    //            // TODO: handle exception
    //        }
    //    }
        
        public static void main(String[] args) {
            try {
                //注册驱动
                Class.forName("com.mysql.jdbc.Driver");
                //获取连接
                Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/study?&useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false","root","123456");
                //创建PreparedStatement
                PreparedStatement pStatement = conn.prepareStatement("insert  into test (id,name) values(?,?)");
                for(int i=3;i<10;i++) {
                    pStatement.setInt(1, i);
                    pStatement.setString(2, "测试"+i);
                    pStatement.executeUpdate();
                }
                System.out.println("执行完毕");
                //关闭连接
                conn.close();
            } catch (Exception e) {
                // TODO: handle exception
            }
        }
    }
    View Code

    12.用位运算计算出(Int)x乘以8的结果和过程?

    public static void main(String[] args) {
    
    System.out.println(num(2));
    }
    public static int num(int a){
    
    return a<<3;
    
    } 

    13.书写一个冒泡算法案例。

    /*
     * 冒泡排序(从小到大排序)
     */
    public class BubbleSort {
      public static void main(String[] args) {
        int[] arr={6,3,8,2,9,1};
        System.out.println("排序前数组为:");
        for(int num:arr){
          System.out.print(num+" ");
        }
        for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
          for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
            if(arr[j]>arr[j+1]){
              int temp=arr[j];
              arr[j]=arr[j+1];
              arr[j+1]=temp;
            }
          }
        } 
        System.out.println();
        System.out.println("排序后的数组为:");
         for(int num:arr){
           System.out.print(num+" ");
         } 
      }
     }
    

    14.java中如何交换2个字符串的值?

    创建一个中间变量,然后直接交换即可

    15.java中统计某个字符串中某个字符出现的次数。

    方法一:使用replace方法将字符串替换为空,然后用原来总长度减去替换后的长度

    public static void way2(String st,String M) {
            int count = (st.length()-st.replace(M, "").length())/M.length();
            System.out.println("指定字符串在原字符串中出现:"+count+"次");
        }

    方法二:使用indexOf和subString方法,循环判断并截取

    public static void way1(String st,String M) {
            int count = 0;
            while(st.indexOf(M)>=0) {
                st=st.substring(st.indexOf(M)+M.length());
                count++;
            }
            System.out.println("指定字符串在原字符串中出现:"+count+"次");
        }

     16.在JSP中<%!%>,<%%><%=%>三个标签有什么区别

    <%!%> 表示声明一个变量

    <%%>表示所执行的jsp语句块,也就是相应的java代码

    <%=%>相当于<%out.println("字符串");%>,在网页中显示某一个变量或某一个表达式的值

     17.ArraryList和LinkList区别?

    1.ArrayList是Array(动态数组)的数据结构,LinkList是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。

    2.用get方法访问时,ArraryList效率高,因为LinkList是链表结构,需要移动指针从前到后依次查找。

    3.增加删除时LinkList效率更高,因为ArraryList是数组,删除时会对之后的数据下标造成影响,需要进行数据的移动。

     18.表空间与用户和数据文件关系?

    1. 一个表空间有多个数据文件,一个数据文件只能属于一个表空间。
    2. 一个数据库可以有多个表空间,每一个库都有一个system表空间。
    3. 一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。
    4. 用户和表空间没有隶属关系,表空是一个用来管理数据存储逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。
    5. 用户在创建表的时候没有指定表空间,使用该用户的默认表空间(创建用户的时候需要指定)。

     19.jsp和Servert的区别?

     1.JSP是Servlet技术的扩展,本质上就是Servlet的简易方式,JSP编译后就是“类servlet”。

     2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.

    20.http中404、405、500分别是什么错误?

     404  访问路径不存在

    500 系统出现重大问题

    405  找不到处理请求的方法

    21.jsp和freemarker以及thymleaf的区别?

    参考链接:https://blog.csdn.net/ztchun/article/details/76407612

    22.try和finally中都有return时返回值是否改变?

    首先要确定的一点是,不管有木有出现异常,finally块中代码都会执行

    执行try块,执行到return语句时,先执行return的语句,但是不返回到main 方法,接下来执行finally块,遇到finally块中的return语句,执行,并将值返回到main方法,这里就不会再回去返回try块中计算得到的值

    23.利用递归算法,计算6!

    package com.xuanyin.udp;
    /**
     * 递归算法案例
     * @author Administrator
     *
     */
    public class DiGui {
        
        public static long fac(int i) {
            if(i == 1) {
                return 1;
            }else {
                
                return i*fac(i-1);
            }
        }
        
        public static void main(String[] args) {
            System.out.println(fac(6));
        }
    }

     24.java参数传递方式?

     值传递:不会改变原来的

    引用传递:会改变引用对象的值

    推荐博客:https://www.cnblogs.com/sum-41/p/10799555.html

     25.jvm的内存机制介绍?

    堆:存储所有new出来的对象(包括成员变量),堆是被所有线程共享的,如果java堆空间不足了,程序会抛出OutOfMemoryError异常。

    栈:栈中包含着一个一个的栈帧,栈帧中存储着正在调用方法中的所有局部变量(包括参数),栈不是线程所共享的,每个线程对对应着一个java栈

      因此,递归调用方法容易出现StackOverflowError(内存溢出)

    方法区:存储了每个类的信息(包括类的名称、方法信息[方法只有一份,通过this来区分具体的对象]、字段信息)、静态变量、常量以及.class字节码文件等,方法区是被线程所共享的

      方法区中包含着运行时常量池

    本地方法栈:本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的。

    程序计数器:用来指示 执行哪条指令的,程序计数器是每个线程所私有的。

     26.基本类型的范围?

    int 范围: -231 —— 231 -1

    byte范围: -2—— 2-1

    总结:-2n-1 ——2n-1 -1(n是位数,例如:int是4个字节,一个字节占8位,所以是32位)

    27.位运算

    3&1 结果是1

    3 |1 结果是3

    先转化成二进制,然后对应每一位进行&或|运算,最后将每位计算结果拼起来再转换成十进制

    3 >> 2 结果是0 

    3 <<2 结果是12   (结论:n << m 结果是: n * 2m

    先将3转换成二进制11,>>是右移2位,变成0,<<是左移2位,变成1100 转换成十进制就是12 

     28.HashMap、LinkedHashMap、HashTable、TreeMap的区别?

    1.Hashtable、HashMap、TreeMap都实现了Map接口,使用键值对的形式存储数据和操作数据。

    2.Hashtable是java早期提供的,方法是同步的(加了synchronized,即是线程安全的)。key和value都不能是null值。

    3,HashMap的方法不是同步的(即是线程不安全的),支持key和value为null的情况。行为上基本和Hashtable一致。由于Hashtable是同步的,性能开销比较大,一般不推荐使用Hashtable。通常会选择使用HashMap。

    4.HashMap进行put和get操作,基本上可以达到常数时间的性能

    5.TreeMap是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get或put操作的时间复杂度是O(log(n))。具体的顺序由指定的Comparator来决定,或者根据键key的具体顺序来决定。

    6.LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的。在遍历的时候会比HashMap慢。有HashMap的全部特性。

    29.Lock与synchronize的区别?

    Lock是一个接口,而synchronized是关键字。.

    synchronized会自动释放锁,而Lock必须手动释放锁。

    Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。

    通过Lock可以知道线程有没有拿到锁,而synchronized不能。

    Lock能提高多个线程读操作的效率。

    synchronized能锁住类、方法和代码块,而Lock是块范围内的

    30.Mysql如何查看正在执行sql的运行情况?

    再mysql输入命令行show processlist查询即可

     31.java中常见的线程安全和不安全的类有那些?

    线程安全的:Vector(向量类)、hashtable、String类、StringBuffer

    线程不全的:HashMap、ArrayList、StringBuilder

     32.java中常见的线程池?

    参考链接:https://www.cnblogs.com/zhujiabin/p/5404771.html

     33.spring中bean的作用域

    singleton:IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例。

    prototype: IOC容器可以创建多个Bean实例,每次返回的都是一个新的实例。

    request:该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。

    session:该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。

    global-session:该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。

     34.常见的RuntimeExcetion有哪些?

     ArithmeticException:数学计算异常。

     NullPointerException:空指针异常。

    ArrayOutOfBoundsException:数组索引越界异常。

    ClassNotFoundException:类文件未找到异常。

    ClassCastException:类型强制转换异常。

    FileNotFoundException:文件未找到异常。

    NumberFormatException:字符串转换为数字异常。

     35.为什么重写equals,就必须重写hashcode,什么情况下可以不重写hashcode?

    (1)当所在类不使用HashSet、Hashtable、HashMap等散列集合进行存储的时候,可以不使用hashcode。

    (2)当在HashSet、Hashtable、HashMap中使用该类时,hashcode和equals是有关系的,hashcode和equals需要同时重写才能保证元素的唯一性。hashcode是为了提高散列结构存储中查找的效率,在线性表中没有作用。

     36.synchronize和Lock锁的区别?

    Lock是一个接口,而synchronized是关键字。

    synchronized会自动释放锁,而Lock必须手动释放锁。

    Lock可以让等待锁的线程响应中断,而synchronized不会,线程会一直等待下去。

    通过Lock可以知道线程有没有拿到锁,而synchronized不能。

    Lock能提高多个线程读操作的效率。

    synchronized能锁住类、方法和代码块,而Lock是块范围内的

     37.springboot如何在项目启动后添加输出语句?

    1..实现 ApplicationRunnerImpl

    2.实现CommandLineRunnerImpl 

     38.为什么HashMap是不安全得?

    初始桶的数量为16,超过阈值后就会进行扩容操作(每次都变成原理的2倍),在扩容操时可能出现线程不安全。比如:

    put的时候导致的多线程数据不一致。

    HashMap的get操作可能因为resize而引起死循环

    39.多线程同时操作HashMap是会出现什么情况?

    会造成数据不一致得错误,如:A线程put时,B线程也调用了put,并且把值插入进去了,当A线程和B线程插入得key一样时,A插入成功后,会把B线程插入的值覆盖掉

    40.Mysql数据量过大时,limit 100000,100 查询效率很低,该如何进行优化?

    首先limit 100000,100查询的是前10W条之后的100条数据,limit 后边如果只有一个数字则是查询前多少条记录

    优化方式:利用子查询优化,修改成 where id >=(select id from XXX limit 10000,1)

    41.Mysql优化方案有哪些?

    1.数据库方面优化:

      a.设计表时字段大小的定义,主外键的指定

      b.尽量把字段设置为NOT NULL

      c.适当的添加索引、视图、函数等

      d.选择正确的存储引擎

    2.查询方式的优化:

      a.适当的采用分页查询和子查询

      b.查询所需字段即可,尽量避免查询所有字段

      c.sql的优化等

     42.已知π/2≈1+1/3+1/3*2/5+1/3*2/5*3/7…… 计算π的近似值,保留10位小数

      private static double fun2() {
            double he = 1;  //
            double a = 1;   // 每一项的值
            int b = 1;  //第几项
            while (a > 0.000000000001) {
                a = (b*1.0) / (b * 2 + 1) * a;
                he += a;
                b++;
            }
            BigDecimal adafa = new BigDecimal(he*2);
            he = adafa.setScale(10, BigDecimal.ROUND_HALF_UP).doubleValue();
            return he;
        }

     43.ArrayList的扩容机制是什么?

    在第一个添加元素时,创建一个长度为10的数组,之后随着元素的增加,以1.5倍原数组的长度创建一个新数组,即10, 15, 22, 33,。。这样序列建立,将原来的元素拷贝到新数组之中,如果数组长度达到上限,则会以MAX_ARRAY_SIZE 或者 Integer.MAX_VALUE作为最大长度,而多余的元素就会被舍弃掉。

  • 相关阅读:
    Kubernetes基础
    docker概述
    mongoDB概述
    springcloud-stream为什么被引入
    springcloud-bus+config实现动态刷新定点通知
    springcloud-bus+config实现动态刷新全局广播配置
    springcloud-bus是什么
    springcloud-动态刷新之手动版
    springcloud-服务读取Config配置中心
    springcloud-Config配置中心搭建
  • 原文地址:https://www.cnblogs.com/zblwyj/p/10564235.html
Copyright © 2011-2022 走看看