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方法的说明符语法图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFhnYQaJ-1618130033979)(https://raw.githubusercontent.com/zhaozhen197/my_markdown_img/master/20180917150030.png)]
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可以
for each 循环
语法格式为:
for (varibable : collection) statement
variable : 是定义的一个用于暂存集合中每一个元素。
collection : 一个数组或者是实现了Iterable接口的类对象(例如是ArrayList
for each 语句的好处就在于语法简洁,更不容易出错(不必为下标的起始值和终止值而操心)
数组初始化:
int[] smallPrimes = {2,3,4,5};
int intArray = new int[100];
new int[] = {17,19,21,23};//初始化一个匿名函数
smallPrimes = new int[] {7,8,9,10};//在不创建新变量的情况下重新初始化一个数组
注意: 在java中,是允许数组长度为0的。在编写一个结果为数组的方法时,如果碰巧结果为空,则这种语法形式就显得特别有用。此时可以创建一个长度为0的数组:
new elementType[0]
.但是要注意的是数组长度为0与null不同。
- 数组拷贝
int [] smallPrimes = {2,4,6,8,10};
int [] luckNumbers = smallPrimes;
以上代码中smallPrimes 和 luckNumbers 实际上是引用的是同一个数组。
如果在实际需求中真的需要将一个数组拷贝到一个新的数组中时,可以使用Arrays类的copyOf方法。那么以上代码就可以改写为:
luckNumbers = Arrays.copyOf(smallPrimes,smallPrimes.length)
,但是这个方法多用于拓展数组的大小。在使用时就是讲数组的长度变大就可以了,如果整形数组的话,那么多余的元素将会被赋值为0,如果数组元素是bool型则将被赋值为false。相反如果长度小于原始数组的长度,则只拷贝最前面的数据元素。
在java main 函数中都带一个String arg[]参数,是因为main方法要接收一个字符串数组,这个字符串数组就是命令行参数。在执行java程序是可以在后面添加参数,如java Message -g cruel world
,使用java命令执行Message 类,如果在main方法中输出args的内容时,就会发现args数组中包含args[0]:"-g“,args[2]:“cruel”,args[3]:"world"
- 数组排序
对数值型的数组排序时,可以使用Arrays类中的sort方法,sort方法是使用优化的快速排序算法。
int [] smallPrimes = {2,4,5,10,23,444};
Arrays.sort(smallPrimes);
for (int a: smallPrimes) {
System.out.println(a);
}
数组的相关API可去查阅java 开发文档
- 多维数组
多维数组在使用foreach 循环时,是按照行来处理的,所以要访问二维数组a的所有元素,需要使用两个嵌套循环。例如:
for (double[] row : a)
for (double value : row)
something to do
要想快速的打印一个二维数组的数据元素列表,可以使用 system.out.println(Arrays.deepToString(a))
假设有一个array[10][6]的数组,在使用double[][] array = new double[10][6]进行初始化时,java时分配了一个包含十个指针的数组,然后指针数组的每一个元素被填充了一个包含6个数字的数组