Java基本程序设计结构

277 阅读6分钟

Java基本程序设计结构

数据类型

  • 在Java中,整型的范围与运行Java代码的机器无关,这就保证了Java的可移植性。
  • 长整型数值有一个后缀L或l(如40000000L)。十六进制数值有一个前缀0x或0X(如0xCAFE)。八进制有一个前缀0,例如010对应八进制中的8。
  • 从Java7开始,加上前缀0b或者0B就可以写二进制数。例如0b1001就是9。另外,同样从Java7开始,还可以为数字字面量加下划线,如用1_000_000(或0b1111_0100_0010_0100_0000)表示一百万。这些下划线只是为了让人更易读。Java编译器会去除这些下划线。
int c = 0b1001;
int c1 = 3_1;
System.out.println(c);    //输出9
System.out.println(c1);  //输出31
  • 绝大部分应用程序都采用double类型,只有很少的情况适合使用float类型。float类型的数值有一个后缀F或f(例如3.14F)。没有后缀的浮点数值(如3.14)默认是double类型。
  • 浮点数溢出和出错情况的三个特殊的浮点数值:正无穷大、负无穷大、NaN(不是一个数字)。例如,一个正整数除以0的结果就是正无穷大。计算0/0或者负数的平方根结果为NaN。:常量Double.POSITIVE_INFINITY、Double.NEGATIVE_INFINITY和Double.NaN。
if(Double.isNaN(x))          //check whether x is "not a number"
  • char类型原本用于表示单个字符。不过,现在情况已经有所变化。如今,有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。
  • 位运算符:处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码技术得到整数中的各个位。位运算符包括:
&("and")  |("or")   ^("xor")  ~("not")
  • 枚举类型:
enum Size{SMALL, MEDIUM, LARGE};
Size s = Size.MEDIUM;

字符串

子串

子串:String类的substring方法可以从一个较大的字符串提取出一个子串。

String greeting = "Hello";
String s = greeting.substring(0, 3);     //获取"Hel"

拼接

Java语言与绝大多数语言一样,允许使用 + 号拼接两个字符串。 如果要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法

不可变字符串

String类没有提供修改字符串的方法。如果希望修改,首先提取需要的字符,然后再拼接上替换的字符串。

greeting = greeting.substring(0,3) + "p!";

检测字符串是否相等

可以使用equals方法检测两个字符串是否相等。

s.equals(t)
s.equalsIgnoreCase("hello")    //忽略大小写比较

一定不要使用==运算符检测两个字符串是否相等!这个运算符只能确定两个字符串是否放在同一个位置上。

空串和Null串

空串""是长度为0的字符串。可以调用以下代码检查一个字符串是否为空:

if(str.length() == 0)
或 if(str.equals(""))

空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,null。表示目前没有任何对象与该变量关联。检查一个字符串是否为null:

if(str == null)

有时要检查一个字符串既不是空串也不是null

if(str != null && str.length() != 0)  //首先要检查不为null。如果在null值上调用方法,会出现错误。

构建字符串

有时,需要由较短的字符串构建字符串。采用字符串连接的方式达到此目的效率比较低。每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类可以避免这个问题。

:在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer,其效率稍低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑(大部分时候),应该用StringBuilder替代它。这两个类的API是相同的

大数值

如果基本的整数和浮点数精度不能满足需求,那么可以使用java.math包中的两个很有用的类:BigInteger和BigDecimal。这两个类可以包含任意长度数字序列的数值。BigInteger类实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

使用静态的valueOf方法可以将普通数值转换为大数值:

BigInteger a = BigInteger.valueOf(100);

遗憾的是,不能使用人们熟悉的算术运算符(如: + 和 *)处理大数值。而需要使用大数值中的add和multiply方法。(减:subtract; 除: divide)

BigInteger c = a.add(b);          //  c = a + b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2)));      // d = c * (b + 2)

数组

在声明数组变量时,需要指出数组类型(数据元素类型紧跟[])和数组变量的名字。下面声明了整型数组a:

int[] a;

不过这条语句只声明了变量a,并没有将a初始化为一个真正的数组。应该使用new 运算符创建数组。

int[] a = new int[100];

数组初始化以及匿名数组

在Java中,提供了一种创建数组对象并同时赋予初始值的简化书写形式。下面是一个例子:

int[] smallPrimes = {2,3,5,7,11,13};   //在使用这种语句时,不需要调用new。

甚至还可以初始化一个匿名的数组:

new int[]{17,19,23,29,31,37};

这种表示法将创建一个新数组并利用括号中提供的值进行初始化,数组的大小就是初始值的个数。使用这种语法形式可以在不创建新变量的情况下重新初始化一个数组。例如:

smallPrimes = new int[]{17,19,23,29,31,37};

这是下列语句的简写形式:

int[] annoymous = {17,19,23,29,31,37};
smallPrimes = annoymous;

数组拷贝

在Java中,允许将数组变量拷贝给另一个数组变量。这时,两个变量将引用同一个数组:

int[] luckyNumbers = smallPrimes;
luckyNumbers[5] = 12;    // now smallPrimes[5] is also 12

如果希望将一个数组的所有值拷贝到一个新的数组中去,就要使用Arrays类的copyOf方法:

int[] copiedLuckyNumbers = Arrays.copyOf(luckyNubers, luckyNumbers.length);

第二个参数是新数组的长度。这个方法通常用来增加数组的大小:

luckyNumbers = Arrays.copyOf(luckyNumbers, 2 * luckyNumbers.length);

如果数组元素是数值型,那么多余的元素将被赋值为0;如果数组元素是布尔型,则将赋值为false。相反,如果长度小于原始数组的长度,则只拷贝最前面的数组元素。

多维数组

在Java中,声明一个二维数组相当简单。例如:

double[][] balances;

与一维数组一样,在调用new对多维数组进行初始化之前不能使用它。在这里可以这样初始化:

balances = new double[NYEARS][NRATES];

不规则数组

Java实际上没有多维数组,只有一维数组。多维数组被解释为“数组的数组”。 下面构建一个三角形的不规则矩阵数组:

int[][] odds = new int[NMAX+1][];
for(int n = 0; n <= NMAX; n++){
    odds[n] = new int[n + 1];
}