Core Java笔记——第3章

第三章 Java基本的程序设计结构

 

Java中所有数值类型占据的字节数与平台无关,解决了跨平台的一个问题

Java中没有任何无符号类型(byte shortint long等类型都是从负数到正数)

Float有效位6-7位,double有效位15位  int的范围40亿,共十位(mysql中int的范围就是2的32次方/2,因为有正负,大概两亿多)


整型除以0报错,除零异常

浮点型除以0得到infinity  

常量 Double.positive_infinity double.negative_infinity double.NaN

监测一个值是否是数值,  if(Double.isNaN(x))

 

浮点数不适用于禁止出现误差的金融计算。因为二进制无法精确表示分数1/10

此时应该使用大数值对象bigDecimal,另外还有bigInteger类型(大数值没有常用的+-*/,而要使用add mutiply等函数) 

BigIntegera = BigInteger.valueOf(100); 转换为大数值类型

 

检测浮点数相等时要特别注意,有可能永远不会等,尤其在循环中作为结束条件判断时,千万要注意,不能这么做

 

1991年发布了unicode1.0当时仅占用65536个代码值中不到一半的部分,所以在设计java时采用了16位(两个字节)的unicode字符集。现在16位 的char类型已经不能满足描述所有unicode字符的需要了,因为unicode字符后来超过了65536个。

为了解决这个问题,java从1.5开始引入了代码点和代码单元。

代码点(code point):编码表中某个字符对应的代码值。Unicode标准中,代码点使用十六进制书写,加上前缀U+。例如:U+0041是字母A的代码点。

代码点分17个单元——1个基本多语言级别(包括了经典的unicode代码)和16个附加级别(包括了辅助字符)

代码单元(code unit):一个16位的字符称为一个代码单元,可以是基本多语言级别中的,也可以是附加级别中的。

基本多语言级别中,一个代码单元就可以表示一个代码点;而附加级别中,连续的两个代码单元才可以表示一个代码点。

U+D800~ U+DBFF用于第一个代码单元,U+DC00 ~ U+DFFF用于第二个代码单元

两个单元都是4*16*16,合起来刚好是2048   1024*1024=100万

基本多语言级别的65536个数值中,刚好空出这2048个字符用来表示附加级别,所以可以根据代码单元的值判断出来他是基本多语言级别的代码单元——也即代码点,还是附加级别中的第一个代码单元还是第二个代码单元。

Java中char类型使用UTF-16来描述一个代码单元。所以强烈建议不要在程序中使用char类型,除非确实要对UTF-16代码单元进行操作。也就是说char类型其实代表了一个代码单元,如果是基本多语言级别,那么侥幸地可以得到一个代码点,也就是一个正常的字符,但是如果是附加级别中的代码单元,那就无法得到你想要的东西。

charAt(index)  代表第index个代码单元

CodePointAt(index)代表第index个代码点

 

Boolean和整型之间不能进行转换。

变量名必须是以字母开头的由字母或数字组成的序列。

字母:a~z A~Z _ 以及在某种语言中代表字母的任何Unicode字符。

数字: 1~9 以及在某种语言中代表数字的任何Unicode字符。

但要排除+ @等一些特殊字符,也不能是关键字、保留字

 

要想判断是否是合法的字母,可以使用

Character.isJavaIdentifierStart(),isJavaIdentifierPart()

 

Double类型使用64位存储一个double值(运算的中间结果),而有的处理器使用80位浮点寄存器,增加了中间结果的精度。默认情况下虚拟机允许使用扩展精度(允许使用扩展指数,但不允许使用扩展尾数———截断尾数不损失性能)。但是对于严格需要精度的可以在方法上加上strictfp关键字,如果在类上加strictfp那么类中的所有方法都默认使用严格浮点计算。

如果math计算为了得到一致结果,那么需要使用StrictMath。

 

无符号右移  >>>   0填充高位

带符号右移    >>    符号位填充高位

左移(只有一个左移)   <<

移位的位数如果超过数值最长位数,需要求模后再移位。

例如:1<<35——1<(35%32)——1<<3

如果是long型需要对64求模

 

数值类型默认转换:

If(有double){

       都转double

}elseif(有float){

       都转float

}elseif(有long){

       都转long

}else{

       转int

}

 

强制类型转换

像round之后的值仍然不是int,要想当int使用也要强转。

超出数据类型长度的强转,(byte)300得到的结果是44,相当于对最大范围求模300%256

 

枚举类型的变量只能存贮声明的枚举值或者null,而不能是其他。枚举的比较相等使用==等号,而不用equal。

Substring(1,5) 

字符串的起始位置是0,从0开始的

Substring的第二个参数代表不想复制的第一个位置。

这样有一个优点,方便计算子串的长度5-1=4


String是不可变字符串。优点是:编译器可以让字符串共享。

Java设计者认为共享带来的高效率要远远胜过提取、拼接字符串带来的低效率。

 

1.New出来的Sting不共享

2.字符串函数得出的不是静态字符串,不共享

3.加号得到的字符串分两种:

第一种   “he”+ “llo” == “hello”  true  除非编译时就作为静态变量的才共享,其他都不共享

第二种    a=he”  a+llo”== “hello” false  编译时无法确定的,不能共享

 

读取输入

Scanners = new Scanner(System.in);

Stringline = s.nextLine();

Inti = s.nextInt();


对于密码的读取,console每次只能读取一行,没有上边方便,也没那么多方法,但是读取密码不可见,安全

Consolecon = System.console();

Stringname = con.readLine(“username   :”);

Char[]password = con.readPassword(“password  :”);

 

采用java命令行启动程序时,可以利用重定向将任意文件绑定到输入和输出

JavaHelloWorld < a.txt > b.txt

<  a.txt  输入文件    > b.txt输出文件

 

Switch语句将从与选项值相匹配的地方开始执行,直到遇到break或者执行到switch语句的结束。如果没有匹配的case,遇到default时执行default。

Case必须是整数(或者可以自动转换成整数的类型byteshort int char)或者枚举型,但是不能是字符串,貌似java7开始支持字符串了。


Java中支持带标签的break和continue,标签即在循环开始前写上tagName加上冒号,  tagName:

 

数组的拷贝  arrays.copyOf和System.arrayCopy

你可能感兴趣的:(Core Java笔记——第3章)