java 常见面试题总结(一)

1.Redis应用场景

答:分布式会话,分布式锁,计数器,缓存,消息队列,排行榜,最新列表。

 

2.如何访问一个类的私有方法?

答:使用反射进行访问,代码如下:

package cn.entity;

public class PrviteMhtod  {

    private PrviteMhtod(){ //私有构造
        System.out.println("zzz");
    }
    private  void pm(){//私有无参方法
        System.out.println("我是一个私有的方法哦");
    }
    private  void pm1(int i){//私有有参方法
        System.out.println("我是猪"+i);
    }
}

主代码:

   @Test
    public void TT1() throws Exception {
       Constructor constructor=PrviteMhtod.class.getDeclaredConstructor();
       constructor.setAccessible(true);    //调用是否可访问的方法  true为可以, false为不可访问。
       PrviteMhtod prviteMhtod = (PrviteMhtod)constructor.newInstance();//实例化PrviteMhtod类

       for (Method method:PrviteMhtod.class.getDeclaredMethods()) {
               method.setAccessible(true);//设置PrviteMhtod类的方法是可以访问的。如果不设置是访问不到的,
           if (method.getName().equals("pm")){//获取方法名为pm的方法
               method.invoke(prviteMhtod);//调用pm方法
           }else if (method.getName().equals("pm1")){
               method.invoke(prviteMhtod,4);//如果是有参方法,需要传入参数。
           }else if (method.getName().equals("pmss")){//如果没有此方法不进入该条件。
               System.out.println("aaa");
           }
       }
       
   }

3.  这几个对象使用==的对比结果是?

String s1="a";

String s2=new String("a");

Integer a1=12;

Integer a2=12;

Integer a3=128;

Integer a4=128;

答:s1和s2  false     a1和a2 true       a3和a4 false        a3.equels(a4) true

  @Test
    public void Th() throws InterruptedException {

       String s1="a";
       String s2=new String("a");
       Integer a1=12;
       Integer a2=12;
       Integer a3=128;//Integer的作用范围是-128 到127,超出此范围,而是相当于new出一个新对象。
       Integer a4=128;
       System.out.println(s1==s2);//false
       System.out.println(a1==a2);//true
       System.out.println(a3==a4);//false
       System.out.println(a3.equals(a4));//true
   }

 

 

 

4. 有两张表  一张用户表  用户表有用户编号和商品编号和消费时间                一张商品表  有商品编号和商品价格

 

 

  4.1 查询每个用户总共消费多少元?

 答:使用分组进行查询 :  SELECT SUM(price) ,uid FROM u,s WHERE u.`sid`=s.`sid` GROUP BY uid 

  4.2 使用sql查询消费第三多的用户?

 答:使用order by进行倒序排序, 之后使用limit进行查询第三个用户即可。   :SELECT SUM(price) ,uid FROM u,s WHERE u.`sid`=s.`sid` GROUP BY uid   ORDER BY SUM(price) DESC LIMIT 2,1

   4.3  查询出2018年所有用户消费的平均值?

 答:使用between关键字查询出2018-01-01到2018-12-31之间的数据,between关键字的作用就是查两个数值之间的数据。  :SELECT AVG(price) AS 平均消费 FROM s,u WHERE s.sid=u.sid AND u.time BETWEEN '2018-01-01' AND '2018-12-31'

 

5.lambda表达式的特点?

 答:优点:简洁,  并行容易计算, 结合 hashmap 的 computeIfAbsent 方法,递归运算非常快。                             缺点:如果不是并行计算切效率还不如传统的for循环。不容易调试,没有接触过lambda表达式的程序员不容易看懂。

 

6.在修改一条数据时使用索引作为判断条件和不使用索引作为条件的区别。

使用主键作为修改条件(由于我数据太少,所以加主键和使用没有索引的列的区别不是太大。)

 

使用无索引列作为修改条件

因为mysql索引都是以B+tree的方式存储的,所以当不使用索引作为判断条件时,数据库底层会进行全局搜素,一条一条的去查找这个条件的数据,如果数据特别多的话,性能肯定是非常慢的, 

但是如果是使用索引作为判断条件数据库就会很快的查询出结果,性能也是特别快的。

 

 

7.servlet生命周期及生命周期中有哪些方法?

加载和实例化    初始化    请求服务     销毁  ,      初始化时调用init()方法        请求服务时调用service()方法      销毁时调用distory()方法

 

8.session和cookie的区别?

cookie存储量有限而session可以存储无限量变量,   cookie存储在客户端, session会话存储在服务端,     cookie存储的数据相比于session安全性低,  session存储的数据安全性要比cookie高。

 

9.关系型数据库和非关系型数据的区别?

答:关系型数据库:  数据结构固定,灵活性稍欠,  sql通用,可以用于复杂查询,  支持一个表到多个表之间的非常复杂查询。都是使用表结构,格式一致,  易于维护。 读写性较差,特别是海量数据的高效率读写。

       非关系型数据库:速度快, 高扩展, 成本低都是开源的, 学习成本较大, 无事务支持。复杂查询稍欠,格式灵活,存储的数据可以是 key-value    ,图片, 文档形式等等。

 

10.String的常用方法有哪些?

 答:有length方法(获取长度)    equals方法(比较值)    valueof方法(类型转换)     trim方法(去除两端空格)     toLowerCase方法(字符串转换小写)    toUpeeCase方法(字符串转换大写)    charAt方法(输入字符的下标获取这个字符)     subString方法(截取字符之间的内容)

   @Test
    public void contr() throws Exception {

    //使用String的length方法获取一个字符串的长度
       /*注:new String 和  s1="";的区别是   new String不管在String常量池中有没有这个常量都会创建一个对象,
       而 s1="";如果常量池中有这个常量,则会指向这个常量,不去开辟空间,如果没有这个常量则创建出这个常量
       存储位置不同  s1="";存储在方法区中,   而new String对象存储在堆中。*/
       String s1=new String("4sasqw521");
       System.out.println(s1.length());

    //使用String的charAt方法获取某一个位置的字符
       String s2="7q7as4xz1";
       System.out.println(s2.charAt(2));//这个是按照下标获取字符,每个字符的下标从零开始。

    //使用String的equals方法比较对象的值是否相等
       String s3="aaaxxz";
       String s4="aaaxxz";
       //注:因为String重写了equals方法,如果没有重写equals那么和使用==比较没有区别都是比较内存地址
       System.out.println(s3.equals(s4));

    //使用String的length方法获取一个字符串的长度
       String s5=new String("4sasqw521");
       String s6=s5.substring(2);//获取按照下标方式从下标为2的字符到以后的字符。
       String s7=s5.substring(3,6);//获取下标为3到下标为6之内的内容,  下标为3的打印,为6的那个字符不打印。
       System.out.println(s6+"----"+s7);

    //字符串的大小写转换方法,  toLowerCase方法(转小写)和toUpeeCase方法(转大写)。
       String s8="ABcdeFg";
       System.out.println(s8.toLowerCase());
       System.out.println(s8.toUpperCase());

    //字符串两端去空格  (只去除两端的空格。)
       String s9=" sa s   ";
       System.out.println(s9.trim());

    //类型转换为字符串
       int a=12;
       String s10=String.valueOf(a);
       System.out.println(s10);
   }

 

 
posted @ 2018-10-14 14:29  就让文谦先行  阅读(1986)  评论(0编辑  收藏  举报