方正国际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 –