以下程序的运行结果是()
public class Increment
{
public static void main(String args[])
{
int a;
a = 6;
System.out.print(a);
System.out.print(a++);
System.out.print(a);
}
}
正确答案: B 你的答案: D (错误)
666
667
677
676
这是个失误得分,但也最基本, a++ 在应用时先用a 而后执行 +1操作
解析:
假设有以下代码
String s = “hello”;
String t = “hello”;
char c[] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’};
下列选项中返回false的语句是:
正确答案: B 你的答案: C (错误)
s.equals(t);
t.equals©;
s==t;
t.equals(new String (“hello”));
String类重写了equlas方法,类型不同返回false,附上源码(jdk1.7)
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String) anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
==是比较两个内存地址是否相同,相同为true,不相同为false;
在字符串缓冲池中,若已有字符串,则直接赋值时不再新创建一个字符串,如果是new 关键字,则新创建一个不同的字符串。
String类的equals被重新复写,只要字符串相等,则返回true。
JAVA语言的下面几种数组复制方法中,哪个效率最高?
正确答案: B 你的答案: D (错误)
for循环逐一复制
System.arraycopy
Arrays.copyof
使用clone方法
解析1:
A、for循环的话,很灵活,但是代码不够简洁.
B、System.arraycopy()源码。可以看到是native方法:native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。 可以将native方法比作Java程序同C程序的接口。
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,int length);
C、选项有误,copyOf不是System的方法,而是Arrays的方法,下面是源码,可以看到本质上是调用的arraycopy方法。,那么其效率必然是比不上 arraycopy的
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
D。clone的话,返回的是Object【】,需要强制转换。 一般用clone效率是最差的
CD可以排除。那么AB怎么比较呢?
给出一下参考的:
http://bbs.youkuaiyun.com/topics/370151185。
http://xuyuanshuaaa.iteye.com/blog/1046621 java的system.arraycopy()方法
具体的理由不好说。不过一致的说法和实验证明是arraycopy()效率高!!!T…T
解析2:
首先:Sytem.copyOf有这个?我只知道是Arrays.copyOf
结论:
效率:System.arraycopy > clone > Arrays.copyOf > for循环
理由:
A:for循环,效率最低,随便写个程序验证一下,效率慢的不是一点…我测试的时候比clone和System.arraycopy差了100多倍
B:System.arraycopy:原型是
public static native void arraycopy(Object src, int srcPos , Object dest, int destPos, int length);
C:Arrays.copyOf底层调用了上面的System.copyOf效率比上面两个低。
D:clone()的完整定义:protected native Object clone() throws CloneNotSupportedException;
高票答案说的clone()返回的是Object类型,其实是错误的,只有Object[]数组的clone()方法才返回Object类型,子类重写了父类的方法。
其实,一般情况下,前三个的效率差别几乎忽略不计,但是从Arrays.copyOf底层调用的是System.arraycopy,自然System.arrayCopy效率自然要低一些。
而clone()和System.arraycopy只是从实验的结果来看是System.arraycopy的效率高。
下列Java代码中的变量a、b、c分别在内存的____存储区存放。
class A {
private String a = “aa”;
public boolean methodB() {
String b = “bb”;
final String c = “cc”;
}
}
正确答案: C 你的答案: A (错误)
堆区、堆区、堆区
堆区、栈区、堆区
堆区、栈区、栈区
堆区、堆区、栈区
静态区、栈区、堆区
静态区、栈区、栈区
解析1:
a是类中的成员变量,存放在堆区
b、c都是方法中的局部变量,存放在栈区
解析2:
堆区:只存放类对象,线程共享;
方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;
Math.round(11.5) 等于多少 (). Math.round(-11.5) 等于多少 ( ).
正确答案: C 你的答案: C (正确)
11 ,-11
11 ,-12
12 ,-11
12 ,-12
解析1:
floor : 意为地板,指向下取整,返回不大于它的最大整数 ceil : 意为天花板,指向上取整,返回不小于它的最小整数 round : 意为大约,表示“四舍五入”,而四舍五入是往大数方向入。Math.round(11.5)的结果为12,Math.round(-11.5)的结果为-11而不是-12。
解析2:
Math类中提供了三个与取整有关的方法:ceil,floor,round,这些方法的作用于它们的英文名称的含义相对应,例如:ceil的英文意义是天花板,该方法就表示向上取整,Math.ceil(11.3)的结果为12,Math.ceil(-11.6)的结果为-11;floor的英文是地板,该方法就表示向下取整,Math.floor(11.6)的结果是11,Math.floor(-11.4)的结果-12;最难掌握的是round方法,他表示“四舍五入”,算法为Math.floor(x+0.5),即将原来的数字加上0.5后再向下取整,所以,Math.round(11.5)的结果是12,Math.round(-11.5)的结果为-11.
Choose the correct ones from the following statements:
正确答案: A D 你的答案: C D (错误)
A class can implement more than one interfaces
A class can extend more than one class
An interface has at least one method declared.
An abstract class which has no abstract methods declared is legal
解析1:
1、一个类可以有多个接口;
2、一个类只能继承一个父类;
3、接口中可以不声明任何方法,和成员变量
interface testinterface{
}
4、抽象类可以不包含抽象方法,但有抽象方法的类一定要声明为抽象类
abstract class abstclass{
abstract void meth();
}
解析2:
简单的做个关于抽象类和接口的总结吧:
区别1:抽象类体现继承关系,一个类只能単继承。接口体现实现关系,一个类可以多实现。
区别2:抽象类中可以定义非抽象方法和抽象方法,子类继承后可以直接使用非抽象方法。接口的方法都是抽象的,必须由子类去实现。接口中的成员都有固定的修饰符。
区别3:抽象类有构造方法,用于给子类对象初始化。而接口没有构造方法。
特点1:抽象类不可以实例化,即不能用new创建对象。抽象类必须由其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则,这个子类也是抽象类。
特点2:抽象类abstract关键字不能和哪些关键字共存:
final 因为final修饰的方法不能被继承。
static因为类.方法(),此方法没有方法体,没有意义。
private 因为抽象方法是要被子类覆盖的,加上private子类就不知道这个方法了。
特点3:接口中声明变量必须是final、public 、static的,接口中定义的方法都是abstract、public的。接口里的数据成员必须初始化,且全是常量,不是变量。
特点4:接口是抽象类的 变体( 你没看错 ), 接口也可以通过关键字extends来继承其他接口。格式如下所示:
class 类名称 implements 接口A,接口B{ //接口的实现}
interface 子接口名称 extends 父接口1,父接口2,…{}
下面有关forward和redirect的描述,正确的是() ?
正确答案: B C D 你的答案: A (错误)
forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求
执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址
执行redirect时,服务器端告诉浏览器重新去请求地址
forward是内部重定向,redirect是外部重定向
redirect默认将产生301 Permanently moved的HTTP响应
1.从地址栏显示来说
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.
2.从数据共享来说
forward:转发页面和转发到的页面可以共享request里面的数据.
redirect:不能共享数据.
3.从运用地方来说
forward:一般用于用户登陆的时候,根据角色转发到相应的模块.
redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.
4.从效率来说
forward:高.
redirect:低.
解释一
一句话,转发是服务器行为,重定向是客户端行为。为什么这样说呢,这就要看两个动作的工作流程:
转发过程:客户浏览器发送http请求----》web服务器接受此请求–》调用内部的一个方法在容器内部完成请求处理和转发动作----》将目标资源 发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客 户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向过程:客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现 是302响应,则自动再发送一个新的http请求,请求url是新的location地址----》服务器根据此请求寻找资源并发送给客户。在这里 location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的 路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的。
解释二
重定向,其实是两次request, 第一次,客户端request A,服务器响应,并response回来,告诉浏览器,你应该去B。这个时候IE可以看到地址变了,而且历史的回退按钮也亮了。重定向可以访问自己web应用以外的资源。在重定向的过程中,传输的信息会被丢失。
解释三
假设你去办理某个执照,
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发:你先去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来。
下列有关JAVA异常处理的叙述中正确的是()
正确答案: A B D 你的答案: A B C D (错误)
finally是为确保一段代码不管是否捕获异常都会被执行的一段代码
throws是用来声明一个成员方法可能抛出的各种非运行异常情况
final用于可以声明属性和方法,分别表示属性的不可变及方法的不可继承
throw是用来明确地抛出一个异常情况
解析:
throws用于在方法上声明该方法不需要处理的异常类型,用在方法上后面跟异常类名 可以是多个异常类
throw用于抛出具体异常类的对象,用在方法内 后面跟异常对象只能是一个异常类型实体.
try块必须和catch块或和finally同在,不能单独存在,二者必须出现一个.
finally块总会执行,不论是否有错误出现.但是若try语句块或会执行的catch语句块使用了JVM系统退出语句,finally块就不会被执行了. 一般我们把关闭资源的代码放在finally里面 保证资源总是能关闭
然后再看这一题 A肯定对了,C根本就跟异常处理没有关系,所以不选。就算有关系也错了
final用于声明属性、方法、类。分别表示属性不可更改、方法不能被覆盖、类不能被继承。
所以C选项说方法不能被继承错误,是不能覆盖