java 编程思想——基础篇

== 与!=比较的是对象的引用,object reference;内容的比较用equals();

boolean不能使用not运算符

>>>:无正负号的右移运算符,采用所谓的零扩展,不论原值是正或负,一律在较高位补0

String +运算中,如果某个表达式以String为首,那么持续的所有的操作数也都必须是Strings。

1.39e-47f:表示的是1.39×10^(-47)

char, byte,short上进行的任何数学运算或位运算,运算之前其值都会被晋升为int

boolean不支持在上面的任何运算

java 中不允许用数字作为boolean

从float或double转变为整数值,总是完全舍弃小数,(而非四舍五入)

Math.random()的输出包括0.0,输出范围也就是[0,1)

对于static,没有this的概念。

垃圾回收器只知道释放由new分配的来的内存。

finalize()函数用来释放非new产生的,特殊的内存。它让你得以在垃圾回收时刻执行某些重要的清理动作。

垃圾回收不等于析构(destruction),你的对象可能不会被回收

垃圾回收动作只回收内存

通过java的非正常管道分配,打算做些类似C的事情,才是使用finalize的最好时机,例如通过native method调用C的free函数

装载某个class时(通常是在你为它产生第一个对象时),编译器首先会找到其.class文件,然后将class byte codes装载到内存。

java保证,变量绝对会在他们被使用之前被适当的初始化,当变量被定义与函数之内,java会用编译期错误消息来贯彻他的保证

class中初始化的顺序取决于变量在class中定义的顺序,所有变量会在任何一个函数被调用之前完成初始化。

对象生成过程:1、当某个型别的对象首次被产生出来时,或是当类的static函数,或者static数据成员首次被访问,java直译器(inter preter)必须查找环境变量classpath所制定的位置,找到Dog.class。2、一旦class文件被装载(这样就产生了一个Class对象),它的所有的static初始动作会被执行起来,因此static初始化动作仅会发生一次,就是在Class对象首次被装载时。3、当new一个对象时,建构过程会先为对象在heap分配足够的存储空间。4、这块存储空间会先被清零,并自动将基本数据类型初始为缺省值,并将reference设为null。5、执行所有出现于数据定义处的初始化动作 6、执行构造函数。

Integer[] a = new Integer[4];这还是个reference array,还需要生成新的Integer对象来初始化

 

第五章:

将变得的事物与不变的事物彼此隔离,是面向对象设计的首要考虑

java的可执行程序是一组.class文件,java的jar压缩工具能将众多的.class文件结合起来并予以压缩,java的直译器负责这些文件的查找,装载,解释

如果基类的构造函数有参数,则在子类中应该在一开始用super初始化

第9章:持有你的对象

无论你所使用的Array的型别为何,array本身实际上是个reference,指向heap之内的某个实际对象,这个对象持有“指向其他对象”的一些reference。

array的length函数可以得到数组的长度,但是不能得到实际存在的元素。array含有引用,跟引用指向一个实际的值是不一样的。

java中可以直接返回一个array,虽然实际返回是一个指向array的引用,但此刻你不需要负起照料array的责任

Arrays 类有一组static函数,能够执行许多array共用函数,有四个基本函数equals,fill,sort,binarySearch

fill函数将同一个数值填充到数组中

System.arraycopy()可以拷贝privitives array和object array,不过复制objects array时仅有reference会被复制,元素对象本身并不会被复制,此所谓浅层拷贝。

Arrays提供了重载版的equals(),来比较两个array是否相等。

ArrayList其实就是会自动扩容的Array,用法非常简单用add增加元素,用get配合索引将他们取出,优点在于可随机访问其中元素

容器分类中,abstract类只是提供一些简单的工具,只需要关心interface和concreteClass即可。

Collection中并不包含get函数,因为colleciton涵盖了set,而set会维护它自己的内部排列(这就使得随机访问不具有意义),因此如果你想查看collection内的所有元素,得使用迭代器才行。

Vector,Stack,Hashtable都是老旧的版本,最好不好使用。

List中最重要的特征是次序(Order),它保证以某种特定的次序来维护元素。

HashSet和TreeSet中的数据都是有序存放的。

HashSet:把查找时间看的很重要,所有元素都必须定义hashCode()

TreeSet:底层结构为tree的一种有序Set,这样便可以从set中提取一个有序的序列。

使用Hashset,treeset都得定义equals()函数,但只有使用HashSet时才一定得定义hashCode,

HashSet往往是选择Set实现对象的第一选择。

ArrayList是数字与对象的关联,而Map是对象与对象的关联。

HashMap:基于hash table的一个实现品,可在常量时间内安插元素,或找出一组key-value pair,通过构造函数还可以调整效能表现。

treeMap:基于红黑树的一个实现,当检视其中的key或key-value时,会以排序的形式出现,特色是让你得以排序的形式得到结果。

因为HashMap使用hash table来实现,如果使用自己定义的class来作为key,则需要这个类要重写hashCode和equals函数;

设计hashCode时最重要的因素就是:无论hashcode()何时被调用,针对同一个对象,每次被调用都应该产生相同的值,

通过Collections类中的synchronize方法来得到同步版本。

posted on 2012-02-09 15:14  Java码界探秘  阅读(117)  评论(0编辑  收藏  举报

导航