java 核心技术卷I学习记录(二)
3.6 字符串
String的 例如取字串,拼接字符串等基础操作在这里不再记录
注意事项:
java 文档 中将String称为是不可变字符串,如“Hello”永远包字符H,e,l,l和o的代码元序列,而不能修改其中的任何一个字符。不可变字符串有一个优点:编译器可以让字符串共享。可以想象将各种字符串存放在公共的存储池中。字符串变量指向存储池中相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。
//字符串的拼接
String string = "Hello";
String string3 = new String(string);//新建String实例,虽然内容一样,但是在内存重新开辟了空间!
String string4 = string;//将string复制给string4,没有为string4开辟空间,两个变量指向相同的地址
String string2 = string.substring(0,3);//字符串截取之后得到的新的字符串肯定要重新开辟空间
System.out.println("string:"+System.identityHashCode(string));
string = "world";
System.out.println("string2:"+System.identityHashCode(string2));
System.out.println("string3:"+System.identityHashCode(string3));
System.out.println("string4:"+System.identityHashCode(string4));
System.out.println("string:"+System.identityHashCode(string));
输出结果为:
代码点(Code Point)和代码单元(Code Unit)
代码点(Code Point):Unicode是属于编码字符集(CCS)的范围。Unicode所做的事情就是将我们需要表示的字符表中的每个字符映射成一个数字,这个数字被称为相应字符的码点(code point)。例如“严”字在Unicode中对应的码点是U+0x4E25。
代码点是字符集被编码后出现的概念。字符集(Code Set)是一个集合,集合中的元素就是字符,比如ASCII字符集,其中的字符就是’A’、'B’等字符。为了在计算机中处理字符集,必须把字符集数字化,就是给字符集中的每一个字符一个编号,计算机程序中要用字符,直接用这个编号就可以了。于是就出现了编码后的字符集,叫做编码字符集(Coded Code Set)。编码字符集中每一个字符都和一个编号对应。那么这个编号就是代码点(Code Point)。
代码单元(Code Unit):是指一个已编码的文本中具有最短的比特组合的单元。对于UTF-8来说,代码单元是8比特长;对于UTF-16来说,代码单元是16比特长。换一种说法就是UTF-8的是以一个字节为最小单位的,UTF-16是以两个字节为最小单位的。
代码单元是把代码点存放到计算机后出现的概念。一个字符集,比如有10个字符,每一个字符从0到9依次编码。那么代码点就是0、1、。。。、9。为了在计算机中存储这10个代代码点,一个代码点给一个字节,那么这里的一个字节就是一个代码单元。比如Unicode是一个编码字符集,其中有65536个字符,代码点依次为0、1、2、。。。、65535,为了在计算机中表示这些代码点就出现了代码单元,65536个代码点为了统一表示每个代码点必须要有两个字节表示才行。但是为了节省空间0-127的ASCII码就可以不用两个字节来表示,只需要一个字节,于是不同的表示方案就形成了不同的编码方案,比如utf-8、utf-16等。对utf-8而言代码单元就是一个字节,对utf-16而言代码单元就是两个字节。
String 的相关API请查阅开发文档,这里不再赘述。
StringBuilder 构建字符串
如果需要用许多小段的字符串构建一个字符串,应该按照下列步骤进行!
StringBuilder builder = new StringBuilder();
builder.append('a');
builder.append("bbb");
String completedString = builder.toString();
System.out.println(completedString);
StringBuilder的详细API用法可以去查阅java开发文档
3.7 输入输出
控制台输入输出
Scanner in = new Scanner(System.in);
String nameString = in.nextLine();
int age = in.nextInt();
Console console = System.console();
String usernameString = console.readLine();
char[] passwd = console.readPassword();
ouble x = 10000.0 / 3.0;
System.out.print(x);
System.out.printf("%8.2f", x);
System.out.printf("%,.2f", 10000.0/3.0);
String message = String.format("Hello %s.next year, you will be %d", "zhaozhen",23);
System.out.println(message);
System.out.println(System.out.printf("%tc", new Date()));
printf方法的说明符语法图
switch语句:
switch(choice):
{
case 1:
break;
case 2:
break;
...
case n:
break;
default:
break;
}
case 标签可以是:
- 类型为char,byte,short或者int的常量表达式
- 枚举常量
- 从java se 7 开始,case 标签还可以是字符串
3.9 大数值
- BigInteger 任意长度的整数运算
- BigDecimal 任意长度的浮点数运算
BigInteger a = BigInteger.valueof(100)//将普通的数值转换为大数值
BigInteger c = a.add(b) //c = a+b
BigInteger d = c.multiply(b.add(BigInteger.valueOf(2))) // d = c*(b+2)
之所以使用add,multiply等进行运算,主要是java不能像又++那样对运算符进行重载。只为字符串的连接提供了+
重载。
BigInteger和BigDecimal 的详细API可查阅开发文档
3.10 数组
创建数组
int[] a;//声明
int a[]; //声明
int[] a = new int [100];//初始化
注意:
- 创建一个数字数组时,所有的元素都初始化为0
- boolean数组的元素会初始化为false。
- 对象数组的元素则初始化 为null
- 一旦创建了数组,就不能再改变它的大小。array list可以