Java核心技术学习笔记

#Java的基本程序设计结构 ##3.3数据类型 java是强类型语言,每一个变量都必须声明一种类型。在java中一共有8种基本类型。4种整型:byte、short、int、long。 2种浮点类型:float、double。 double表示这种类型的数值精度是float类型的两倍(即双精度数值)。绝大多数情况下程序都采用double类型。float类型的精度很难满足需求,除非是需要单精度数据的库或者存储大量数据。 以及一种用于表示Unicode编码的字符类型char和一种表示真值的boolean类型。 ###3.4.2常量 在java中,利用关键字final指示常量。如

final double CM_PER_INCH = 2.54;

关键字final表示这个变量只能被赋值一次。一旦被赋值以后,就不能再更改了。习惯上,常量名使用全大写。 可以使用static final 设置一个类常量。即此常量可以在一个类的多个方法中使用。

public static final double CM_PER_INCH = 2.54;

需要注意的是类常量的定义位于main方法外部。因此,在同一个类的其他方法也可以使用这个常量。而且,如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。 ###3.5运算符 使用strictfp关键字标记的方法都必须采用严格的浮点数计算来生成计算结果。例如,可以把main方法标记为

public static strictfp void main(String[] args)

###3.5.1数学函数与常量 计算一个数值的平方根,可以使用sqrt方法:

double x = 4;
double y = Math.sqrt(x);
System.out.println(y);//结果应是2.0

在java中没有幂运算,因此需要借助于Math类的pow方法。

double y = Math.pow(x,a);

y的值为x的a次幂(x^a)。pow方法有两个double类型的参数,其返回结果也为double类型。 取余(rem)和取模(mod)在被除数、除数同号时,结果是等同的,异号时会有区别,所以要特别注意异号的情况。 余数在数学中的定义是始终大于等于0的,而对于某些编程语言的取余运算不是按照上面的定义来执行的,因此才会出现余数小于0的情况。在java中一般使用floorMod处理这种情况。

###3.5.2数值类型之间的转换 实心箭头表示无信息丢失的转换。虚线箭头表示可能有精度损失的转换。

###3.5.3强制类型转换

double x = 9.997;
int a = (int)x; //此时a = 9

强制类型转换通过截断小数部分将浮点数转换为整形。 如果想对浮点数进行舍入运算,需要使用Math.round方法:

double x = 9.997;
int a = (int)Math.round(a); //此时a = 10

如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。 不要在boolean类型与任何数值类型之间进行强制类型转换,这样很容易发生错误。只有极少数的情况才需要将布尔类型转换为数值类型,这时可以使用条件表达式 b? 1:0。

###3.5.9枚举类型 有时,变量的取值范围在一个有限的集合内。如销售的服装或奶茶只有中、大、超大这三种。 针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。如

enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};

现在可以声明这种类型的变量:

Size s = Size.EXTRA_LARGE;

Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值(表示这个变量没有设置任何值)。

##3.6字符串 java字符串就是Unicode字符序列。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,很自然地叫做String。

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

String greeting = "Hello";
String s = greeting.substring(0,3);

创建了一个由字符"Hel"组成的字符串。第二个参数是不想复制的第一个位置。

###3.6.2拼接 当将一个字符串与一个非字符串进行拼接时,后者将被转换为字符串(任何一个java对象都可以转换成字符串)。如:

int age = 13;
String rating = "PG" + age;//rating 为"PG13"

如果需要把多个字符串放在一起,用一个分界符分隔,可以使用静态join方法:

String all = String.join("/", "S", "M", "L", "XL");
//此时 all为"S/M/L/XL"

###3.6.3不可变字符串 String类没有提供用于修改字符串的方法。要想修改字符串,首先提取需要的字符,然后再拼接上替换的字符串:

greeting = greeting.substring(0, 3) + "p!";
//此时greeting 为"Help!"

由于不能修改java字符串中的字符,所以在java文档中将String类对象称为不可变字符串,如同数字3永远是3一样,字符串"Hello"永远包含字符H、e、l、l、和o的代码单元序列,而不能修改其中的任何一个字符。当然,可以修改字符串变量greeting,让它引用另外一个字符串。 不可变字符串的优点是: 编译器可以让字符串共享。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。 总之,java设计者认为共享带来的高效率要远远胜过拼接字符串所带来的低效率。

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

s.equals(t)
//字符串s与t相等,则返回true;否则返回false
"Hello".equals(greeting)
//也可以将字符串字面量与字符串变量相比较

如果想要不区分大小写地比较两个字符串是否相等,可以使用equalsIgnoreCase方法

"Hello".equalsIgnoreCase("hello")

一定不要用 == 运算符检测两个字符串是否相等。这个运算符只能够确定两个字符串是否放在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。

String greeting = "Hello"
if(greeting == "hello")
//ture
if(greeting.substring(0, 3) == "Hel")
//false

如果虚拟机始终将相同的字符串共享,就可以使用 == 运算符判断是否相等。但实际上,只有字符串常量是共享的,而 + 或substring等操作产生的结果并不是共享的。 因此,千万不要使用 == 运算符测试字符串的相等性。

###3.6.5空串与Null串 空串是长度为0的字符串

if(str.length == 0)
if(str.equal(""))
//这两种方式都可以检查一个字符串是否为空

空串是一个java对象,有自己的串长度(0)和内容(空)。不过还可以存放一个null的值,表示目前没有任何对象与之关联。

if(str != null && str.length() != 0)
//检查一个字符串既不是null也不为空串

###3.6.9构建字符串 使用StringBuilder类来构建字符串

String Builder builder = new StringBuilder();
//构建一个空的字符串构建器builder
builder.append(ch);
builder.append(str);
//当每次需要添加一部分内容,就调用append方法
String completedString = builder.toString();
//当需要构建字符串时就调用toString方法,将可以得到一个String对象,其中包含了构建器中的字符序列。

###3.7.1读取输入 要想通过控制台进行输入,首先需要构造一个Scanner对象,并与“标准输入流”System.in相关联。

Scanner in = new Scanner(System.in);

现在,可以使用Scanner类的各种方法实现输入操作了

System.out.print("what is your name?");
String name = in.nextLine();//读取输入的下一行内容

next方法可以读取单个单词,nextInt可以读取整数,nextDouble可以读取浮点数。

###3.9大数值 如果基本的整数和浮点数不能够满足需求,可以使用两个类:BigInteger和BigDecimal。前者实现任意精度的整数运算,后者实现了任意精度的浮点数运算。 使用静态的valueOf可以将普通的数值转化为大数值:

BigInteger a = BigInteger.valueOf(100);

不能使用算术运算符来处理大数值。需要使用大数值类中的add和multiply方法。

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

本文章使用limfx的vscode插件快速发布