== 与!=比较的是对象的引用,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方法来得到同步版本。