logo资料库

java初级面试.doc

第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
资料共40页,剩余部分请下载后查看
1.1.Java基础 56题目
1.2.面向对象编程 32题目]
1.3.IO
1.4.线程
1.5.网络编程
1.6.其他
面试题讲解大纲 Java 1.1. Java 基础 56 题目 教学内容 主题 按理论练习讲逐题讲解,蓝色为必须准备代码或案例讲解演示的的题目 知识点 理论练习 float 型 float f=3.4 是否正确? 错误,应该为 float f=3.4f; short s1 = 1; s1 = s1 + 1;有什么错? S1+1 的时候自动将 s1 从 short 型转换成了 int 型,所以结果 2 为 int 型;不能自动转换成 short; 即低精度自动转换成高精度,但高精度不能自动转换 成低精度 short s1 = 1; s1 += 1;有什么错? 正确 swtich 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上? short ,int ,char,byte 用最有效率的方法算出 2 乘以 8 等於几? 2*8 =16; 如何从 2 最快得到 16?? 2<<4 Java 有没有 goto? 有,保留关键字 Math.round(11.5)等於多少? 12 且为 long 型 Math.round(-11.5)等於多少? -11 且为 long 型 &和&&的区别。 & and(与) ,&& and(短路) &与&&的区别:如果&连接,那么无论任何情况,&两边的表达式都会参与计算;当全部为真则返回 true 如果&&连接,当&&左边的判断是 false 则不在计算&&右边的表达式,则直接返回 false;也就是是所谓的短路的意思 Java 中 int 的取值范围? -2 31~ 2 31-1 int 和 Integer 有什么区别 int 是基本数据类型,而 Integer 是 int 对应的包装器类,该类中提供了各种将 int 类型的数据与其他类型数据进行转换的方法 The Integer class wraps a value of the primitive type int in an object. An object of type Integer contains a single field whose type is int. String 是最基本的数据类型吗? 不是; byte、int、char、short 各占多少字节? Byte(1)、int (4)、char(2)、short(2) ; 一个字节=8 位,所以大家再看题目的时候要注意了; 简述逻辑操作(&,│,^)与条件操作(&&,││)的区别。 & and(与) ,&& and(短路) &与&&的区别:如果&连接,那么无论任何情况,&两边的表达式都会参与计算;当全部为真则返回 true 如果&&连接,当&&左边的判断是 false 则不在计算&&右边的表达式,则直接返回 false;也就是是所谓的短路的意思 | or (与), || or(短路) | 与|| 的区别:如果|连接,那么无论任何情况,|两边的表达式都会参与计算;只要有一个为 true,则返回 true 如果||连接,当||左边的判断是 true 则不在计算||右边的表达式;直接返回 true;不在判断剩下的条件表达式 从运算符的优先级别上来说:& > | > && > || 在 JAVA 中,如何跳出当前的多重嵌套循环 ? return , break (标签) public static void main(String[] args) { int i =0; for(; ;){ //外层循环
for(;i<10;i++){ //内层循环 System.out.println(i); if(i == 5) return ; //跳出外层循环 } } } public static void main(String[] args) { int i = 0; outer: //设置标签 while(true) { //外层循环 while(true) { //内层循环 i++; if(i == 7) { break outer; //结合标签跳出外层循环 } } } } 关键字 break 和 continue 的区别。 break 用于强行退出循环,不执行循环中剩余的语句。 而 continue 则停止执行当前的操作,然后退回循环起始处,开始新的循环 定义两个变量 a 和 b,不使用第三个变量,使两个值交换 a =a+b; b =a –b; a =a-b; 设计一个关卡,它有 20×20 个网格,每个网格代表一种游戏的元素(如草地、墙壁等),现在只给你 400 字节的空间,请你设计一种数据结构来存储这 个关卡 a[20][20] 将数组 int array1[]={1,2,3}复制到数组 int array2[],有效代码不超过 10 行。 public class Test { public static void main(String[] args) { int a[] = new int[]{1,2,3}; int b[] = new int[a.length]; System.arraycopy(a,0,b, 0, a.length); //使用 System 类中的方法 } } 描述一下 JVM 加载 class 文件的原理机制? 在 Java 中,类装载器把一个类装入 Java 虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备、解析 装载:查找和导入类或接口的二进制数据; 链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的; 校验:检查导入类或接口的二进制数据的正确性; 准备:给类的静态变量分配并初始化存储空间; 解析:将符号引用转成直接引用; 初始化:激活类的静态变量的初始化 Java 代码和静态 Java 代码块 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 可以,但只能有一个 public 的 class,且类名必须与源文件名相同
作用域 public,private,protected,以及不写时的区别 public 无限制,private 只能自己用; 不写的只能在同一个包中用,protected:同一个包或父子类可用 全局变量和局部变量有什么区别?怎么实现的?操作系统和编译器是怎么知道的? 全局变量是整个程序都可访问的变量,谁都可以访问,生存期在整个程序从运行到结束(在程序结束时所占内存释放),而局部变量存在于模块(子程序,函数) 中,只有所在模块可以 访问,其他模块不可直接访问,模块结束(函数调用完毕),局部变量消失,所占据的内存 释放。 操作系统和编译器是怎么知道的? 操作系统和编译器,可能是通过内存分配的位置来知道的,全局变量分配在全局数据段并且在程序开始运行的时候被加载. 局部变量则分配在堆栈里面 说出 ArrayList,Vector, LinkedList 的存储性能和特性 ArrayList 和Vector 都是用数组方式存储数据,此数组元素数要大于实际的存储空间以便进行元素增加和插入操作,他们都允许直接用序号索引元素,但是插入 数据元素涉及到元素移动等内存操作,所以索引数据快而插入数据慢. Vector 使用了 sychronized 方法(线程安全),所以在性能上比 ArrayList 要差些. LinkedList 使用双向链表方式存储数据,按序号索引数据需要前向或后向遍历数据,所以索引数据慢,是插入数据时只需要记录前后项即可,所以插入的速度快. 介绍 JAVA 中的 Collection FrameWork(包括如何写自己的数据结构)? Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 既不是==又不是 equals()方法; Set 是个接口.里面并没有定义具体的方法来检查其添加的元素是否重复.而是通过其具体实现类中的方法来实现重复检查的;例如 HashSet 就是通过其内部 对象 HashMap 的 put(k,v)方法来保存对象,并检查是否重复的; heap 和 stack 有什么区别。 在 java 中我们一般只用 stack,没用到过 heap; 在数据结构中,堆栈是一个统一的叫法,主要讲的还是栈的特点:数据结构中的堆栈是一种用来存储数据的集合,该集合的特点是:后进先出,或先进后出 它是在内存中开辟一个存储区域,数据一个一个顺序地存入(也就是“压入——push”)这个区域之中。有一个地址指针总指向最后一个压入堆栈的数据所 在的数据单元,存放这个地址指针的寄存器就叫做堆栈指示器。开始放入数据的单元叫做“栈底”。数据一个一个地存入,这个过程叫做“压栈”。在压栈的 过程中,每有一个数据压入堆栈,就放在和前一个单元相连的后面一个单元中,堆栈指示器中的地址自动加 1。读取这些数据时,按照堆栈指示器中的地址 读取数据,堆栈指示器中的地址数自动减 1。这个过程叫做“弹出 pop”。如此就实现了后进先出的原则。 List、Map、Set 三个接口,存取元素时,各有什么特点? List 以特定次序来持有元素,可有重复元素.查找效率高,插入效率低. Set 无法拥有重复元素,内部排序,检索元素效率低,删除和插入效率高,因为插入与删除操作不会引起位置变化. Map 保存 key-value 值,value 可多值. List, Set, Map 是否继承自 Collection 接口? 只有 List,Set 继承自 Collection 接口; 把二维数组和 Hashmap 结合 Collection 和 Collections 的区别。 Collection 接口是集合类的鼻祖,包含了集合操作的基本方法,其下有 List、Set 等接口, List 下有 ArrayList、 LinkedList、 LinkedList、Stack 等实现类 Set 下有 HashSet、TreeSet、LinkedHashSet 等 Collections 是针对集合类的一个帮助类,它提供了一系列静态方法实现了对各种集合的排序,搜索和线程安全等操作。 ArrayList 和 Vector 的区别,HashMap 和 Hashtable 的区别 ArrayList 和 Vector 的区别: 一、同步性:Vector 是线程安全的,也就是说是同步的,而 ArrayList 是线程不安全的,不是同步的 二、数据增长:当需要增长时,Vector 默认增长为原来一培,而 ArrayList 却是原来的一半 HashMap 和 Hashtable 的区别: 都属于 Map 接口的类,实现了将惟一键映射到特定的值上。 HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。它也比 HashMap 慢,因为它是同步的。
你所知道的集合类都有哪些?主要方法? List,Set ,Map; List 与 Set 都是 Collection 接口的子接口; List 以特定次序来持有元素,可有重复元素.查找效率高,插入效率低. Set 无法拥有重复元素,内部排序,检索元素效率低,删除和插入效率高,因为插入与删除操作不会引起位置变化. Map 并不继承自 Collection 接口;保存 key-value 值,value 可多值. Collection 接口中的常用方法: boolean add(Object o):添加一个对象到集合中 boolean remove(Object o):从集合中移出一个对象 int size():得到集合内的对象个数 boolean isEmpty():判断集合是否为空 boolean contains(Object o) :判断集合中是否包含该对象 Iterator iterator() :将集合对象转换成 Iterator 对象,可以进行循环取值 boolean containsAll(Collection c) :判断集合中是否包含有指定集合元素 void removeAll(Collection c): 从集合中移去指定的集合元素 boolean addAll(Collection c):将该集合添加到指定的集合中元素 void clear() : 删除集合对象中所有元素 void retainAll(Collection c);从集合中删除集合 c 中不包含的元素 Object[] toArray();返回一个包含集合中所有元素的数组 Object[] toArray(Object[] a);返回一个数组,该数组运行时类型与数组 a 的运行时类型相同 Set 一般都继承自 Collection 中的方法; List 除了有 Collection 中的方法外,还常用 indexOf(Object o) :返回第一个出现元素 o 的位置,如果找不到返回-1; get(in index):返回 List 集合中指定位置处的元素 add(int index ,Object o):将对象 o 添加中集合中指定位置 Map 常用的方法: Object put(Object key,Object value) :向集合 map 中添加新的键值对 Object get(Object key);根据键从集合中取值 int size() :得到集合长度 Object remove(Object key):从集合中删除指定 key 对应的值 在 J2EE 中,下列元素经过排序的集合类是().(选择一项) a) LinkedList b) Stack c) Hashtable d) TreeSet e) AbstractSequentialList 运行时异常与一般异常有何异同 异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误;如空指针、除以零,这些异 常程序不需要捕获,当出现问题的时候 jvm 会自动帮我们捕获异常。但 Java 编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声 明抛出未被捕获的运行时异常。 error 和 exception 有什么区别? error 表示恢复不是不可能,但很困难的情况下的一种严重问题。比如说内存溢,网络故障等。不可能指望程序能处理的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,就不会发生的情况。程序可以捕获到这些异常,并进行处理。 给我三个你最常见到的 runtime exception。(这类问题注意大小写)
最常见的: NullPointerException, ClassCastException, IndexOutOfBoundsException, ArithmeticException, NoSuchElementException, 所有的 AnnotationTypeMismatchException, ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, EnumConstantNotPresentException, EventException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IncompleteAnnotationException, IndexOutOfBoundsException, JMRuntimeException, LSException, MalformedParameterizedTypeException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, RejectedExecutionException, SecurityException, SystemException, TypeNotPresentException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException JAVA 语言如何进行异常处理,关键字:throws,throw,try,catch,finally 分别代表什么意义?在 try 块中可以抛出异常吗? Java 通过面向对象的方法进行异常处理,把各种不同的异常进行分类,并提供了良好的接口。在 Java 中,每个异常都是一个对象,它是 Throwable 类或其它子类的实例。当一个方法出现异常后便抛出一个异常对象,该对象中包含有异常信息,调用这个对象的方法可以捕获到这个异常并进行处理。 Java 的异常处理是通过 5 个关键词来实现的:try、catch、throw、throws 和 finally。 一般情况下是用 try 来执行一段程序,如果出现异常,系统会抛出(throws)一个异常,这时候你可以通过它的类型来捕捉(catch)它,或最后(finally) 由缺省处理器来处理。 用 try 来指定一块预防所有"异常"的程序。 紧跟在 try 程序后面,应包含一个 catch 子句来指定你想要捕捉的"异常"的类型。 throw 语句用来明确地抛出一个"异常"。 throws 用来标明一个成员函数可能抛出的各种"异常"。 Finally 为确保一段代码不管发生什么"异常"都被执行一段代码。 可以在一个成员函数调用的外面写一个 try 语句,在这个成员函数内部写另一个 try 语句保护其他代码。每当遇到一个 try 语句,"异常"的框架就放到 堆栈上面,直到所有的 try 语句都完成。如果下一级的 try 语句没有对某种"异常"进行处理,堆栈就会展开,直到遇到有处理这种"异常"的 try 语句。 在完整系统实现中,程序例外的处理机制 在项目设计中,一般都要创建自己的异常类,并根据不同的功能来进行分类,并在项目编码规范中给出明确的说明。项目编码实现中,需要统一整个项目中 严格按照编码规范来实现。对于检查型异常我们可以忽律,而主要抛出非检查型异常;创建自定义异常的时候通常都是继承 Exception 或其子类。 final, finally, finalize 的区别。 Final:修饰符(关键字)如果一个类被声明为 final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract 的,又被 声明为 final 的。将变量或方法声明为 final,可以保证它们在使用中不被改变。被声明为 final 的变量必须在声明时给定初值,而在以后的引用中只能读取, 不可修改。被声明为 final 的方法也同样只能使用,不能重载 finally:再异常处理时提供 finally 块来执行任何清除操作。如果抛出一个异常,那么相匹配的 catch 子句就会执行,然后控制就会进入 finally 块(如果有的话), 如果 try 代码中有 return 语句时,也会先执行 finally,在执行 return。 finalize:方法名。Java 技术允许使用 finalize() 方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收集器在确定这个对象 没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。 finalize() 方法是在垃圾收集器删除对象之前对这个对象调用的。 数组有没有 length()这个方法? String 有没有 length()这个方法? 数组只有 length 属性; String 类中有 length()方法; String 和 StringBuffer 的区别 String 的长度是不可变的,一旦一个 String 对象被创建,包含在这个实例中的内容(“字符串”)不可以被更改,直至这个对象被销毁,因此,指向一个 String 对象的变量实质上是一个常量,String 对象也被称为常量对象; StringBuffer 对象的长度是可变的,可以通过 StringBuffer 的 append()、insert()、reverse()、setCharAt()、setLength()等方法,可以对这个字符 串中的内容修改。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用 StringBuffer,如果最后需要 String,那么使用 StringBuffer 的 toString()方法
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我 ABC”4,应该截为“我 AB”, 输入“我 ABC 汉 DEF”,6 应该输出为“我 ABC”而不是“我 ABC+汉的半个”。 解体思想: 1)在 java 中默认存储数据使用的是 UNICODE 码的方式,双字节编;使用 16 位的编码空间。也就是每个字符占用 2 个字节; 一般英文字母或 1234567890 这些都是单字节编码;最多能表示的字符范围是 0-255;而汉字是双字节编码的;常用的中文编码标准为 GB2312 或 GBK;GBK 是在 GB2312 基础上扩充 来 的 。 GBK 编 码 包 含 了 20902 个 汉 字 , 编 码 范 围 为 : 0x8140-0xfefe; 而 且 如 果 是 字 母 或 数 字 的 话 , 转 换 成 char, 则 最 大 值 不 会 超 过 0xff(System.out.println(0xFF))//255; 2)根据题目的要求,我们在分割字符串的时候,必须保证汉字的完整,所以我们的思想是先将字符串转换成 char[]来实现截取,如果是汉字的话,那么转换成 的 char 字符应该>0xff 的,否则就是正常的字母或数字等单编码格式的 public class SplitString { public static void main(String[] args) { String str = "我ABC汉DEF"; //str = split(str, 6); str = truncate(str,6); System.out.println(str); } public static String split(String arg0, int arg1) { char[] carr = arg0.toCharArray(); int il = carr.length; for (int i = 0; i < arg1 && i < il; i++) { if (carr[i] > 0xFF) { arg1--; } } int x = arg1 > 0 ? arg1 : 0; x = arg1 < il ? arg1 : il; return arg0.substring(0, x); } public static String truncate(String str, int byteLength) { if (str == null) { return null; } if (str.length() == 0) { return str; } if (byteLength < 0) { throw new IllegalArgumentException("Parameter byteLength must be great than 0"); } char[] chs = str.toCharArray(); int i = 0; int len = 0; while ((len < byteLength) && (i < chs.length)) {
len = (chs[i++] > 0xff) ? (len + 2) : (len + 1); } if (len > byteLength) { i--; } return new String(chs, 0, i); } } 把字符串 S 中所有的字符串 A 转换成字符串 B String ss ="AbcAdefA"; ss = ss.replaceAll("A", "B"); 写一个方法,实现字符串的替换,如:输入 bbbwlirbbb,输出 bbbhhtccc。 String s = "bbbwlirbbb"; s.replaceAll("wlirbbb","hhtccc"); 写一个方法,实现字符串的反转,如:输入 abc,输出 cba public class Test { public static void main(String[] args) { System.out.println(new Test().reverse("abc")); } //字符串反转 public String reverse(String s){ int length=s.length(); StringBuffer result=new StringBuffer(length); for(int i=length-1;i>=0;i--) result.append(s.charAt(i)); return result.toString(); } } “abc cdf efj ww”字符串中间的空格不固定。现要求把它们分成一个字符串数组 a[1]=abc,a[2]=cdf,a[3]=efj,a[4]=ww。 解题思想: 1. String 的 String[] (regexp,limit)方法去截取字符串中包含的每个字串。regexp 为用这则表达式的用来分隔字符串的字符串。limit 为分隔次数, 即决定分隔后数组的大小,为 0 时,将不受限制 2. 使用正则表达式"\s+"来匹配表示任意多个空格,其中"\s"表示一个空格,"+"出现任意次 public class AA { public static void main(String[] args) { String str = "aa bb cc dd"; String[] ss = str.split("\\s+", 0); for (int i = 0; i < ss.length; i++) { System.out.println(ss[i]); } } }
以代码方式列出你所知道的连接字符串的各种方法。 public class TestClone { public static void main(String[] args) { String a = "abc"; String b = "def"; //通过连加的方式连接两个字符串,相当与又分配了一个新的内存空间存放 a+b System.out.println(a + b); //相当于先将 a 的空间释放,然后创建一个新的空间存放 abcdef 字符串 System.out.println(a.concat(b)); //先根据字符串 a 创建一个 StringBuffer 对象,此时该对象已经有内容 abc,append 相当与 //内存地址不变,空间扩充,字符串追加后,还是同一个对象 System.out.println(new StringBuffer(a).append(b)); } } 给你一个字符串,求其中有多少个“a”?写一个方法。 public class CalculateWords { public static void main(String[] args) { String str = "abc cdf efj ww"; int count = 0; int loc = 0; //每次 a 出现的位置 while((loc = str.indexOf("a",loc) ) != -1){ //从上次出现的下一个位置开始找 count++; loc ++; } System.out.println("有"+count+"个 a"); } } 已知 f 为 32bit 浮点数,请写程序将 f 四舍五入到 10 的-2 次方精度 <10 的-2 次方是 0.01 就是说保留浮点数两位> 代码解析: public class Floa { //对浮点数进行四舍五入:bits 表示小数点后保留位数 public float getFloat2bits(float result){ for (int i = 0; i <2; i++) {// 小数点向右移动 bits 位 result*=10; } // 将浮点型强制转换为整型时只保留整数部分 result=(float)(int)(result+0.5); for(int i=0;i<2;i++){// 小数点向左移动 bits 位 result*=0.1; }
分享到:
收藏