您的位置:首页 > 编程语言 > Java开发

java刷题之查漏补缺(三)

2017-07-01 21:50 120 查看
1.Float是类,float不是类. 查看JDK源码就可以发现Byte,Character,Short,Integer,Long,Float,Double,Boolean都在java.lang包中. Float正确复制方式是Float f=1.0f,若不加f会被识别成double型,double无法向float隐式转换. Float a= new Float(1.0)是正确的赋值方法,但是在1.5及以上版本引入自动装箱拆箱后,会提示这是不必要的装箱的警告,通常直接使用Float f=1.0f.

2.默认值         取值范围                 示例 

字节型 :  0 -2^7—-2^7-1 byte b=10; 

字符型 :  ‘ \u0000′ 0—-2^16-1        char c=’c’ ; 

         short : 0 -2^15—-2^15-1 short s=10; 
int : 0 -2^31—-2^31-1
int i=10; 
long : 0 -2^63—-2^63-1    
long o=10L; 
float : 0.0f -2^31—-2^31-1
float f=10.0F 
double : 0.0d -2^63—-2^63-1
double d=10.0; 
boolean: false true\false
boolean flag=true;

3.一般关系数据模型和对象数据模型之间有以下对应关系:表对应类,记录对应对象,表的字段对应类的属性

4.Math.cos为计算弧度的余弦值,Math.toRadians函数讲角度转换为弧度

5.堆内存设置 

原理 

JVM堆内存分为2块:Permanent Space 和 Heap Space。 

Permanent 即 持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。 Heap = { Old + NEW = {Eden, from, to} },Old 即 年老代(Old Generation),New 即 年轻代(Young Generation)。年老代和年轻代的划分对垃圾收集影响比较大。 

年轻代 

所有新生成的对象首先都是放在年轻代。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代一般分3个区,1个Eden区,2个Survivor区(from 和 to)。 

大部分对象在Eden区中生成。当Eden区满时,还存活的对象将被复制到Survivor区(两个中的一个),当一个Survivor区满时,此区的存活对象将被复制到另外一个Survivor区,当另一个Survivor区也满了的时候,从前一个Survivor区复制过来的并且此时还存活的对象,将可能被复制到年老代。 

2个Survivor区是对称的,没有先后关系,所以同一个Survivor区中可能同时存在从Eden区复制过来对象,和从另一个Survivor区复制过来的对象;而复制到年老区的只有从另一个Survivor区过来的对象。而且,因为需要交换的原因,Survivor区至少有一个是空的。特殊的情况下,根据程序需要,Survivor区是可以配置为多个的(多于2个),这样可以增加对象在年轻代中的存在时间,减少被放到年老代的可能。 

针对年轻代的垃圾回收即 Young GC。 

年老代 

在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。 

针对年老代的垃圾回收即 Full GC。 

持久代 

用于存放静态类型数据,如 Java Class, Method 等。持久代对垃圾回收没有显著影响。但是有些应用可能动态生成或调用一些Class,例如 Hibernate CGLib 等,在这种时候往往需要设置一个比较大的持久代空间来存放这些运行过程中动态增加的类型。 

所以,当一组对象生成时,内存申请过程如下: 

JVM会试图为相关Java对象在年轻代的Eden区中初始化一块内存区域。 当Eden区空间足够时,内存申请结束。否则执行下一步。 JVM试图释放在Eden区中所有不活跃的对象(Young GC)。释放后若Eden空间仍然不足以放入新对象,JVM则试图将部分Eden区中活跃对象放入Survivor区。 Survivor区被用来作为Eden区及年老代的中间交换区域。当年老代空间足够时,Survivor区中存活了一定次数的对象会被移到年老代。 当年老代空间不够时,JVM会在年老代进行完全的垃圾回收(Full GC)。
Full GC后,若Survivor区及年老代仍然无法存放从Eden区复制过来的对象,则会导致JVM无法在Eden区为新生成的对象申请内存,即出现“Out of Memory”。 

OOM(“Out of Memory”)异常一般主要有如下2种原因: 

1. 年老代溢出,表现为:java.lang.OutOfMemoryError:Javaheapspace 

这是最常见的情况,产生的原因可能是:设置的内存参数Xmx过小或程序的内存泄露及使用不当问题。 

例如循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存。还有的时候虽然不会报内存溢出,却会使系统不间断的垃圾回收,也无法处理其它请求。这种情况下除了检查程序、打印堆内存等方法排查,还可以借助一些内存分析工具,比如MAT就很不错。 

2. 持久代溢出,表现为:java.lang.OutOfMemoryError:PermGenspace 

通常由于持久代设置过小,动态加载了大量Java类而导致溢出 ,解决办法唯有将参数 -XX:MaxPermSize 调大(一般256m能满足绝大多数应用程序需求)。将部分Java类放到容器共享区(例如Tomcat share lib)去加载的办法也是一个思路,但前提是容器里部署了多个应用,且这些应用有大量的共享类库

6.CallableStatement继承自PreparedSatement,PreparedStatement继承自Statement。

7.init方法:负责初始化Servlet对象。在Servlet的整个生命周期类,init()方法只被调用一次。

destroy方法:销毁Servlet对象,释放占用的资源,Servlet要被卸载时调用

8.在JDBC应用中,应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。   

PreparedStatement接口继承Statement,PreparedStatement实例包含已编译的SQL语句,所以其执行速度要快于Statement对象。Statement为一条Sql语句生成执行计划,如果要执行两条sql语句select colume from table where colume=1;select colume from table where colume=2;会生成两个执行计划 一千个查询就生成一千个执行计划!PreparedStatement用于使用绑定变量重用执行计划select
colume from table where colume=:x;通过set不同数据只需要生成一次执行计划,可以重用。

9.子类不可以继承父类的构造方法,只可以调用父类的构造方法。子类中所有的构造函数都会默认访问父类中的空参数构造函数,这是因为子类的构造函数内第一行都有默认的super()语句。super()表示子类在初始化时调用父类的空参数的构造函数来完成初始化。一个类都会有默认的空参数的构造函数,若指定了带参构造函数,那么默认的空参数的构造函数,就不存在了。这时如果子类的构造函数有默认的super()语句,那么就会出现错误,因为父类中没有空参数的构造函数。因此,在子类中默认super()语句,在父类中无对应的构造函数,必须在子类的构造函数中通过this或super(参数)指定要访问的父类中的构造函数。

10.Object中包含以下方法: clone(); equals(); finalize(); getClass(); notify(),notifyAll(); hashCode(); toString(); wait()。

11.Java中的char是Unicode编码。 Unicode编码占两个字节,就是16位,足够存储一个汉字.

12.继承具有传递性,子类可以无条件向上转型!

13.运行时数据区包括:虚拟机栈区,堆区,方法区,本地方法栈,程序计数器。 

虚拟机栈区 :也就是我们常说的栈区,线
4000
程私有,存放基本类型,对象的引用和 returnAddress ,在编译期间完成分配。 

堆区 , JAVA 堆,也称 GC 堆,所有线程共享,存放对象的实例和数组, JAVA 堆是垃圾收集器管理的主要区域。 

方法区 :所有线程共享,存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等数据。这个区域的内存回收目标主要是针对常量池的对象的回收和对类型的卸载。 

程序计数器 :线程私有,每个线程都有自己独立的程序计数器,用来指示下一条指令的地址。

14.final修饰类、方法、属性!不能修饰抽象类,因为抽象类一般都是需要被继承的,final修饰后就不能继承了。

final修饰的方法不能被重写而不是重载!  

final修饰属性,此属性就是一个常量,不能被再次赋值!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: