入门
一个简单的Java程序
public class FirstSample{
public static void main(String[] args){
System.out.println("We will not use 'Hello world'!");
}
}
一个简单的Java程序如上。
关键字public
称为访问修饰符,它用于控制程序的其他部分对这段代码的访问级别。
关键字class
表明Java程序中的所有内容都包含在类中,其后紧跟类名。
类名的标准命名规范是:以大写字母开头的名词,以及驼峰命名法。
源代码的文件名必须和公共类的名字相同,并使用.java作为扩展名。
根据Java语言规范,main
方法必须声明为public
。
花括号表示方法体的开始和结束。
注释
Java中有三种注释:
-
//
。双斜杠表示单行注释。 -
/* */
表示块状注释。 -
/** */
可以用来自动地生成文档。
数据类型
Java是一种强类型语言,必须为每一个变量声明一种类型。
一共有8种基本类型,其中有四种整形、两种浮点型、一种表示字符编码的char、和一种布尔值boolean。
整形
-
int
4字节 -
short
2字节 -
long
8字节 -
byte
1字节
一般而言,int
最常用。但是如果表示星球上的居住人数,就需要使用long
类型了。
byte
和short
类型主要用于特定是应用场合,例如底层的文件处理或者需要控制占用储存空间量的大数组。
在Java中,整形的范围与运行Java代码的机器码无关,这就避免了不同平台或者不同操作系统之间的诸多问题。
long
类型数值有一个后缀L
,十六进制有前缀0x
,八进制只有一个前缀0
。因为八进制易混淆,建议不要使用八进制常数。
Java7添加了二进制前缀0b
。
浮点类型
-
float
4字节 -
double
8字节
大部分应用程序都采用double
类型。
float
有一个后缀F,如果没有后缀默认为double
类型。
char类型
char
类型用于表示单个字符。通常用来表示字符常量。
建议不要在程序中使用char
类型,除非确实需要对UTF-16代码单元进行操作。最好将需要处理的字符串用抽象数据类型表示。
boolean类型
用于表示true
和flase
。
变量
数学函数与常量
关键字final
可以用于声明常量,被声明的常量只能被赋值一次。
Math类提供了一些常用的数学函数,如三角函数、舍入、对数等。
数值类型之间的转换
在程序运行时,经常需要将一种数值类型转换为另一种。
强制转换可以通过(int)123.4
这样的方式进行,这样会将小数点后的数字全部舍去。
字符串
子串
String
类的subString
方法可以从一个较大的字符串中提取出一个子串。
String s = s.subString(0,3)
取出的就是前三个字符。
拼接
Java语言允许使用+号链接两个字符串。
字符串与一个非字符串的值进行凭借时,后者被转换成字符串。
不可变字符串
String
类没有提供用于修改字符串的方法,如果希望将字符串的内容修改,不能直接修改字符串当前位置的字符。
只能用subString
和+
来拼接。
检测字符串是否相等
String
类给出了equals
方法可以判断两个字符串是否相等,返回布尔值。
注意不要用==
运算符进行字符串比较。
空串与Null串
空串是长度为0的字符串,可以用equals
方法检查是否为空。
空串是一个Java对象,有自己的串长度和内容。
不过String
还可以放一个特殊的值:Null
。
字符串API
String
类包含了50多个方法,绝大多数都很有用。
int codePointAt(int index) //返回给定位置开始的代码点。
int compareTo(String other) //按照字典序比较,相当于C语言的strcmp方法。
boolean endWith(String suffix) //检查字符串尾是否是suffix。
boolean equals(String other) //判断两字符串是否相同。
boolean equalsIgnoreCase(String other) //忽略大小写。
int indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex)
//返回与字符串str或代码点cp匹配的第一个字符串的开始位置。这个位置从索引0或者fromIndex开始计算。
int length() //返回长度。
int codePointCount(int startIndex, int endIndex) //返回代码点数量。
String replace(CharSequence oldString, CharSequence newString)
//返回一个新字符串,这个字符串用newString替换了所有oldString。
String subString(int beginIndex)
String subString(int beginIndex, int endIndex)
//返回子串。
String toLowerCase()
String toUpperCase()
//大小写替换。
String trim()
//删除头尾的空格并返回。
字符串构建器
有时候需要用较短的字符串构建字符串,可以利用StringBuilder
提高效率。
StringBuilder builder = new StringBuilder();
builder.append(ch);
builder.append(str);
在需要构建字符串时就调用toString
方法,就可以得到当前构造器中的字符序列。
输入输出
读取输入
标准输入流使用Scanner
对象。
Scanner in = new Scanner(System.in);
System.out.print("what is your name?");
String name = in.nextLine();
//这里使用nextLine是因为输入有可能包含空格。
//想要读取一个单词的话可以使用`next`方法。
String firstName = in.Next();
System.out.print("How old are you?");
int age = in.nextInt();
因为输入是可见的,所以Scanner
不适合用来读取密码。
Console
可以解决这个问题。
Console cons = System.console();
String username = cons.readLine("User name: ");
char[] passwd = cons.readPassword("Password: ");
为了安全,返回的密码保存在一个一维字符数组中,处理之后应当马上用一个填充值覆盖数组元素。
大数值
如果基本的整数和浮点数进度不能够满足需求,那么可以使用java.math
中的两个很有用的类:BigInteger
和BigDecimal
。
这两个类可以处理包含任意长度数字序列的数值。
使用静态的valueOf
方法可以将普通的数值转换为大数值。
不过不能用熟悉的算术运算符来处理大数值,只能用add
和multiply
方法。
BigInteger add(BigInteger other)
BigInteger subtract(BigInteger other)
BigInteger multiply(BigInteger other)
BigInteger divide(BigInteger other)
BigInteger mod(BigInteger other)
int compareTo(BigInteger other) // 比较
static BigInteger valueOf(long x)
数组
特性
对于数组,有另一种更加简洁的遍历方法。
for (int i: a)
想要打印数组可以通过toString
方法来转成字符串进行输出。
初始化、匿名数组
int[] a = { 1, 2, 3, 4, 5 };
int[] a = new int[] { 1, 2, 3, 4, 5 };
数组拷贝
int [] b = a;
a[5] = 12;
这样是传入了引用,修改a中的值,b中的值同样也被修改了。
要拷贝值的话可以使用Arrays
类的copyOf
方法。
int[] a = Arrays.copyOf(b, b.length);
第二个参数是新数组的长度,也可以用来增加数组的大小。
a = Arrays.copyOf(a, 2 * a.length);
数组排序与查找
排序可以使用Arrays
类的sort
方法。
这个方法使用了优化的快速排序算法。
查找可以使用Arrays
类的binarySearch
方法。
这个方法使用了二分搜索算法来查找值v。如果查找成功,返回相应的下标,否则返回负值。