您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 股票报告 > java笔试重要知识点深度解析
java常见笔试,面试题目深度解析最近找工作,参加了几个笔试面试,发现总结了常见的笔试面试知识点无非是以下这些:1字符串相关2异常相关3反射相关4线程相关(Thread)5多态相关(Polymorphism)6数组相关(Array)7集合相关(Collection)8设计模式相关(DesignPattern)9相等性相关(equalshashCode)10方法重写相关(Override)11jsp相关(jsp)12servlet相关(servlet)13数据库相关(sql)14三大框架相关(ssh)15others1字符串相关首先看看看段程序:tr上图三个结果都是false代码publicclassStringTest{publicstaticvoidmain(String[]args){Strings0=newString(abc);//此语句产生几个StringobjectStrings1=abc;//此语句产生几个StringobjectStrings2=newString(abc);//此语句产生几个StringobjectStrings3=abc;System.out.println(s0==s1);//输出trueorfalseSystem.out.println(s0==s2);//输出trueorfalseSystem.out.println(s1==s2);//输出trueorfalseSystem.out.println(s1==s3);//输出trueorfalseSystem.out.println(s1==s0.intern());//输出trueorfalseSystem.out.println(s1==s1.intern());//输出trueorfalseSystem.out.println(s1==s2.intern());//输出trueorfalseStringhello=hello;Stringhel=hel;Stringlo=lo;System.out.println(hello==hel+lo);//输出trueorfalseSystem.out.println(hello==hel+lo);//输出trueorfalse}}Java堆和栈的区别(String类)堆与栈Java的堆是一个运行时数据区,对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立,它们不需要程序代码来显式地释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量数据(int,short,long,byte,float,double,boolean,char)和对象引用。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:Java代码inta=3;intb=3;编译器先处理inta=3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理intb=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.newString()和newString()都是申明一个新的空字符串,是空串不是null。3.Stringstr=kvill和Stringstr=newString(kvill)的区别示例:Java代码Strings0=kvill;Strings1=kvill;Strings2=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。用newString()创建的字符串不是常量,不能在编译期就确定,所以newString()创建的字符串不放入常量池中,它们有自己的地址空间。示例:Java代码Strings0=kvill;Strings1=newString(kvill);Strings2=kv+newString(ill);System.out.println(s0==s1);System.out.println(s0==s2);System.out.println(s1==s2);结果为:falsefalsefalse例2中s0还是常量池中kvill的应用,s1因为无法在编译期确定,所以是运行时创建的新对象kvill的引用,s2因为有后半部分newString(ill)所以也无法在编译期确定,所以也是一个新创建对象kvill的应用。4.String.intern()再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法。当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。示例:Java代码Strings0=kvill;Strings1=newString(kvill);Strings2=newString(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的实例一旦生成就不会再改变了。比如说:Stringstr=kv+ill++ans;就是有4个字符串常量,首先kv和ill生成了kvill存在内存中,然后kvill又和生成kvill存在内存中,最后又和ans生成了kvillans;并把这个字符串的地址赋给了str,就是因为String的不可变产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。下面是一些String相关的常见问题:String中的final用法和理解Java代码finalStringBuffera=newStringBuffer(111);finalStringBufferb=newStringBuffer(222);a=b;//此句编译不通过finalStringBuffera=newStringBuffer(111);a.append(222);//编译通过可见,final只对引用的值(即内存地址)有效,它迫使引用只能指向初始指向的那个对象,改变它的指向会导致编译器错误。至于它所指向的对象的变化,final是不负责的。总结栈中用来存放一些原始数据类型的局部变量数据和对象的引用(String、数组、对象等等)但不存放对象内容。堆中存放使用new关键字创建的对象。字符串是一个特殊包装类,其引用是存放在栈里的,而对象内容必须根据创建方式不同定义(常量池和堆)。有的是编译期就已经创建好,存放在字符串常量池中,而有的是运行时才被创建。2异常相关(Exception)Java异常处理机制对于可能出现异常的代码,有两种处理办法:第一、在方法中用try...catch语句捕获并处理异常,catach语句可以有多个,用来匹配多个异常。例如:publicvoidp(intx){try{...}catch(Exceptione){...}finally{...}}第二、对于处理不了的异常或者要转型的异常,在方法的声明处通过throws语句抛出异常。例如:publicvoidtest1()throwsMyException{...if(....){thrownewMyException();}}如果每个方法都是简单的抛出异常,那么在方法调用方法的多层嵌套调用中,Java虚拟机会从出现异常的方法代码块中往回找,直到找到处理该异常的代码块为止。然后将异常交给相应的catch语句处理。如果Java虚拟机追溯到方法调用栈最底部main()方法时,如果仍然没有找到处理异常的代码块,将按照下面的步骤处理:第一、调用异常的对象的printStackTrace()方法,打印方法调用栈的异常信息。第二、如果出现异常的线程为主线程,则整个程序运行终止;如果非主线程,则终止该线程,其他线程继续运行。通过分析思考可以看出,越早处理异常消耗的资源和时间越小,产生影响的范围也越小。因此,不要把自己能处理的异常也抛给调用者。还有一点,不可忽视:finally语句在任何情况下都必须执行的代码,这样可以保证一些在任何情况下都必须执行代码的可靠性。比如,在数据库查询异常的时候,应该释放JDBC连接等等。finally语句先于return语句执行,而不论其先后位置,也不管是否try块出现异常。finally语句唯一不被执行的情况是方法执行了System.exit()方法。System.exit()的作用是终止当前正在运行的Java虚拟机。finally语句块中不能通过给变量赋新值来改变return的返回值,也建议不要在finally块中使用return语句,没有意义还容易导致错误。最后还应该注意一下异常处理的语法规则:第一、try语句不能单独存在,可以和catch、finally组成try...catch...finally、try...catch、try...finally三种结构,catch语句可以有一个或多个,finally语句最多一个,try、catch、finally这三个关键字均不能单独使用。第二、try、catch、finally三个代码块中变量的作用域分别独立而不能相互访问。如果要在三个块中都可以访问,则需要将变量定义到这些块的外面。第三、多个catch块时候,Java
本文标题:java笔试重要知识点深度解析
链接地址:https://www.777doc.com/doc-5141364 .html