搜狐Java开发实习生笔试题

一、选择题
1、CocurrentHashMap是基于Lock/Unlock思想的线程安全的Map实现。
分析:
而不是symchronized、Object.wait、CAS。
其put方法源码如下:

 V put(K key, int hash, V value, boolean onlyIfAbsent)
 {
           lock();
            try {
                int c = count;
                if (c++ > threshold) // ensure capacity
                    rehash();
                HashEntry[] tab = table;
                int index = hash & (tab.length - 1);
                HashEntry first = (HashEntry) tab[index];
                HashEntry e = first;
                while (e != null && (e.hash != hash || !key.equals(e.key)))
                    e = e.next;

                V oldValue;
                if (e != null) {
                    oldValue = e.value;
                    if (!onlyIfAbsent)
                        e.value = value;
                }
                else {
                    oldValue = null;
                    ++modCount;
                    tab[index] = new HashEntry(key, hash, first, value);
                    count = c; // write-volatile
                }
                return oldValue;
            } finally {
                unlock();
            }
        }

2、下面程序执行结果

public class Test
{
    static int value = 0;
    static int inc(){return value++;}
    static int dec(){return value--;}
    static int getResult()
    {
        try 
        {
            return inc();
        }
        finally 
        {
            return dec();
        }
    }
    public static void main(String[] args) 
    {
        System.out.println(getResult());
        System.out.println(value);
    }
}

1
0

分析:
finally里的语句一定会被执行,于是当try里的return与finally里的return相冲突时,应当从finally中返回。所以程序运行顺序应该是inc()->dec()->finally中的return,相当于try中的语句变为inc()。

public class Test
{
    static int value = 0;
    static int inc(){return value++;}
    static int dec(){return value--;}
    static int getResult()
    {
        try 
        {
            inc();//相当于return被去掉
        }
        finally 
        {
            return dec();
        }
    }
    public static void main(String[] args) 
    {
        System.out.println(getResult());
        System.out.println(value);
    }
}

于是调用inc()后value为1,调用dec()后先返回value的值1,再将value的值减1,于是value为0。所以输出为1,0。

3、以下说法正确的是:AEF
A、静态内部类的非静态成员可以访问外部类的静态变量,而不可以访问外部类的非静态变量
B、非静态内部类的非静态成员不可以访问外部类的非静态变量
C、子类可以覆盖父类的静态方法
D、子类可以覆盖父类的final字段
E、枚举类可以实现多个接口
F、HashMap和Hashtable实现相同的接口,继承相同的父类
分析:
A、外部类的非静态变量可能还没有被初始化
B、可以
C、静态方法在类加载的时候就已经确定其所属的类
D、final变量不能被覆盖
E、F、正确

4、System.out.println(“ja” + “va” == “java”);输出
true
分析:
java会将”ja”“va”优化为”java”,于是==左右两边的”java”指的是常量池中的同一个对象。

5、对于以下代码说法正确的是

public class Test
{
    public static void greet()
    {
        System.out.println("Hello World!");
    }
    public static void main(String[] args) 
    {
        Test t = null;
        t.greet();//(1)
        ((Test)t).greet();//(2)
        ((Test)null).greet();//(3)
    }
}

(1)(2)(3)都能正常运行
分析:
greet( )是类函数,可以使用类来调用。

6、下面代码执行结果

import java.util.HashSet;
import java.util.Set;

public class Test
{
    private String first, last;
    Test(String first, String last)
    {
        this.first = first;
        this.last = last;
    }
    public boolean equals(Object o)
    {
        Test t = (Test)o;
        return t.first.equals(first)&&t.last.equals(last);
    }
    public static void main(String[] args) 
    {
        Set<Test> s = new HashSet<Test>();
        s.add(new Test("m", "n"));
        System.out.println(s.contains(new Test("m", "n")));
    }
}

false
分析:
Set和Map中调用contains方法判定对象是否已经存在时,不仅要重写equals方法还要重写hashcode方法,且先调用hashcode方法判断两个对象的HashCode是否相等,再调用equals方法判断两个对象是否相等,只有两个都相等时才能判定相等。

7、Struct2的Action分发机制采用的是Command模式
分析:
这里写图片描述
Struts中,在模型层都要继承一个Action接口,并实现execute方法,其实这个Action就是命令类。Struts会应用命令模式,是因为Struts的核心控制器ActionServlet只有一个,相当于Invoker,而模型层的类会随着不同的应用有不同的模型类,相当于具体的Command。这样,就需要在ActionServlet和模型层之间解耦,而命令模式正好解决这个问题。

8、索引字段不唯一应当选择普通索引
分析:
主索引:可确保字段中输入值的唯一性并决定了处理记录的顺序。可以为数据库中的每一个表建立一个主索引。如果某个表已经有了一个主索引,可以继续添加候选索引。关键字为PRIMAY。
候选索引:像主索引一样要求字段值的唯一性并决定了处理记录的顺序。在数据库表和自由表中均可为每个表建立多个候选索引。
普通索引:可以决定记录的处理顺序,但是允许字段中出现重复值。在一个表中可以加入多个普通索引。
唯一索引:在某个数据列只包含彼此不同的值,在为这个数据列创建索引时就应该用关键字UNIOUE把它定义为一个唯一的索引。

二、名词解释
Nginx:
是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、新浪、网易、腾讯等。

MongoDB:
是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

O-R Mapping:
对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。

Redis:
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Hadoop:
是一个由Apache基金会所开发的分布式系统基础架构。
用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

DDos:
分布式拒绝服务(DDoS:Distributed Denial of Service)攻击指借助于客户/服务器技术,将多个计算机联合起来作为攻击平台,对一个或多个目标发动DDoS攻击,从而成倍地提高拒绝服务攻击的威力。

XSS:
跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

SEO:
SEO是由英文Search Engine Optimization缩写而来, 中文意译为“搜索引擎优化”。SEO是指通过对网站内部调整优化及站外优化,使网站满足搜索引擎收录排名需求,在搜索引擎中提高关键词排名,从而把精准用户带到网站,获得免费流量,产生直接销售或品牌推广。

CNAME:
指别名记录也被称为规范名字。这种记录允许您将多个名字映射到同一台计算机。 通常用于同时提供WWW和MAIL服务的计算机。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值