
JAVA面试题.doc
8页精品文档,仅供学习与交流,如有侵权请联系网站删除从网上找到一份人人网JAVA的笔试题,做了一下,受益匪浅,贴出来,个人水平有限,欢迎各位留言讨论 JAVA 笔试题【填空题】java面向对象的三大特征是:_______,_______,_______.答:封装,继承,多态sleep()和wait()的区别是___________________________.答:(1)sleep()不释放对象锁,wait()释放对象锁2)sleep()可以在时间未到时被打断,抛出异常,所以需要捕获异常,wait不需要捕获异常3)sleep()是Thread类的方法,wait()是Object类的方法一个类被JVM回收的标志是_______________________.答:类未被其他的活动类引用重写JAVA equals方法,需要同时重写:_____________.答:hashCode方法这是JAVA的常规约定,如果不重写hashCode,使用HashMap,HashSet等类时会出现错误。
调用equals()方法比较两个对象的时候,编译器会自动调用hashCode()来比较两个对象是否产生相同的整数结果.equals()返回true,则hashCode()必返回true.equals()返回false,则hashCode()必返回false.那么重写equals()方法,肯定必须重写hashCode方法来保证二者的同步.String, StringBuilder, StringBuffer的区别:____________.答:String保存字符串常量,字符串的每次变化都会产生一个新的字符串对象StringBuilder和StringBuffer都是可以变化而不产生新的对象的其中,StringBuffer是线程安全的,StringBuilder是线程不安全的增加数据表一列的SQL语法:_____________________.答:alter [table] add [列].JSP的内置对象及方法request,_______,______,_______.(常用三个即可)答:response,session,out,page,application,exception,pageContext,config.List,Set,Map是否继承自Collection接口:_____________.答:List和Set 是的,Map不是。
数据库事务特征________,________,________,________.答:ACID,原子性,一致性,隔离性,持久性针对10,100,32,45,58,126,3,29,200,400,0利用除商留余法构造长度为13的数据的HASH:________________________________.答:全部除以25再取余数,再连到一起?结果是:1007208134000.也可能最后再MOD一个10000000000000,题意没有读懂选择题】已知:Integer i=new Integer(42);Long l=new Long(42);Double d=new Double(42.0);下面哪些选项返回结果为true:A.(i==l)B.(i==d)C.(d==l)D.(i.equals(d))E.(d.equals(l))F.(i.equals(l))G.(l.equals(42L))答:ABC显然是错的,==比较的是两个对象的地址Long 和 Double之间,Integer 和 Double之间都是不能自动转化的但是Long和Integer之间可以自动转化,所以,F和G是正确的。
关于用abstract定义的类,下列说法正确的是() 可以被实例化 B.不能够派生子类 C.不能被继承 D.只能被继承 E.能够被抽象类继承答:概念题,DE是正确的当线程A使用某个对象,而此对象又需要线程B修改后才能符合A线程的需要,这时线程A就要等待线程B完成修改工作,这种现象称为() 线程的同步 B.线程的互斥 C.线程的调度 D.线程的就绪答:概念题,C在JAVA程序中定义一个类,类中有一个没有访问权限修饰的方法,则此方法()A. 类外的任何方法都能访问它B. 类外的任何方法都不能访问它C. 类的子类和同包类能访问它D. 只有类和同包类才能访问它答:概念题,D有如下程序代码,在执行完后x和y的值是多少()Int x=8,y=2,z;x=++x*y;z=x/y++;x=16,y=2. X=16,y=4. X=18,y=2. X=18,y=3.答:D,不解释问答题】int i=0;i=i++;以上操作中i=i++;是线程安全的吗?如果不安全请说明上面操作在JVM中执行过程,为什么不安全?并且说出JDK中哪个类能达到以上程序的效果,并且是线程安全而且高效,并简述其原理答:不是线程安全的。
JVM中,赋值语句的执行过程是,先把赋值号右边的值存入一个栈中,再从栈中弹出到赋值号左边的变量中所以,在执行i=i++后i的值为0但是如果在多线程的环境下执行i=i++,线程A中执行到把i压入栈,而在此之前线程B中执行到把i++,那么栈中i的值就已经改变了,最后线程A执行弹栈的操作,那么i的值就不是0了,所以是线程不安全的AtomicInteger中提供了线程安全且高效的原子操作其底层的原理是利用处理器的CAS(比较并交换)操作来检测栈中的值是否被其他线程改变,如果被改变则CAS操作失败这种实现方法比用sycronized来实现同步,底层显然有着更高的执行效率 2.数组int[n] a={1,2,2,……}数组a满足以下条件,均为正整数,a[i+1]>=a[i]快速找出满足a[i]=i的数答:这道题大家都没有想出O(logn)的算法,只好从常数上优化可以看出的一个性质是数组下标每次都是固定地增加1,所以若a[i]>i,则接下来的a[i]-i-1个数一定不可能满足a[i]=i;如果a[i]
时间复杂度依然是O(n),但是比直接枚举要快代码如下:package com.test;import java.util.Scanner;public class Main1 { private static Integer[] a = new Integer[500]; private static String[] str; public static int find(int l, int r) { if (l > r) return -1; if (a[l] == l) return l; if (a[r] == r) return r; int left_increment = Math.abs(a[l] - l); int right_increment = Math.abs(a[r] - r); return find(l + left_increment, r - right_increment); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); str = string.split(" "); for (int i = 0; i < str.length; i++) a[i] = Integer.parseInt(str[i]); int pos = find(0, str.length - 1); if (pos == -1) System.out.println("不存在满足a[i]==i的数"); else System.out.println("找到满足条件的数:a[" + pos + "]==" + pos); 3.数组 int[n] a={1,2,3,3,4,3,2……}数组a中的数均为正整数,求满足a[i]+a[t]=a[x],其中i,t,x均为正数,且小于等于n,求最大a[x].答:本人水平有限,目前只想到O(n^2*logn)时间复杂度的算法。
先将数组排序,然后从后往前枚举a[x],对于每一个a[x],从0到a[x-1],枚举a[i]的值,再二分查找a[t]是否存在,代码如下:package com.test;import java.util.Scanner;public class Main1 { private static Integer[] a = new Integer[500]; private static String[] str; public static void quicksort(int l, int r) { if (l >= r) return; int i = l - 1, j = r + 1; int mid = a[(l + r) >> 1]; while (i < j) { i++; j--; while (a[i] < mid) i++; while (a[j] > mid) j--; if (i < j) { int t = a[i]; a[i] = a[j]; a[j] = t; quicksort(l, j); quicksort(j + 1, r); public static boolean fen_2(int t) { int l = 0, r = str.length - 1, mid; while (l < r) { mid = (l + r) >> 1; if (a[mid] == t) return true; if (a[mid] < t) l = mid + 1; if (a[mid] > t) r = mid; return false; public static int find() { for (int i = str.length - 1; i >= 0。
