3.3数据类型:
java是一种强类型语言。这意味着要为每一个变量声明一种类型。
8种基本类型,4种整型(byte、short、int、long),2种浮点型(float、double)、1种字符类型(char)和1种表示真值的boolean类型。
byte 1字节 -128~127
short 2字节
int 4字节
long 8字节
整型的范围与Java代码的机器无关,这就解决了软件从一个平台移植到另一平台,或者在同一平台中的不同操作系统之间进行移植给程序员带来的诸多问题。Java程序保证所有机器上能够得到相同的运行结果,所以各种数据类型的取值范围必须固定。
长整型数值有一个后缀L或l
十六进制数值有一个前缀0x或0X
八进制有一个前缀0
Java7开始,加上0b或0B就可以写二进制
float 4字节 float数值有一个后缀F或f 没有F的浮点值默认是double
double 8字节 可以添加后缀D或d
boolean ( 布尔 ) 类型有两个值 : false 和 true , 用来判定逻辑条件整型值和布尔值之间不能进行相互转换。
if ( x = 0 ) / / oops . .. meant x = 0
在 C + + 中这个测试可以编译运行,其结果总是 false : 而在 Java 中 , 这个测试将不能通过编译, 其原因是整数表达式 x = 0 不能转换为布尔值 。
3.4变量:
变量初始化,声明变量之后,必须用赋值语句对变量进行显示初始化,千万不要使用未初始化的变量,否则编译器报错。
常量,使用关键字final指示常量。 final double CM = 2.54;
关键字final表示这个变量只能被赋值一次。一旦赋值就不能更改,常量名使用全大写。
在 Java 中, 经常希望某个常量可以在一个类中的多个方法中使用 通常将这些常量称为类常量。可以使用关键字 static final设置一个类常量 。 下面是使用类常量的示例 :
public class Constants
{
public static final double CM _ PER _ INCH = 2.54 ;
public static void main ( Stringn args )
{
double paperWidth = 8.5 ;
double paperHeight = 11 ;
System . out . println ( " Paper size in centimeters : "
+ paperWidth * CMJERJNCH +
by " + paperHeight * CM _ PER _ INCH ) ;
}
}
3.5.2数值类型之间的转换
• 如果两个操作数中有一个是 double类型 , 另一个操作数就会转换为 double 类型。
• 否则 , 如果其中一个操作数是 float 类型 , 另一个操作数将会转换为 float 类型 。
• 否则 ,如果其中一个操作数是 long 类型, 另一个操作数将会转换为 long 类型 。
• 否则 , 两个操作数都将被转换为 int 类型 。
强制类型转换的语法格式是在圆括号中给出想要转换的目标类型 , 后面紧跟待转换的变量名 。
3.5.9枚举类型
变量的取值只在一个有限的集合内。
enum Size { SMALL , MEDIUM , LARGE , EXTRA . LARCE };
Size s = Size.MEDIUM;
Size 类型的变量只能存储这个类型声明中给定的某个枚举值 , 或者 null 值 , null 表示这个变量没有设置任何值。
3.6字符串
每个双引号括起来的字符串都是String类的一个实例。
3.6.1子串 substring方法
String greeting = " Hello " ;
String s = greeting . substring (0 , 3 ) ;
创建了一个由字符 “ Hel ” 组成的字符串
3.6.2拼接 +
当将一个字符串与一个非字符串的值进行拼接时, 后者被转换成字符串
如果需要把多个字符串放在一起 , 用一个定界符分隔, 可以使用静态 join 方法 :
String all = String . join ( " / " , " S " , " M " , " L " , " XL " ) ;/ / all is the string " S / H / L / XL
3.6.3不可变字符串
String 类没有提供用于修改字符串的方法 , 如果希望将 greeting 的内容修改为 “ Help ! ” ,不能直接地将 greeting 的最后两个位置的字符修改为‘p ’ 和‘!、 如何修改这个字符串呢 ?首先提取需要的字符 , 然后再拼接上替换的字符串 :
greeting = greeting . substring ( 0 , 3 ) + " p ! " ;
上面这条语句将 greeting 当前值修改为 “ Help ! ” 。
由于不能修改 Java 字符串中的字符 , 所以在 Java 文档中将 String 类对象称为不可变字符串 , 如同数字 3 永远是数字 3 — 样 , 字符串 “ Hello ” 永远包含字符 H 、 e、 1 、 1 和o 的代码单元序列 , 而不能修改其中的任何一个字符。 当然 ,可以修改字符串变量 greeting, 让它引用另外一个字符串 , 这就如同可以将存放 3 的数值变量改成存放 4 一样。
这样做是否会降低运行效率呢 ? 看起来好像修改一个代码单元要比创建一个新字符串更加简洁。 答案是 : 也对 , 也不对 。 的确 , 通过拼接 “Hel ” 和 “ p ! ” 来创建一个新字符串的效率确实不高。 但是 , 不可变字符串却有一个优点 : 编译器可以让字符串共享 。
为了弄清具体的工作方式, 可以想象将各种字符串存放在公共的存储池中 。 字符串变量指向存储池中相应的位置
。 如果复制一个字符串变量 , 原始字符串与复制的字符串共享相同的字符。总而言之, Java 的设计者认为共享带来的高效率远远胜过于提取 、 拼接字符串所带来的低效率。
3.6.4检测字符串是否相等
equal
" Hello " . equals ( greeting);
equalsIgnoreCase不区分大小写
" Hello " . equalsIgnoreCase ( " hel 1 o "
一定不要使用 = 运算符检测两个字符串是否相等 ! 这个运算符只能够确定两个字串是否放置在同一个位置上 。 当然 , 如果字符串放置在同一个位置上 , 它们必然相等。 但是 ,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
String greeting = " Hello " ; / / initialize greeting to a string
if ( greeting = = " Hello " )...
// probably true
if ( greeting . substring ( 0 , 3 ) == " HeV ) . . .
/ / probably false
如果虚拟机始终将相同的字符串共享 , 就可以使用 = =运算符检测是否相等。 但实际上只有字符串常量是共享的, 而 + 或 substring等操作产生的结果并不是共享的。 因此 , 千万不要使甩 = = 运算符测试字符串的相等性 , 以免在程序中出现糟糕的 bug 。 从表面上看 , 这种bug 很像随机产生的间歇性错误 。
3.6.5空串和Null串
空串""是长度为0的字符串
可以调用以下代码检查一个字符串是否为空:
if ( str . length()= = 0 )或
if ( str . equals ( "" ) )
空串是一个 Java 对象 , 有自己的串长度 ( 0 ) 和内容 ( 空 )。 不过 , String
变量还可以存放一个特殊的值 , 名为 null , 这表示目前没有任何对象与该变量关联 。 要检查一个字符串是否为 null , 要使用以下条件 :
if ( str = = null )
有时要检查一个字符串既不是 null 也不为空串, 这种情况下就需要使用以下条件 :
if ( str ! = null & & str . length() ! = 0 )
首先要检查 str 不为 null。 在第4 章会看到,如果在一个 mill 值上调用方法 , 会出现错误。
3.6.9构建字符串
每次连接字符串,都会构建一个新的String对象,既耗时又浪费空间。使用StringBuilder避免这个问题。
如果需要用许多小段的字符串构建一个字符串 , 那么应该按照下列步骤进行 。 首先 , 构建一个空的字符串构建器 :
StringBuilder builder = new StringBuilderO ;
当每次需要添加一部分内容时 , 就调用 append 方法 。
builder . append ( ch ) ; / / appends a single character
bui 1 der . append ( str ) ; / / appends a string
在需要构建字符串时就凋用 toString 方法 , 将可以得到一个 String 对象 , 其中包含了构建器中的字符序列 。
String completedString = builder . toStringO ;
在 JDK 5.0 中引入 StringBuilder 类 。 这个类的前身是 StringBuffer ,其效率稍有些低,但允许采用多线程的方式执行添加或删除字符的操作 。 如果所有字符串在一个单线程中编辑 ( 通常都是这样 ),则应该用 StringBuilder 替代它 。 这两个类的 API是相同的 。
当使用的类不是定义在基本 java . lang 包中时 , 一定要使用import 指示字将相应的包加载进来 。
3.7.2格式化输出
System . out . pri ntf("%8.2f" , x );
可以使用静态的 String . format 方法创建一个格式化的字符串 , 而不打印输出 :
String message = String . format ( " Hello , % s . Next year , you ' ll be % d " , name , age ) ;
3.8.5多重选择:switch语句
switch 语句将从与选项值相匹配的 case 标签处开始执行直到遇到 break 语句, 或者执行到switch i 吾句的结束处为止。 如果没有相匹配的case 标签 , 而有 default 子句 , 就执行这个子句。
case 标签可以是 :
•类型为 char 、 byte、 short或 int 的常量表达式。
•枚举常量。
•从 Java SE 7 开始 , case 标签还可以是字符串字面量 。
例如 :
String input=...;
switch ( input . toLowerCaseO )
{
case " yes " : / / OK since Java SE 7
...
break ;
...
}
当在 switch 语句中使用枚举常量时, 不必在每个标签中指明枚举名 , 可以由 switch 的表达式值确定。 例如 :
Size sz = . . . ;
switch ( sz )
{
case SMALL : // no need to use Size . SMALL
...
break
...
}
3.10数组
创建一个数字数组时 , 所有元素都初始化为 0。 boolean 数组的元素会初始化为false。对象数组的元素则初始化为一个特殊值 null , 这表示这些元素 ( 还 ) 未存放任何对象。
String [ ] names = new String [ 10 ] ;
会创建一个包含 10 个字符串的数组 , 所有字符串都为 null。 如果希望这个数组包含空串 , 可以为元素指定空串 :
for ( int i = 0 ; i < 10 ; i + + ) names [i] = "";
要想获得数组中的元素个数, 可以使用 array . length 。
3.10.3数组拷贝
允许将一个数组变量拷贝给另一个数组变量。 这时 ,两个变量将引用同一 个数组。
如果希望将一个数组的所有值拷贝到一个新的数组中去 ,就要使用 Arrays 类的 copyOf 方法 :
int [ ] copiedLuckyNumbers = Arrays . copyOf ( luckyNumbers , luckyNumbers . length ) ;
第 2 个参数是新数组的长度 。 这个方法通常用来增加数组的大小 :
luckyNumbers = Arrays . copyOf ( luckyNumbers , 2 * luckyNumbers . length ) ;
如果数组元素是数值型, 那么多余的元素将被赋值为 0 ;如果数组元素是布尔型, 则将赋值为 false。 相反 , 如果长度小于原始数组的长度 , 则只拷贝最前面的数据元素 。
3.10.4命令行参数
每一个 Java 应用程序都有一个带 String arg []参数的 main 方法。 这个参数表明main 方法将接收一个字符串数组, 也就是命令行参数 。
例如 , 看一看下面这个程序 :
public class Message
{
public static void main ( String [ ] args )
{
if ( args . length == 0 11 args [ 0 ] . equals ( " - h " ) )
System . out . print("Hello , " ) ;
else if ( args [ 0 ] . equa 1 s ( " - g" ))
System . out . print ( " Goodbye , " ) ;
/ / print the other command - line arguments
for ( int i = 1 ; i < args . length ; i + + )
System . out . print ( " " + args [ i ] ) ;
System • out . println ( " ! " ) ;
}
}
如果使用下面这种形式运行这个程序 :
java Message - g cruel world
args 数组将包含下列内容 :
args [ 0 ]:"-g"
args [ l ]:
"cruel"
args [ 2 ]:"world"
这个程序将显示下列信息 :
Goodbye , cruel world