var slideIndex = 1; showSlides(slideIndex); function plusSlides(n) { showSlides(slideIndex += n); } function currentSlide(n) { showSlides(slideIndex = n); } function showSlides(n) { var i; var slides = document.getElementsByClassName("mySlides"); var dots = document.getElementsByClassName("dot"); if (n > slides.length) {slideIndex = 1} if (n < 1) {slideIndex = slides.length} for (i = 0; i < slides.length; i++) { slides[i].style.display = "none"; } for (i = 0; i < dots.length; i++) { dots[i].className = dots[i].className.replace(" active", ""); } slides[slideIndex-1].style.display = "block"; dots[slideIndex-1].className += " active"; }

错题整理

 

1.JAVA语言的下面几种数组复制方法中,哪个效率最高?

   A for循环逐一复制

  B System.arraycopy

  C System.copyof

  D 使用clone方法

答案:B

A、for循环的话,很灵活,但是代码不够简洁.  for循环为什么慢,java中所以的变量都是引用,就其本身来说实在栈区,而申请的空间(也就是new)在堆中,所以一来一回,就会导致java中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);
    src - 源数组。srcPos - 源数组中的起始位置。dest - 目标数组。destPos - 目标数据中的起始位置。length - 要复制的数组元素的数量。
public class TestArrayCopy {

/**
* @param args
*/
public static void main(String[] args) {
   // TODO 自动生成方法存根

   String[] s1 = {"中国","山西","太原","TYUT","zyy","加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"};
   String[] s2 = new String[10];
   System.arraycopy(s1, 0, s2, 0, 10);
   s2[6] = "假设蒙大拿州";
   s2[7] = "假设蒙特利尔市";
   s2[8] = "假设Montreal商学院";

   System.out.println("This is s1");
   for(int i = 0;i < s1.length ;i++){
    System.out.print(s1[i] + ",");
   }

   System.out.println("\nThis is s2");
   for(int i = 0;i < s2.length ;i++){
    System.out.print(s2[i] + ",");
   }

   String[][] s3 = {{"中国","山西","太原","TYUT","zyy"},{"加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"}};
   String[][] s4 = new String[s3.length][s3[0].length];
   System.arraycopy(s3, 0, s4, 0, s3.length);

   System.out.println("\nThis is original s3");
   for(int i = 0;i < s3.length ;i++){
    for(int j = 0; j< s3[0].length ;j++){
     System.out.print(s3[i][j] + ",");
    }
   }


   s4[1][1] = "假设蒙大拿州";
   s4[1][2] = "假设蒙特利尔市";
   s4[1][3] = "假设Montreal商学院";

   System.out.println("\nThis is s3 after s4 has changed.");
   for(int i = 0;i < s3.length ;i++){
    for(int j = 0; j< s3[0].length ;j++){
     System.out.print(s3[i][j] + ",");
    }
   }

   System.out.println("\nThis is s4");
   for(int i = 0;i < s4.length ;i++){
    for(int j = 0; j < s4[0].length ; j++){
     System.out.print(s4[i][j] + ",");
    }

   }
}

}
TestArrayCopy


native方法:
Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。

  可以将native方法比作Java程序同C程序的接口,其实现步骤:

  1、在Java中声明native()方法,然后编译;

  2、用javah产生一个.h文件;

  3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);

  4、将第三步的.cpp文件编译成动态链接库文件;

  5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。

 
C、选项有误,copyOf不是System的方法,而是Arrays的方法,下面是源码,可以看到本质上是调用的arraycopy方法。,那么其效率必然是比不上 arraycopy的
 
1
2
3
4
5
6
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.csdn.net/topics/370151185。
 
结论:System.arraycopy > clone > Arrays.copyOf > for循环
 

2.下面有关servlet service描述错误的是?

 
  A 不管是post还是get方法提交过来的连接,都会在service中处理           

  B doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的

  C service()是在javax.servlet.Servlet接口中定义的

  D service判断请求类型,决定是调用doGet还是doPost方法

答案:B

注意以下几点:
1.service方法是在servlet生命周期中的服务期,默认在HttpServlet类中实现,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法实现。
2.GenericServlet 抽象类给出了设计servlet的一些骨架,定义了servlet生命周期还有一些得到名字、配置、初始化参数的方法,其设计的是和应用层协议无关的。doget/dopost与Http协议有关,是在 javax.servlet.http.HttpServlet 中实现的。
3.doGet和doPost方法在HttpServlet类中实现,GenericServlet中实现了service()
4.常说所有的请求都先由service方法处理,而javax.servlet.GenericServlet接口实现了javax.servlet.Servle接口,且javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子类。只有最先定义好了的service方法才可以处理所有的请求。
Servlet
 

3 .下面属于java合法变量定义的是?

 

A final

B 1var1

C _var2

D var3&

 

答案:C
标识符可以包括这4种字符:字母、下划线、$、数字;开头不能是数字;不能是关键字
 
4.
static String str0="0123456789";

static String str1="0123456789";

String str2=str1.substring(5);

String str3=new String(str2);

String str4=new String(str3.toCharArray());

str0=null;

假定str0,...,str4后序代码都是只读引用。
Java 7中,以上述代码为基础,在发生过一次FullGC后,上述代码在Heap空间(不包括PermGen)保留的字符数为()

   A  5

   B  10

   C  15

   D  20

答案:C

 这是一个关于java的垃圾回收机制的题目。垃圾回收主要针对的是堆区的回收,因为栈区的内存是随着线程而释放的。堆区分为三个区:年轻代(Young Generation)、年老代(Old Generation)、永久代(Permanent Generation,也就是方法区)。

 年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。

年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收

永久代:存储的是final常量,static变量,常量池。

str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,

经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen
 
 
 

5.What will happen when you attempt to compile and run the following code?

 

public class test{

static{

   int x=5;

}

static int x,y;

public static void main(String args[]){

   x--;

   myMethod( );

   System.out.println(x+y+ ++x);

}

public static void myMethod( ){

  y=x++ + ++x;

 }

}

 

 

  A compiletime error

 

 

  B prints:1

 

 

  C prints:2

 

 

  D prints:3

 

 

  E prints:7

 

  F prints:8

 

答案:D

public class TestStaticMethod{

static {

  int x=5;//类变量

}

static int x,y;


public static void main(String args[]){

  TestStaticMethod test = new TestStaticMethod();
     System.out.println("x的值"+test.x);

   x--;// 局部变量
   System.out.println("x的值"+x);


   myMethod( );
   System.out.println("y的值"+y);
   System.out.println("x的值"+x);
   System.out.println(x+y+ ++x);


}

public static void myMethod( ){

  y=x++ + ++x;

 }

}
TestStaiticMehod

 

6.下面不是面向对象的基本原则的是?

  A 单一职责原则(Single-Resposibility Principle)
  B 开放封闭原则(Open-Closed principle)
  C抽象类原则(Abstract-Class principle)
  D依赖倒置原则(Dependecy-Inversion Principle)
  E接口隔离原则(Interface-Segregation Principle)
 
答案:C
面向对象的五大基本原则  http://www.cnblogs.com/yellowapplemylove/archive/2011/05/11/2042903.html
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
 

7. 下面有关java threadlocal说法正确的有?

  A ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递

  B 线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收

  C 在Thread类中有一个Map,用于存储每一个线程的变量的副本。

  D 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式

 

答案:ABCD

 

posted @ 2016-11-11 18:40  Solomon_xm  阅读(128)  评论(0编辑  收藏  举报