java核心技术第3章
第三章:
main方法必须是public的
有八种基本类型:
Java整形:
类型 | 存储需求 | 取值范围 |
int | 4字节 | -2147483648~2147483647(正好超过20亿) |
short | 2字节 | -32768~32767 |
long | 8字节 | -9223372036854775808~9223372036854775807 |
byte | 1字节 | -128~127 |
java整形取值范围与机器
长整形以L结尾,十六进制以0x为前缀,八进制以0为前缀,java7以后,以0b为前缀的数是二进制数
java中无无符号类型unsigned
Java浮点型:
类型 | 存储需求 | 取值范围 |
float | 4字节 | 大约±3.40282347E+38F(有效位数6~7位) |
double | 8字节 | 大约 ±1.79769313486231570E+308(有效位数为15位) |
double表示这种类型的数值精度是float的两倍。绝大多数应用使用double
float类型数后有后缀F(3.14F),无后缀或后缀为D表示double类型。
char类型:
char类型用于表示单个字符,通常用于表示字符常量。例如:'A'是编码为65所对应的字符常量。
在Unicode标准中,代码点采用16进制书写,并加上前缀U+。例:U+0041表示字母A的代码点。
Unicode代码点分为17个代码级别。第一个代码级别称为基本的多语言级别,代码点从U+0000到U+FFFF,其余的16个附加级别,代码点从U+10000到U+10FFF,其中包括一些辅助字符。
Java使用UTF-16。在基本的多语言级别中,每个字符用16位表示,通常称为代码单元。而辅助字符采用一对连续的代码单元进行编码。这样构成的编码值一定落入基本的多语言级别中空闲的2048个字节内,通常被称为替代区域。使用这种方法可以迅速的知道是一个字符的编码,还是一个辅助字符的第一或第二部分。
boolean类型:
boolean类型有两个值:false和true。整型值和布尔值之间不能进行互相转换。
变量:
声明一个变量后,必须用赋值语句对变量进行显示初始化,千万不要使用未被初始化的变量。
常量:
在Java中,利用关键字final指示常量。
关键字final表示这个变量只能被赋值一次,一旦被赋值后就不能再更改了。习惯上,常量名使用大写。
运算符:
虚拟机设计者允许将中间计算结果采用扩展精度。但是,对于使用strictfp关键字标记的方法必须使用严格的浮点计算来产生理想的计算结果。例如:
public static strictfp void main(String[] args)
位运算符:
对移位运算符右侧的参数需要进行模32的运算(除非左边的操作数是long类型,此时需要进行模64的运算)。例如:1<<35与1<<3或8是相同的。
数值类型之间的转换:
char
|
byte——short——int——long
float——double
以上转换无精度损失
其他几种转换:
int或long转float,可能有精度损失
int转double无精度损失
long转double可能存在精度损失
以上转换可以自动进行
强制类型转换:
必要时int可以自动转换为double,若double需要转换为int需要通过强制类型转换(cast)实现这个操作。可能会丢失一些信息。
例:double x = 90997 ; int nx = (int) x ;
如果想对浮点数进行舍入运算,需要使用Math.round方法
double x = 9.997 ;
int nx = (int)Math.round(x) ;
由于Math.round()返回的是long类型,long类型转换为int需要强制转换。
强制转换,若超出范围则会截断:
例:(byte)300的实际值是44.
字符串:
String类没有提供修改字符串的方法。
String greeting = "hello" ;
将greeting修改为"Help!"
greeting = greeting.substring(0, 3) + "p!" ;
检测字符串是否相等:
s.equals(t)
如果s与t相等返回true,否则返回false。
s,t可以为字符串变量,也可以为字符串常量。如:"Help!".equals(greeting)
不区分大小写使用:equalsIgnoreCase。
equals用于检测两个字符串内容是否相同,==用于判断两个字符串是否放在同一位置,若放在同一位置返回true。
输入:
Scanner in = new Scanner(System.in) ;
读取一行 : String name = in.nextline() ;
读取一个单词: String firstName = in.next() ;
读取一个整数:int age = in.nextInt() ;
Java6 :读取密码
Console cons = System.console() ;
String username = cons.readline("User name:") ;
char[] passwd = cons.readPasswd("Passwd") ;
格式化输出:
System.out.printf("%8.2f",x) 8个字符宽度,小数点后2位小数。位数不足,左边补空格。
块作用域:
不能再嵌套的两个块中声明同名的变量。类的域变量可以和方法块中的变量重名。
大数值:
如果基本的整数和浮点数精度不能够满足要求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以处理包含任意长度数字序列的数值。
使用静态方法valueof实现转换:
BigInteger a = BigInteger.valueof(100) ;
不能使用常用的算术运算符进行大数值的运算。而是需要使用大数值中提供的方法:
BigInteger c = a.add(b) ;
BigIteger d = c.mutiply(b.add(BigInteger.valueof(2))) ;
除法为:divide
取模为:mod
这几种方法返回的都是BigInteger类型。
数组:
声明数组:
int[] a ;
int a[] ;
Java 习惯于第一种
int[] a = new int[100] ;
创建一个数字数组时,所有的元素都初始化为0。boolean数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值null。
String[] names = new String[10] ;
for each循环:
for each循环使用比较方便。
for(variable : collection) statement
例:
for(int element : a)
System.out.println(element) ;
更简洁的打印数组元素方法:
System.out.println(Arrays.toString(a)) ;
数组初始化及匿名数组:
int[] smallPimes = {2, 3, 5, 7, 11, 13} ;
初始化匿名数组:
new int[]{17, 19, 23, 29, 31, 37}
数组大小就是初始值的大小
smallPrimes = new int[]{17, 19, 23, 29, 31, 37} ;
等同于:
int[] anonymous = {17, 19, 23, 29, 31, 37} ;
smallPrimes = anonymous ;
数组拷贝:
在Java中,允许将一个数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组:
int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12 ;
讲一个数组所有值拷贝到一个新的数组中去:
int[] copiedLuckyNumbers = Arrays.copyof(luckyNumbers, luckyNumbers.length) ;第二个参数是新数组的长度。这个方法通常用来增加数组的大小:
luckyNumbers = Arrays.copyof(luckyNumbers, 2*luckyNumbers.length) ;
如果数组元素是数值型,多余的元素将被赋值为0.如果为布尔型,将会赋值为false。如果长度小于原始数组长度,则只拷贝最前面的数组元素。
数组排序:
int[] a = int[1000] ;
Arrays.sort(a) ;
多维数组:
for each不能自动处理二维数组的每一个元素。要想访问二维数组a的所有元素,需要使用两个嵌套的循环。
Java实际上没有多维数组,只有一维数组。多维数组被解释为”数组的数组。“
例:
int[][] odds = new int[MAX+1][] ;
for(int n = 0 ; n <= MAX; n++)
odds[n] = new int[n+1] ;