方正国际2014校园招聘笔试
这套笔试题当时做的时候觉得很难,还涉及到了一些架构的东西,当时都不会。现在看来,也就那样,熟悉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语言,标示符都不能以数字开头。
https://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–