面试实题:No.8

1、X=X+1,X+=1以及X++的效率哪个最高?为什么?
三条语句的效率是x = x + 1 < x += 1 < x++
x=x+1 最低,因为它的执行过程如下:
1. 读取右边变量 x 的内存地址;
2. 执行 x+1;
3. 读取左边变量 x 的内存地址;
4. 将右边的值传给左边的变量 x(编译器并不认为左右两边的变量 x 的内存地址相同)。
 
首先寻找右面x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着寻找左面x的地址(计算机是不知道左面的x就是右面的x的),再讲刚计算的结果存到左面的x的地址中。
x=+1 其次,它的执行过程如下:
1. 读取右边变量 x 的内存地址;
2. 执行 x=1;
3. 将得到的值传给变量 x (因为变量 x 的内存地址已经读出)。
 
寻找x的地址,然后读取地址中x的值,再在寄存器中将x的值加1,接着将计算结果存到x的地址中(这里计算机知道读与写两个操作的地址是相同的)。
x++ 最高,它的执行如下:
1. 读取右边变量 x 的内存地址;
2. 变量 x 自增1。
 
寻找x的地址,然后读取地址中x的值,然后直接将地址中的值加1。
从上面的过程可以看出,x++比x+=1少了一个写的过程,而x+=1比x=x+1少了一个寻址的过程(查找左面x的地址)。
2、有表table(id,class,score),用最高效的,最简单的SQL语句列出各班的成绩(score)最高的列表,显示班级(class)和成绩(score)2个字段。
select class,max(score) from table group by class,id.
3、在执行数据库查询时,如果要查询的数据很多,假设有1000万条,用什么办法提高查询速度?在数据库方面或者Java代码方面有什么优化的办法?
fsalary>9999 and fage > 35
fsalary>9999 and fage < 35
fsalary <9999 and fage > 35
fsalary <9999 and fage < 35
1、在数据库设计方面:
  (1)建立索引;  
  (2)分区(MySQL,比如按时间分区);
  (3)尽量使用固定长度的字段;
  (4)限制字段长度;
2、在数据库I/O方面:
   (1)增加缓冲区;
   (2)如果涉及表的级联,不同的表存储在不同的磁盘上,以增加I/O速度;
3、在SQL语句方面:
   (1)优化SQL语句,减少比较次数;
   (2)限制返回的条目数(MySQL中用limit);
4、在Java方面:
   如果是反复使用的查询,使用PrepaerdStatement减少查询次数。
4、请简述FreeMark技术。
优点:
1、不能编写java代码,可以实现严格的mvc分离
2、性能非常不错
3、对jsp标签支持良好
4、内置大量常用功能,使用非常方便
5、宏定义(类似jsp标签)非常方便
6、使用表达式语言
缺点:
1、不是官方标准
2、用户群体和第三方标签库没有jsp多
 
 
选择freemarker的原因:
1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
2、宏定义比jsp tag方便
3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
4、支持jsp标签
5、可以实现严格的mvc分离
 
礼包:
最近了解到大家在面试过程中被问到,那块做的比较熟,那些技术在项目中有具体的一个应用之类的问题,今天我也举个例子,方便大家进行参考。
Redis基本在很多项目中都有了应用,在我目前的项目中应用的也不少。首先在使用前会将RDB和AOF都进行开启,防止数据的丢失。然后在进行商品信息同步、同步索引库等位置因为采用的是延时队列所以这块我们使用的是 redis的 sorted set 数据结构,使用时间戳作为 score ,消息内容作为 member,使用 zadd 命令来生产消息,消费者使用 zrangebyscore 命令获取指定时间之前的消息数据轮询进行处理。
以下是代码情况:
$queueKey = "queue";
// 生产消息
// 消费时间, 这里设置为1小时候
$consumeTimestamp = time() + 3600;
// $data需要添加随机串前缀(or后缀),防止出现重复member被丢弃
$data = $data . md5(uniqid(rand(), true));
$redis->zadd($queueKey, $consumeTimestamp, $data);
// 消费消息
while (tue) {
    $arrData = $redis->zrangebyscore($queueKey, 0, time());
    if (!$arrData) {
        usleep(100000);
        continue;
    }
    // 业务逻辑
    foreach ($arrData as $data) {
        $data = substr($data, 0, strlen($data) - 32);
        
        // 消费$data
    }
}
在讲解过程中最好能结合代码进行沟通,这样更直接。且这些技术在项目中的应用不仅仅只体现在这一个方面。诸如Redis的RDB、AOF持久化在消息丢失时的处理情况、分布式锁等都是比较经典的、实际的例子。
当然还有MQ、nginx、线程等也都可以是项目中的具体应用和问题处理,所以大家在工作之余也要多思考和积累呀!
 
发布了441 篇原创文章 · 获赞 1021 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/A_BlackMoon/article/details/104627028