资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
java 常见笔试,面试题目深度解析最近找工作,参加了几个笔试面试,发现总结了常见的笔试面试知识点无非是以下这些:1 字符串相关2 异常相关3 反射相关4 线程相关(Thread)5 多态相关(Polymorphism)6 数组相关(Array)7 集合相关(Collection)8 设计模式相关 (Design Pattern)9 相等性相关 (equals hashCode)10 方法重写相关(Override)11 jsp 相关(jsp)12 servlet 相关(servlet)13 数据库相关(sql)14 三大框架相关(ssh)15 others1 字符串相关首先看看看段程序:tr上图三个结果都是 falsehttp:/video.sina.com.cn/v/b/30461277-1611059997.html代码public class StringTest public static void main(String args) String s0 = new String(abc);/此语句产生几个 String objectString s1 = abc;/此语句产生几个 String objectString s2 = new String(abc);/此语句产生几个 String objectString s3 = abc; System.out.println(s0 = s1);/输出 true or falseSystem.out.println(s0 = s2);/输出 true or falseSystem.out.println(s1 = s2);/输出 true or falseSystem.out.println(s1 = s3);/输出 true or falseSystem.out.println(s1 = s0.intern();/输出 true or falseSystem.out.println(s1 = s1.intern();/输出 true or falseSystem.out.println(s1 = s2.intern();/输出 true or falseString hello = hello;String hel = hel;String lo = lo;System.out.println(hello = hel + lo);/输出 true or falseSystem.out.println(hello = hel + lo);/输出 true or falseJava 堆和栈的区别(String 类)堆与栈Java 的堆是一个运行时数据区,对象从中分配空间。这些对象通过new、newarray、anewarray 和 multianewarray 等指令建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java 的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int,short,long,byte,float,double,boolean,char)和对象引用。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:Java 代码 int a = 3;int b = 3;编译器先处理 int a = 3;首先它会在栈中创建一个变量为 a 的引用,然后查找栈中是否有 3 这个值,如果没找到,就将 3 存放进来,然后将 a 指向 3。接着处理 int b = 3;在创建完 b 的引用变量后,因为在栈中已经有 3 这个值,便将 b 直接指向 3。这样,就出现了 a 与 b 同时均指向 3 的情况。这时,如果再令 a=4;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4存放进来,并令 a 指向 4;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。 要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况 a 的修改并不会影响到 b,它是由编译器完成的,它有利于节省空间。字符串 1. 首先 String 不属于 8 种基本数据类型,String 是一个对象。因为对象的默认值是null,所以 String 的默认值也是 null。但它又是一种特殊的对象,有其它对象没有的一些特性。2. new String()和 new String()都是申明一个新的空字符串,是空串不是 null。3. String str=kvill和 String str=new String(kvill)的区别示例:Java 代码String s0=kvill; String s1=kvill; String s2=kv + ill; System.out.println(s0=s1); System.out.println(s0=s2);结果为: truetrue首先,我们要知结果为道 Java 会确保一个字符串常量只有一个拷贝。因为例子中的 s0 和 s1 中的kvill都是字符串常量,它们在编译期就被确定了,所以 s0=s1 为 true。而kv和ill也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以 s2 也同样在编译期就被解析为一个字符串常量,所以 s2 也是常量池中kvill的一个引用。所以我们得出 s0=s1=s2。用 new String()创建的字符串不是常量,不能在编译期就确定,所以 new String() 创建的字符串不放入常量池中,它们有自己的地址空间。示例:Java 代码String s0=kvill; String s1=new String(kvill); String s2=kv + new String(ill); System.out.println(s0=s1); System.out.println(s0=s2); System.out.println(s1=s2);结果为:falsefalsefalse例 2 中 s0 还是常量池中kvill的应用,s1 因为无法在编译期确定,所以是运行时创建的新对象kvill的引用,s2 因为有后半部分 new String(ill)所以也无法在编译期确定,所以也是一个新创建对象kvill的应用。4. String.intern()再补充介绍一点:存在于.class 文件中的常量池,在运行期被 JVM 装载,并且可以扩充。String 的 intern()方法就是扩充常量池的一个方法。当一个 String 实例 str 调用intern()方法时,Java 查找常量池中是否有相同 Unicode 的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个 Unicode 等于 str 的字符串并返回它的引用。示例:Java 代码 String s0= kvill;String s1=new String(kvill);String s2=new String(kvill);System.out.println(s0=s1);System.out.println(*);s1.intern();s2=s2.intern();System.out.println(s0=s1);System.out.println(s0=s1.intern();System.out.println(s0=s2); 结果为:false*false /虽然执行了 s1.intern(),但它的返回值没有赋给 s1true /说明 s1.intern()返回的是常量池中kvill的引用true5. 关于 equals()和=这个对于 String 简单来说就是比较两字符串的 Unicode 序列是否相当,如果相等返回true。而=是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。6. 关于 String 是不可变的这一说又要说很多,大家只要知道 String 的实例一旦生成就不会再改变了。比如说:String str=kv+ill+ +ans; 就是有 4 个字符串常量,首先kv和ill生成了kvill存在内存中,然后kvill又和 生成 kvill存在内存中,最后又和ans生成了kvill ans;并把这个字符串的地址赋给了 str,就是因为 String 的不可变产生了很多临时变量,这也就是为什么建议用 StringBuffer 的原因了,因为 StringBuffer 是可改变的。下面是一些 String 相关的常见问题:String 中的 final 用法和理解Java 代码final StringBuffer a = new StringBuffer(111); final StringBuffer b = new StringBuffer(222);a=b;/此句编译不通过final StringBuffer a = new StringBuffer(111);a.append(222);/编译通过 可见,final 只对引用的值(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译器错误。至于它所指向的对象的变化,final 是不负责的。总结 栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String、数组、对象等等)但不存放对象内容。堆中存放使用 new 关键字创建的对象。字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定义(常量池和堆)。有的是编译期就已经创建好,存放在字符串常量池中,而有的是运行时才被创建。2 异常相关(Exception)Java 异常处理机制对于可能出现异常的代码,有两种处理办法:第一、在方法中用 try.catch 语句捕获并处理异常,catach 语句可以有多个,用来匹配多个异常。例如:public void p(int x) try . catch(Exception e) . finally . 第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过 throws 语句抛出异常。例如:public void test1() throws MyException . if(.) throw new MyException(); 如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java 虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止。然后将异常交给相应的 catch 语句处理。如果 Java 虚拟机追溯到方法调用栈最底部 main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理:第一、调用异常的对象的 printStackTrace()方法,打印方法调用栈的异常信息。第二、如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行。通过分析思考可以看出,越早处理异常消耗的资源和时间越小,产生影响的范围也越小。因此,不要把自己能处理的异常也抛给调用者。还有一点,不可忽视:finally 语句在任
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号