java 日常小结

java 日常总结
作为个人笔记,不具有参考价值。
1:Java final关键字解释
final 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c:\\test.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。形象的比喻:一个女子定义了一个final的老公,这个老公的职业和收入都是允许改变的,只是这个女人不会换老公而已。

使用final关键字修饰一个变量时,是指引用变量不能变,引用变量所指向的对象中的内容还是可以改变的。

final类中的成员变量,你可以定义其为final,也可以不是final。而对于方法,由于所属类为final的关系,自然也就成了final型的。你也可以明确的给final类中的方法加上一个final,但这显然没有意义。
2:
类型             大小
boolean      1位   不是数字类型,不能对布尔变量进行算术运算
char            16位 字符型在java中,被看做无符号整型.26个字母和特殊字符,每个国家的字符等。char a = 'a',b='%';输出 a=a,b=%。
byte            8位   字节型。代表了26个字母对应的数值,byte a='a'; 表示了a对应的数值为97,byte b = '1',c=1; 打印出b,c后,输出b=49,c=1.   b表示字符1所在的位置。
short          16位
int               32位
(1):int类型向double类型或者float类型的时候,不需要强制类型转换,因为32位精度向高位,不需要转换;但是double向int转换,64位的高精度向32位低精度转换,需要强制类型转换。
例如:double a=1,b=2;
int m = a+b;必须写成int m =(int)(a+b);
(2):两个byte相加,变成了短整型。byte a=1,b=2,c; 当a+b之后,编译器会自动转换成整型。c=(byte)(a+b);

3: StringBuilder与StringBuffer和String 的区别
转载自:http://apps.hi.baidu.com/share/detail/33501758
       String类型和StringBuffer类型的主要性能区别其实在于 String 是不可变的对象,因此在每次对String类型进行改变的时候其实都等同于生成了一个新的 String对象,然后将指针指向新的String对象,所以经常改变内容的字符串最好不要用 String
      如果是使用StringBuffer类则结果就不一样了,每次结果都会对StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用
     先简单介绍一下, StringBuilder 是 JDK5.0 中新增加的一个类,它跟 StringBuffer 的区别看下面的介绍:
   Java.lang.StringBuffer线程安全的可变字符序列。类似于 String 的字符串缓冲区,但不能修改。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
   每个字符串缓冲区都有一定的容量。只要字符串缓冲区所包含的字符序列的长度没有超出此容量,就无需分配新的内部缓冲区数组。如果内部缓冲区溢出,则此容量自动增大。从 JDK 5.0 开始,为该类增添了一个单个线程使用的等价类,即 StringBuilder 。与该类相比,通常应该优先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
    但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer 。
在大部分情况下
     StringBuilder > StringBuffer > String
4:[转载]finalize() 和 system.gc() 的区别
finalize()是由JVM自动调用的,你可以用System.gc(),但JVM不一定会立刻执行,JVM感觉内存空间有限时,才会开始执行finalize(),至于新的对象创建个数和被收集个数不同是因为收集的对象只和JVM的垃圾收集策略有关。
finalize()和gc()
(1)问题:finalize()函数是干嘛的?Java不是有Garbage Collection(以下简称gc)来负责回收内存吗?
回答:
gc 只能清除在堆上分配的内存(纯java语言的所有对象都在堆上使用new分配内存),而不能清除栈上分配的内存(当使用JNI技术时,可能会在栈上分配内存,例如java调用c程序,而该c程序使用malloc分配内存时).因此,如果某些对象被分配了栈上的内存区域,那gc就管不着了,对这样的对象进行内存回收就要靠finalize().
举个例子来说,
当java 调用非java方法时(这种方法可能是c或是c++的),在非java代码内部也许调用了c的malloc()函数来分配内存,而且除非调用那个了 free() ;否则不会释放内存(因为free()是c的函数),这个时候要进行释放内存的工作,gc是不起作用的,因而需要在finalize()内部的一个固有方法调用它(free()).
finalize的工作原理应该是这样的:
一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存.所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作.
(2)问题:finalize()在什么时候被调用?
回答:
有三种情况
1.所有对象被Garbage Collection时自动调用,比如运行System.gc()的时候.
2.程序退出时为每个对象调用一次finalize方法。
3.显式的调用finalize方法
       除此以外,正常情况下,当某个对象被系统收集为无用信息的时候,finalize()将被自动调用,但是jvm不保证finalize()一定被调用,也就是说,finalize()的调用是不确定的,这也就是为什么sun不提倡使用finalize()的原因. 简单来讲,finalize()是在对象被GC回收前会调用的方法,而System.gc()强制GC开始回收工作纠正,不是强制,是建议,具体执行要看GC的意思简单地说,调用了 System.gc() 之后,java 在内存回收过程中就会调用那些要被回收的对象的 finalize() 方法。

5:List,Set,集成接口Collection。
list允许重复的元素,Set是集合不允许重复的元素。
list放入元素的顺序是什么样的,取出来就是什么样的。
Set按照哈希法进行了排序。所以存入和取出的顺序不一样。
Map:是键值对的存取。按照哈希法进行了排序。所以存入和取出的顺序不一样。

6:枚举类型
public enum Action {
TURN_LEFT,
TURN_RIGHT,
SHOOT
}
public class EnumDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
doAction(Action.SHOOT);
}

public static void doAction(Action mAction){
switch(mAction){
case TURN_LEFT:
System.out.println("turn left");
case TURN_RIGHT:
System.out.println("turn right");
case SHOOT:
System.out.println("turn shoot");
default:
break;
}
}
}
好处:少输入一些字符,对switch中输入的类型进行检查,如果不是action中的成员,会报错。枚举类型实质也是类。每个变量是对应的enum实例。