18年11月下,面试题积累

map遍历方法
1、Iterator遍历

   Iterator<Map.Entry<String,String>> it = map.entrySet().iterator();
      while(it.hasNext()){
        Map.Entry<String,String> entry=it.next();
        System.out.println("key=" +entry.getKey() +" and value="+entry.getValue());
    }

2、取值遍历

    for(String key:map.keySet()){
        System.out.println("key="+key+"and value=" +map.get(key));
    }

3、遍历所有的Value值
该方式取得不了key值,直接遍历map中存放的value值

  for(String v:map.values()){
        System.out.println("value= "+ v);
  }

4、使用entrySet遍历

  for(Map.Entry<String,String > entry:map.entrySet()){
        System.out.println("key=" +entry.getKey() +" and value="+entry.getValue());
 }

tomcat配置,项目请求路径的配置,端口号的配置
conf目录下 server.xml

public private protect的权限区别

hibernate和mybatis的缓存机制

spring的依赖注入有几种
myBatis的$和#
@Autowired与@Resource

jdbc的流程
1、 加载JDBC驱动程序:
2、 提供JDBC连接的URL
3、创建数据库的连接
4、创建一个Statement
5、执行sql
要连接数据库,需要向java.sql.DriverManager请求并获得Connection对象, 该对象就代表一个数据库的连接。
使用DriverManager的getConnectin(String url , String username , String password )方法传入指定的欲连接的数据库的路径、数据库的用户名和 密码来获得。

zookeeper的选取leader 原理
kafka的运行的机制

synchronized和lock锁的区别,重入锁
乐观锁和悲观锁

MySql和Orcale的分页
mysql --> limit
oracle–> rownum
Herinate --> setfirstResult(),setMaxResult()

sql查询(批量插入,批量更新)
insert into student values
(1,小明),(2,小黄),(3,小天)

更新多条记录的同一个字段为同一个值
UPDATE course SET name=‘course1’ WHERE id in(‘id1’,‘id2’,'id3);

更新多条记录为多个字段为不同的值
MySQL没有提供直接的方法来实现批量更新,但可以使用case when语法来实现这个功能。
UPDATE course
SET name = CASE id
WHEN 1 THEN ‘name1’
WHEN 2 THEN ‘name2’
WHEN 3 THEN ‘name3’
END,
title = CASE id
WHEN 1 THEN ‘New Title 1’
WHEN 2 THEN ‘New Title 2’
WHEN 3 THEN ‘New Title 3’
END
WHERE id IN (1,2,3)

case when then end可用于sql行列互换查询
题目:数据库中有一张如下所示的表,表名为sales。
年 季度 销售量
1991 1 11
1991 2 12
1991 3 13
1991 4 14
1992 1 21
1992 2 22
1992 3 23
1992 4 24

要求:写一个SQL语句查询出如下所示的结果。
年 一季度 二季度 三季度 四季度
1991 11 12 13 14
1992 21 22 23 24

我给出的答案是这样的:
select 年,
sum(case when 季度=1 then 销售量 else 0 end) as 一季度,
sum(case when 季度=2 then 销售量 else 0 end) as 二季度,
sum(case when 季度=3 then 销售量 else 0 end) as 三季度,
sum(case when 季度=4 then 销售量 else 0 end) as 四季度
from sales group by 年;

集群和分布式的关系
简单的解释:
小饭店原来只有一个厨师,切菜洗菜备料炒菜全干。后来客人多了,厨房一个厨师忙不过来,又请了个厨师,两个厨师都能炒一样的菜,这两个厨师的关系是集群。为了让厨师专心炒菜,把菜做到极致,又请了个配菜师负责切菜,备菜,备料,厨师和配菜师的关系是分布式,一个配菜师也忙不过来了,又请了个配菜师,两个配菜师关系是集群

负载均衡的几种常用方式
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
upstreambackserver {
server192.168.0.14;
server192.168.0.15;
}
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的
情况。
upstreambackserver {
server192.168.0.14weight= 3;
server192.168.0.15weight= 7;
}
权重越高,在被访问的概率越大,如上例,分别是30%,70%。
3、上述方式存在一个问题就是说,在负载均衡系统中,假如用户在某台服务器上登录了,那么该用户第二次请求的时候,因为我们是负载均衡系统,每次请求都会重新定位到服务器集群中的某一个,那么已经登录某一个服务器的用户再重新定位到另一个服务器,其登录信息将会丢失,这样显然是不妥的。
我们可以采用ip_hash指令解决这个问题,如果客户已经访问了某个服务器,当用户再次访问时,会将该请求通过哈希算法,自动定位到该服务器。
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
upstream backserver {
ip_hash;
server192.168.0.14: 88;
server192.168.0.15: 80;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backserver {
serverserver1;
serverserver2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
upstreambackserver {
serversquid1: 3128;
serversquid2: 3128;
hash$request_uri;
hash_methodcrc32;
}

猜你喜欢

转载自blog.csdn.net/qq_17782389/article/details/84064431