【读书笔记】java解惑

  1. Java取余操作符(%)与操作数的符号有关,负数的取余操作结果依然是负数
  2. 在Java中计算钱数最好扩大倍数,以分为单位,避免小数运算,使用int或long型,亦或是使用BigDecimal类,但是须知BigDecimal效率低,并且一定要用BigDecimal(String)构造器,使用其他参数类型的构造器可能依然会有精度问题。
  3. 将两个int数值相乘时会得到另一个int型的值,若结果中需要强转为long型数据,也会在运算结束之后,从int类型的结果转为long型。因此Java是不以存储结果的变量类型影响计算时使用的类型
  4. 末尾以l结尾的数字一定要仔细分辨其是数字1还是long型声明
  5. 十进制数所有的字面常量都是正的,要想写一个负的十进制常量,可以使用一个一元取反操作符(-)连接一个十进制字面常量。
  6. 十六进制和八进制字面常量具有正数和负数,如果它们的最高位被置位了那么它们就是负数。
  7. Java使用基于2 的补码的二进制运算,因此int类型的数值-1的所有32位都是置位的
  8. 不同数据类型之间的转换:int–>byte:窄化原始类型转化,直接将除第八位之外的所有位直接砍掉;byte–>char:拓宽并窄化原始类型的转化,先将byte转为int,再将int转为char;
  9. 从较窄的整型转换成较宽的整型时遵循:如果最初的数值类型是有符号的,那么就执行符号扩展(打印字符);如果是char,就执行零扩展(打印数值结果)

(int)(char)(byte)-1;最终的结果为65535

  1. java语言规范描述:操作符是从左向右求值的,因此在单个变量中不能对相同的变量赋值两次,会引起混乱
  2. 条件表达式条件表达式?true:false规则:如果第二个和第三个操作数具有相同的类型,那么它就是条件表达式类型;如果第一个操作数的类型是byte、short、char,另一个操作数是int型的常量表达式,那么结果的类型取决于第一个表达式的类型,否则就char类型的十进制ASCII码值

int i=0;
char x=‘X’;
true? x : i;//X
false? i:x;//88

  1. 不要将符合赋值操(+=…)作用于byte short char类型的变量上,在将符合赋值操作符用于int型的变量上时,确保表达式的右侧不是long float double类型,防止编译器产生窄化转型,丢失精度。
  2. 复合赋值操作符要求两个操作数都是原始类型,或是包装类型
  3. 只有对含有字符串的字面常量使用+操作符才是字符串连接操作,否则就是加法(如’h’+‘i’)
  4. 假如要连接没有一个数值是字符串类型的,可以通过:1.预置一个空字符串,对空字符串再使用连接+操作2.用String.valueOf()显示转化为字符串
  5. 将一个char数值传递给printf方法会打印出一个Unicode字符,而不是他的ascii码

计算机发明后,为了在计算机中表示字符,人们制定了一种编码,叫ASCII码。ASCII码由一个字节中的7位(bit)表示,范围是0x00 - 0x7F 共128个字符。
后来他们突然发现,如果需要按照表格方式打印这些字符的时候,缺少了“制表符”。于是又扩展了ASCII的定义,使用一个字节的全部8位(bit)来表示字符了,这就叫扩展ASCII码。范围是0x00 - 0xFF 共256个字符。
Unicode使用全16位元字元集。

  1. +操作符不论是做加法符号还是字符串连接操作,都比==操作符优先级高
  2. 比较对象引用时,应优先使用equals方法,而不是==操作符,除非需要比较的对象的标识
  3. 每一个Unicode转义字符在源文件中都需要用6个字符表示,java在对字符串字面常量中的unicode转义字符不提供任何特殊处理
  4. String(byte[])构造器:在通过解码使用平台缺省的字符集指定byte数组来构造一个新的String时,该String的长度是字符集的一个函数,因此,它可能不等于byte数组的长度,当给定所有字节在缺省字符集中并非完全有效时,这个构造器的行为是不确定的
  5. 正则表达式中:.可以表示任何单个字符,反斜杠在字面含义的字符串中具有特殊的含义,它标识转义字符的开始,因此反斜杠必须用另一个反斜杠转义
  6. 表达式random.nextInt(2)可能的取值只有0和1;
  7. 在switch语句中不同case情况的中没有任何break语句,不论switch表达式为何值,该程序都会继续执行其相对应的case以及后续所有case
  8. StringBuffer是有一个无参构造器,一个接收String作为字符缓冲区内容的构造器,一个接收int作为缓冲区初识容量的构造器,若给构造器传入的参数为一个char型字符,会自动转换成int型的值,作为第三个构造器的参数。
  9. 当++操作符被置于一个变量之后时,其作用就是一个后缀增量操作符
  10. 当一个值达到Integer.MAX_VALUE时,若再次执行增量操作,就会又绕回到Integer.MIN_VALUE,
  11. 如果对int型数值移位32位以上或对long型移位64位以上,都只会返回这个数值自身的值
  12. 可以用一个double或一个float数值来表示一个无穷大的数。将一个很小的浮点数加到一个很大的浮点数上时,将不会改变大的浮点数值。
  13. 对于一个没有良好的数字定义的浮点计算,如0.0/0.0,其值的结果都是NaN,NaN不等于任何浮点数,包括他自身在内
double i=0.0/0.0;
while(i!=i){

}
  1. 用+连接字符串和数值型的值,会使数值也变成String类型
String i="";
while(i != i+0){
}
  1. 混合操作符可能会自动执行窄化原始类型转换,这种转换把一种数字类型转换成了另一种更缺乏表示能力的类型,因此尽量不要在short、byte、char类型的变量上使用复合赋值操作符,它们执行将隐式的执行会丢失信息的窄化转型,其结果是灾难性的。
  2. Java的判等操作符==和!=在作用于对象引用时,执行的是引用的比较而不是值的比较,判等操作符在其两个操作数只有一个是被包装的数字类型,而另一个是原始类型(或包装类型)时,执行的是数值比较。因此以下无限循环成立
Integer i=new Integer(0);
Integer j=new Integer(0);
while(i<=j&&i>=j&&i!=j){
}
  1. Integer.MIN_VALUE和Long.MIN_VALUE的赋值==负值等于它们本身
int i=Integer.MIN_VALUE;
while(i!=0&&i==-i){
}
  1. 对于捕获被检查的异常的catch子句,只有在相应的try子句中抛出这些异常时才被允许,多个继承而来的throw子句的交集将减少方法允许抛出的异常的数量
  2. System.exit()将立即停止所有的程序线程,它并不会使finally语句块得到调用,但是他在停止JVM之前会执行关闭挂钩操作。
  3. 实例变量的初始化操作先于构造器的程序体运行,实例初始化操作抛出的任何异常都会传播给构造器,如果初始化操作抛出的是被检查异常,那么构造器必须声明也会抛出这些异常。
  4. 在finally语句块中调用close方法时,要用一个嵌套的try-catch语句来保护它,以防止IOException的传播
  5. &操作符除了被当作整形操作数的位AND操作符之外,当被用于布尔操作数时,他的功能被重载为逻辑AND操作符,&操作符需要计算左右两边的两个操作数;同理|操作符
  6. Java的异常检查机制并不是虚拟机强制执行的,他只是一个编译期工具,被设计用来帮助我们更容易编写正确的程序
  7. 每一个静态域在声明它的类及其所有的子类中共享一份单一的拷贝,若属性是static的,那么所有的实例都能够访问并修改这个属性值
  8. 在设计一个类时,如果该类构建于另一个类的行为之上,那么就有两种选择:1.继承;2.组合:在一个类中包含另一个类的实例;如果一个类的每一个实例都是另一个类的一个实例,就应该使用继承否则就选择组合
  9. 在含有继承关系的结构中,静态方法的调用不存在任何动态分配机制,当一个程序调用了静态方法时,要被调用的方法都是在编译时刻被选定的,这种选定是基于修饰符的编译期类型做出的,修饰符的编译期类型就是方法调用表达式中圆点左边部分的名字(在继承结构中,对于static方法的调用,向上找,对于普通成员方法,直接看new的类,向上找)
  10. 静态方法是不能被覆写的,只能被隐藏
  11. instanceof操作符被定义为:当其左操作数为null时,返回false;并且两个操作数的类型必须都是类,其中一个必须是另一个类的子类型,否则编译不通过
  12. 类的初始化是按照静态初始器在源代码中出现的顺序执行初始器的
  13. Java语言规范不允许一个本地变量声明语句在for,while,或do循环中重复执行,一个本地变量声明作为一条语句只能直接出现在一个语句块中
  14. 在使用一个变量对实例的创建进行计数时,要使用long类型,而不是int类型,以防止溢出
  15. BugInteger实例是不可变的,String、BigDecimal、以及包装类型的实例都是不可变的
  16. 不要在一个整型字面常量前加上一个0,这会使它变成一个八进制字面常量
  17. 当一个变量和一个类型具有相同的名字,并且它们位于相同的作用域时,变量名具有优先权,变量名将遮掩类型名,相似的,变量名和类型名可以遮掩包名。
  18. 一个包内私有的方法不能被位于另一个包内中的某个方法直接覆写
  19. 名字重用的术语表
覆写针对继承结构中可访问到的具有相同签名的所有实例方法
隐藏针对继承结构中静态方法或被private修饰的成员方法或属性
遮蔽一个变量、方法、类型可以被遮蔽在一个闭合文本范文内的具有相同名字的变量、方法或类型中
遮掩变量遮掩具有相同名字的类型;一个变量或类型遮掩具有相同名字的包
重载在同一个类中的具有相同方法名,不同方法签名的的方法
  1. 一个非静态的嵌套类的构造器,在编译时会将一个隐藏的参数作为他的第一个参数,这个参数表示了他的直接外围实例,当在代码中任何可以让编译器找到合适的外围实例的地方去调用构造器的时候,这个参数就会被隐式的被传递进去
  2. 对于write(int)方法,将指定的byte写入流,如果这个byte是一个换行符,并且流可以自动刷新,那么flush方法将被调用
  3. 实现Serializable的类,必须有一个readResolve()方法,用以返回它唯一的实例
  4. Java不支持负的十进制字面常量,int和long类型的负数常量都是由正数十进制字面常量前加一元负操作符(-)构成的
  5. 在泛型中,原生类型的成员被擦掉,是为了模拟泛型被添加到语言中之前的那些类型的行为,如果将原生类型和参数化类型混合使用,那么将无法获得使用泛型的所有好处,而且可能会产生编译错误
  6. 当在一个泛型类中嵌套另一个泛型类时,最好为它们的类型参数设置不同的名字,即使那个嵌套类是静态的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值