30 October 2013

IMG-THUMBNAIL

这套笔试题当时做的时候觉得很难,还涉及到了一些架构的东西,当时都不会。现在看来,也就那样,熟悉Java后台开发的应该问题不大。后来还去面过方正科技,就在北大旁边那个,号称是方正的电脑和一些高科技产品都是这个子公司生产的。还搞了群面,一群人在那胡扯。笔试很水,全是C#题目,难度很低。这个公司感觉不怎么样了。

###一、选择题

#####1. 下列表达式正确时(D)?

  • A. byte b = 128;
  • B. boolean flag = null;
  • C. double f = 0.92395917;
  • D. long a = 9223372036854775808L;

byte范围是-128~127,boolean只有true和false两个值,long范围是-9223372036854775808L~9223372036854775807L,占8个字节。

#####2. 下列正确的说法有:(C)

  • A. 声明抽象方法,大括号必须有。
  • B. 抽象类不能有static方法。
  • C. 抽象类除了有抽象方法外,还可以有普通方法。
  • D. static方法可以访问类的所有属性

抽象方法如果有大括号,则表明有实现部分,错误。含有抽象方法的类叫做抽象类,所以可以有普通方法和static方法。static方法可以访问类的静态属性,非静态属性是在创建类的对象时才会初始化,所以没有实例化的对象属性不能被访问。

#####3. 下列不属于Java标示符的事(B):

  • A. _HelloWorld
  • B. 3HelloWorld
  • C. $HelloWorld
  • D. HelloWorld

不光是Java,还包括C语言,标示符都不能以数字开头。
http://www.zhihu.com/question/20150792

#####4. 属于Java语言中基本数据类型的事(BC):

  • A. var
  • B. char
  • C. long
  • D. String

String属于java.lang包。

#####5. 下列代码运行结果是(C): int x = 0; int i = 1; do { if ((i % 5) == 0) { i++; continue; } x += ++i; } while (x < 100); System.out.println(“x=” + x)

  • A. x=10
  • B. x=101
  • C. x=102
  • D. x=103
  • E. x=104
  • F. x=105

#####6. 下列代码运行结果是(C): public class Parent{ public int x; public int y; public Parent(int x, int y) { this.x = x; this.y = y; } public void increaseX(int x) { this.x = getX() + x; } public int getX() { return x; } public void increaseY(int y) { this.y = getY() + y; } public int getY() { return y; } } public class Child extends Parent { private int x; private int y; public Child(int x, int y) { super(x, y); this.y = y + 250; this.x = x + 150; } public int getX() { return x; } public int getY() { return y; } } Child child = new new Child(50, 50); child.increaseX(100); child.increaseY(100); System.out.println(“x=” + child.getX() + “ and y=” + child.getY());

  • A. x=200 and y=200
  • B. x=250 and y=350
  • C. x=200 and y=300
  • D. 编译错误

重写具体又可以分为隐藏和覆盖,父类实例变量和静态变量能被子类同名变量隐藏,父类静态方法被子类同名静态方法隐藏,父类实例方法被子类同名实例方法覆盖。被隐藏的变量和方法是存在的,可以通过该类实例去访问。此题Child继承Parent,Child类中重写了变量x、y,方法getX()、getY()。所以,Parent的变量x和y会被隐藏,getX()和getY()会被覆盖,increaseX()和increaseY()会被子类继承。此题还要考虑子类和父类构造函数的调用顺序。

Child child = new new Child(50, 50);此行之行时,会先调用父类的super(x, y),父类的x和y被修改,接着初始化Child的x和y为0。然后,执行this.y = y + 250;this.x = x + 150;修改子类的x和y,此时,child的x和y是200和300。后来的child.increaseX(100);child.increaseY(100);方法都是使用的父类的函数,修改的也是父类的x和y,对于child的不影响。所以结果是C。

#####7. 下列选项可以在A的子类中使用的是(AC): class A { protected int method(int a, int b) { return 0; } }

  • A. public int method(int a, int b) {return 0;}
  • B. private int method(int a, int b) {return 0;}
  • C. private int method(int a, short b) {return a + b;}
  • D. public short method(int a, short b) {return a + b;}

A为重写。B为重写,重写的方法不能比原方法有更低的访问权限。C参数表不同,为重载,对于访问修饰符没有要求。D的参数表不同,为重写,但是int a和short b相加,得到的是int,题目中没有进行类型转换,错误。

#####8. 关于以下代码说明正确的是(C): class StaticTest { public static int x = 1; public void increaseX(int increasement) { x += increasement; } public StaticTest(int original) { increaseX(original); if (x > 10) { x = 1; } } } StaticTest obj1 = new StaticTest(5); obj1.increaseX(2); StaticTest obj2 = new StaticTest(3); obj2.x += 4; StaticTest obj3 = new StaticTest(1); StaticTest.x += 3; System.out.println(“x=” + obj1.x);

  • A. 第5行不能编译通过,因为引用了私有静态变量
  • B. 第17行不能编译通过,因为x是私有静态变量
  • C. 能编译通过,结果为9
  • D. 能编译通过,结果为8

x为static变量,被所有对象所共享。StaticTest obj1 = new StaticTest(5);x加5变为6。obj1.increaseX(2);x加2成为8。StaticTest obj2 = new StaticTest(3);x加3成为11,大于10,重新赋为1。obj2.x += 4;加4成为5。StaticTest obj3 = new StaticTest(1);加1成为6。StaticTest.x += 3;加3成为9。

#####9. 下列选项中不属于JDBC基本功能的是:

  • A. 与数据库建立连接
  • B. 提交sql语句
  • C. 处理查询结果
  • D. 执行Oracle存储过程

#####10. Page指令用于定义JSP文件中的全局属性,下列关于该指令用法的描述不正确的是:

  • A. <%@ page %>作用于整个JSP页面
  • B. 可以在一个页面中使用多个<%@ page %>指令
  • C. 为增强程序的可读性,建议将<%@ page %>指令放在JSP文件的开头,但不是必须的
  • D. <%@ page %>指令中的属性只能出现一次

#####11. 关于jQuery,是由哪些语言编写的(A):

  • A. JavaScript
  • B. HTML
  • C. Java
  • D. CSS

#####12. 在CSS样式中以下哪些选项属于选择符的分类(ABD)

  • A. HTML选择符
  • B. Class选择符
  • C. #选择符
  • D. ID选择符

此外,还包括通用元素选择符*

###二、填空题

#####1. Java的基本数据类型中,long类型占用(8)字节空间。对long类型的赋值(不是)线程安全的。

32位或更少位数是原子性的,按32位为基本操作单位。所以Java中long和double不是原子性的。需要使用volatile保证原子性。

#####2. 请写出Java语言的三个访问权限修饰符,并作简单说明:

  • private:当前类访问权限,只能被当前类的实例自己内部调用。
  • protected:继承类修饰,能被子类访问。
  • friendly:包访问权限。
  • public:全局访问。

#####3. 请写出一下代码段的输出结果:(Hello world) StringBuilder word = new StringBuilder(“Hello”); getWho(word); System.out.println(word.toString()); public static void getWho(StringBuilder word) { word = word.append(“ word”); } StringBuilder的内容是可以更改的。

#####4. 请填空列举5个您所知道的struts2(struts-2.2.3之前版本)的Result Type:(dispatcher、redirect、chain、freemarker)。

#####5. JAXB(Java Architecture for XML Binding)是一个业界的标准,是一项可以根据XML Schema产生Java类的技术。它通过JDK的Annotation在类元素与XML元素之间进行映射。其中,(@XmlRootElement)Annotation用来将Java类型或枚举类型映射到XML元素,(@XmlElement)Annotation用来将Java类的一个属性映射到与属性同名的一个XML元素,(@XmlAttribute)Annotation用来将Java类的一个属性映射到与属性同名的一个XML属性。它通过(@XmlAccessOrder)Annotation来定类属性对应元素在XML节点中的前后顺序关系。

#####6. ECMAScript的5种原始类型是:(undefined、boolean、number、string、object)。 JavaScript的typeof运算符用来判断一个值是否在某种类型的范围内。 var s1; var s2 = null; var type1 = (typeof s1); var type2 = (typeof s2); 变量type1和type2分别指向(undefined)类型和(object)类型。

#####7. 请写出3个Hibernate的数据查询方式以及它们的使用场景:

  • query接口
  • Criteria接口
  • SQLQuery接口

###三、简答题

#####1. Java中String、StringBuffer、StringBuilder中之间的区别是什么? String是final类,不允许继承。内部使用final数组实现,一经初始化,不能够再修改。如果要修改一个String对象,只能重新创建一个新的String并使其引用这个对象。StringBuffer和StringBuilder是可变的String。通过封装String实现。其中StringBuilder是Java 5.0之后的较新版本,且不支持多线程。

#####2. Java中为什么需要同步?列出你所知道的几种同步方法。 在多线程环境下,多个线程会并发访问共享的一个内存地址空间。由于多线程切换的不确定性,运行不能保证每次都按相同的顺序执行,所以就要保证这样运行的情况下与单线程执行的结果是一致的。Java可以使用sychronized关键字同步代码块或者函数,volatile关键字保证long和double类型的原子性操作,wait()和notify()方法保证同步执行。

#####3. 无论系统规模有多大,Web缓存都有助于优化性能和节省带宽。Web缓存主要有哪两种方式?我们常见的MemcachD属于哪一种方式?它能提高系统性能的原因是什么?如果我们要自行设计一个Web缓存系统,需要关注哪些方面? Web缓存主要包括文件缓存和分布式缓存。MemcacheD是分布式缓存。MemcacheD使用物理内存作为缓存区,还使用了高校的基于key和value的hash算法来设计存储数据结构。淘汰机制基于LRU算法,所以提高了系统性能。

###四、编程题

#####1. 请使用Java语言定义一个具备insert、remove、find功能的二叉查找树BinarySearchTree摸板类,实现以下接口:

interface BinarySearchTree<T> {
    void add(T value);
    void remove();
    T find(T value);
    int size();
}

为了实现对象之间的比较,在BinarySearchTree类的构造方法中,会传入一个Comparable<T>;的接口实例。Comparable<T>的接口定义如下:

interface Comparable<T> {
    public int compareTo(T o1, T o2);
}

当o1小于o2时,compareTo方法返回-1,如果o1等于o2,compareTo放回0。如果o1大于o2,compareTo方法返回-1。 在实现BinarySearchTree类时,不需要考虑实现Comparable方法。可以假定调用者会主动传参。

class Value implements Comparable <Value>{
    private int value;
    
    public Value(int value) {
        this.value = value;
    }
    
    public int compareTo(Value v) {
        return this.value - v.value;  
    }  
}
public class BinarySearchTree<T extends Comparable<? super T>> {
    private static class BinaryNode<T> {
        BinaryNode(T element) {
            this(element, null, null);
        }
        BinaryNode(T element, BinaryNode<T> left, BinaryNode<T> right) {
            this.element = element;
            this.left = left;
            this.right = right;
        }
        T element;
        BinaryNode<T> left;
        BinaryNode<T> right;
    }
    
    private BinaryNode<T> root;
    private int count;
    
    public BinarySearchTree() {
        root = null;
        count = 0;
    }
    public void add(T value) {
        add(value, root);
    }
    public BinaryNode<T> add(T value, BinaryNode<T> t) {
        if (t == null) {
            count++;
            return new BinaryNode<T>(value) ;
        }
        
        int compareResult = value.compareTo(this.root.element);
        if (compareResult > 0) {
            t.right = add(value, t.right);
        }
        else if (compareResult < 0) {
            t.left = add(value, t.left);
        }
        return t;
    }
    public void remove(T value) {
        remove(value, root);
        count--;
    }
    public BinaryNode<T> remove(T value, BinaryNode<T> t) {
        if (t == null) {
            return t;
        }
        
        int compareResult = value.compareTo(this.root.element);
        if (compareResult > 0) {
            t.right = remove(value, t.right);
        }
        else if (compareResult < 0) {
            t.left = remove(value, t.left);
        }
        else if (t.left != null && t.right != null) {
            t.element = findMin(t.right).element;
            remove(t.element, t.right);
        }
        else {
            t = (t.right != null) ? t.left : t.right;
            count--;
        }
        return t;
    }
    public boolean find(T value) {
        return find(value, root);
    }
    public boolean find(T value, BinaryNode<T> t) {
        if (t == null)
            return false;
        
        int compareResult = value.compareTo(this.root.element);
        if (compareResult > 0) {
            return find(value, this.root.right);
        }
        else if (compareResult < 0) {
            return find(value, this.root.left);
        }
        else {
            return true;
        }
    }
    public BinaryNode<T> findMin(BinaryNode<T> t) {
        if (t == null) {
            return null;
        }
        if (t.left == null) {
            return t;
        }
        return findMin(t.left);
    }
    public int size() {
        return count;
    }
    
}

#####2. 有两个数组int a[], b[]。这两个数组都已经被进行了数据初始化,数据都不重复,且都没有排序。请设计一种算法,利用【问题1】实现的接口,将这两个数组合并,同时合并后的数据也要保证都是按照数值从小到大排列。同时请分析算法中元素之间比较的复杂度。 用两个数组创建一颗二叉查找树即可。比较的复杂度是O(logn)。

原文链接:方正国际2014校园招聘笔试,转载请注明来源!

EOF