真实Java面试场景汇总-二!

一、MySQL调优

1.避免使用select * ,最好使用列名。实测,速度快很多

2.加索引

1.主键索引
alter   table  表名   add  primary   key(列名);

2.唯一索引
alter  table  表名  add  unique(列名);

3.普通索引
alter  table  表名  add  index  索引名(index_name)  (列名);

4.全文索引
alter  table  表名  add  fulltext  (列名);

5.联合索引
alter  table  表名  add  index  索引名(index_name)  (列名1,列名2.......);

需遵守最左前缀法则

3.查询一条数据时,加limit 1

4.查询时,between and比in效率要高

5.where条件后加表达式

6.在 where 条件后使用 or 来连接条件,如果or连接的条件有一方没有索引,则导致索引失效而进行全表扫描

二、数据库引擎

InnoDB 引擎:InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁(默认)、表级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。

MyIASM 引擎:MySQL 的默认引擎,但不提供事务的支持,只支持表级锁。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

区别:

InnoDB:支持表级锁和行级锁,开销大、加锁慢、会出现死锁、锁粒度小、锁冲突低、并发度高

MyIASM:支持表级锁,开销小、加锁快,不会出现死锁,锁粒度大、锁冲突高、并发度低

三、前后端项目打包

前端:npm run build        生成dist文件

后端:java -jar jar包名称

Linux查看jar包进程命令:ps aux |grep xxx.jar

四、怎样让依赖不生效

加入<exclusion></exclusion>

<dependency>    
  <groupId>org.apache.hbase</groupId>
  <artifactId>hbase</artifactId>
  <version>0.94.17</version> 
  <exclusions>  
     <exclusion>	 
       <groupId>commons-logging</groupId>		
       <artifactId>commons-logging</artifactId>  
     </exclusion>  
  </exclusions>  
</dependency>

五、怎样让接口不被第三方随意访问

可以使用AOP切面编程,在访问接口之前,进行token或其它判断

六、判断一个字符串中每个字符出现的次数

String a = "asfas98asdasdn@%^&(sdfs123123";
        Map<Character, Integer> map = new HashMap<>();
        char[] chars = a.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            boolean b = map.containsKey(chars[i]);
            if (!b) {
                map.put(chars[i], 1);
            } else {
                Integer integer = map.get(chars[i]);
                integer = integer + 1;
                map.put(chars[i], integer);
            }
        }
        System.out.println(map);

String str="123asdaer1w四四@#$#!123was";
        int[] count=new int[str.length()];//每个字符出现的次数
        String b=new String();//存储去除重复之后的字符串
        for(int i=0;i<str.length();i++){
            if(!b.contains(String.valueOf(str.charAt(i)))){
                b+=String.valueOf(str.charAt(i));
            }
            else{
                for(int j=0;j<b.length();j++){
                    if(str.charAt(i)==b.charAt(j)){
                        count[j]++;
                    }
                }
            }
        }
        System.out.println("原字符串str:");
        System.out.println(str);
        //System.out.println(b);
        for(int i=0;i<b.length();i++){
            System.out.println(b.charAt(i)+":出现的次数:"+(count[i]+1));
        }