1.JAVA语言的下面几种数组复制方法中,哪个效率最高?
A for循环逐一复制
B System.arraycopy
C System.copyof
D 使用clone方法
答案:B
A、for循环的话,很灵活,但是代码不够简洁. for循环为什么慢,java中所以的变量都是引用,就其本身来说实在栈区,而申请的空间(也就是new)在堆中,所以一来一回,就会导致java中for循环变慢。
原型: 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] + ",");}} }}
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中被访问了。
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; } |
2.下面有关servlet service描述错误的是?
B doGet/doPost 则是在 javax.servlet.GenericServlet 中实现的
C service()是在javax.servlet.Servlet接口中定义的
D service判断请求类型,决定是调用doGet还是doPost方法
答案:B
3 .下面属于java合法变量定义的是?
A final
B 1var1
C _var2
D var3&
标识符可以包括这
4
种字符:字母、下划线、$、数字;开头不能是数字;不能是关键字
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)保留的字符数为()
B 10
C 15
D 20
答案:C
年轻代:对象被创建时(new)的对象通常被放在Young(除了一些占据内存比较大的对象),经过一定的Minor GC(针对年轻代的内存回收)还活着的对象会被移动到年老代(一些具体的移动细节省略)。
年老代:就是上述年轻代移动过来的和一些比较大的对象。Minor GC(FullGC)是针对年老代的回收
永久代:存储的是final常量,static变量,常量池。
str3,str4都是直接new的对象,而substring的源代码其实也是new一个string对象返回,
经过fullgc之后,年老区的内存回收,则年轻区的占了15个,不算PermGen5.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;
}
}
答案: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;}}
6.下面不是面向对象的基本原则的是?
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
7. 下面有关java threadlocal说法正确的有?
A ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递
B 线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收
C 在Thread类中有一个Map,用于存储每一个线程的变量的副本。
D 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式
答案:ABCD