“核心技术:基本程序设计结构”的版本间差异
跳到导航
跳到搜索
(→变量) |
(→运算符) |
||
第129行: | 第129行: | ||
== 运算符 == | == 运算符 == | ||
常用运算: | |||
# “+”:加 | |||
# “-”:减 | |||
# “*”:乘 | |||
# “/”:除 | |||
# “%”:取余(取模) | |||
* 使用“stricfp”关键字标记的方法、类,其中的所有指令都要使用严格的浮点计算;【?没用过】 | |||
=== 数学函数与常量 === | |||
* 使用java.lang.Math | |||
* 如果要得到一个完全可预测的结果,应该使用“StrictMath”【?】 | |||
Math 类中提供了各种数学函数: | |||
# 平方根:“double y = Math.sqrt(x);” | |||
# 幂运算:“double y = Math.pow(x, a);” | |||
# 三角函数: | |||
#: Math.sin | |||
#: Math.cos | |||
#: Math.tan | |||
#: Math.atan | |||
#: Math.atan2 | |||
# 指数函数、自然对数、以10为底的对数: | |||
#: Math.exp | |||
#: Math.log | |||
#: Math.log10 | |||
# 常量π、e的近似值:(近似值!) | |||
#: Math.PI | |||
#: Math.E | |||
=== 数值类型间的强制转换 === | |||
# 如果其中一个为double,则另一个会被转换为double; | |||
# 否则,如果如果其中一个为float,则另一个会被转换为float; | |||
# 否则,如果如果其中一个为long,则另一个会被转换为long; | |||
# 否则,两操作数都会被转换为int; | |||
=== 强制类型转换 === | |||
强制类型转换(cast):用于类似由double向int、float这类,可能会丢失信息的转换。<br/> | |||
如: | |||
<syntaxhighlight lang="java"> | |||
double x = 9.997; | |||
int nx = (int)x; | |||
</syntaxhighlight> | |||
如果需要对浮点数进行舍入运算,以便得到最接近的整数,则用“Math.round”(其返回值为long): | |||
<syntaxhighlight lang="java"> | |||
double x = 9.997; | |||
int nx = (int)Math.round(x); | |||
</syntaxhighlight> | |||
=== 关系运算 === | |||
# “<”:小于 | |||
# “>”:大于 | |||
# “<=”:小于等于 | |||
# “>=”:大于等于 | |||
# “&&”:逻辑与 | |||
# “||”:逻辑或 | |||
# “!”:逻辑非 | |||
# “?:”:三目运算 | |||
* “&&”、“||”是按照“短路”方式来求值的(即:如果第一个操作数能确定表达式的值,则不再计算第二个表达式) | |||
*: 如:“expression1 && expression2”:如果“expression1”为false,则不再计算“expression2” | |||
*: 如:“expression1 || expression2”:如果“expression1”为true,则不再计算“expression2” | |||
=== 位运算 === | |||
# “&”:and | |||
# “|”:or | |||
# “^”:xor(亦或,相同为真,相异为假) | |||
# “~”:not | |||
# “>>”:右移 | |||
# “<<”:左移 | |||
# “>>>”:用0填充高位 | |||
* 这些运算符,按照位模式处理;(把操作数的二进制数,按照从右至左,对每一位进行运算) | |||
* 移位运算符的右操作数要完成模32的运算(若左操作数为long,则右操作数模64)【???what???】 | |||
*: 如:“1<<35”等同于“1<<3”或8() | |||
*: 【猜测:对于4字节(32位)的类型来说,位移超过了32位,就会从另一侧出来(就像转动一个环?)】 | |||
=== 枚举类型 === | |||
枚举类型:用于取值在一个有限的集合范围内。 | |||
定义: | |||
<syntaxhighlight lang="java"> | |||
enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE}; | |||
</syntaxhighlight> | |||
声明: | |||
<syntaxhighlight lang="java"> | |||
Size s = Size.MEDIUM; | |||
</syntaxhighlight> | |||
== 字符串 == | == 字符串 == |
2020年10月16日 (五) 12:43的版本
数据类型
类型 | 存储需求 | 默认值 | 取值范围 |
---|---|---|---|
整型 | |||
int | 4字节 | 0 | -2 147 483 648 - 2 147 483 647
|
short | 2字节 | 0 | -32 768 - 32767
|
long | 8字节 | 0L | -9 223 372 036 854 775 808 - 9 223 372 036 854 775 807
|
byte | 1字节 | 0 | -128 - 127
|
浮点 | |||
float | 4字节 | 0.0f | 大约 +- 3.402 823 47E+38F(有效位数为6、7位)
|
double | 8字节 | 0.0d | 大约 +- 1.797 693 134 862 315 70E+308(有效位数为15位)
|
字符 | |||
char | 2字节 | 'u0000' | \u0000 - \uffff |
布尔 | |||
boolean | 1位 | false | true | false |
- 常量“Double.POSITIVE_INFINITY”、“Double.NEGATIVE_INFINITY”、“Double.NAN”分别表示“正无穷大”、“负无穷大”、“NaN(不是一个数字)”;
取值范围
- 整数用原码,负数用补码表示
以int为例,在java中占4字节,即32位:
- 其中第一位为符号位(0正,1负)
- 所以负数范围为:-2^31 = -2147483648
- 整数的范围为:2^31-1 = 2147483647 (减去全为0时的情况,0无正负)
即:-2147483648 - 2147483647 (-2^31 — 2^31-1)
关于0.2 + 0.1 不等于 0.3
使用自然类型计算小数的时候,会出现:“0.2+0.1=0.30000000000000004”,而“0.1+0.6=0.7”的情况:
其原因如下:
计算机存储、计算或者展示,都需要转换2进制。 在现实世界中,数字主要有整数和小数两种,整数包括正整数、负整数以及零。 计算机中表示整数的方式有很多,如原码、反码以及补码等。 在计算机中存储的整数则分为有符号数和无符号数。 对于无符号数,采用哪种编码方式都无所谓,对于有符号数的编码方式,常用的是补码。 那么,一个十进制数字想要获得其二进制的补码,需要先通过一定的算法得到他对应的原码。
- 十进制整数转换为二进制,可以采用“除2取余,逆序排列”,或者xxx法(列出“...128,64,32,26,8,4,2,1”,根据十进制数在对应位置1或0);
- 十进制小数转换为二进制:则采用“乘2取整,顺序排列”的方法;
如,0.625的二进制转换如下:
而0.1的二进制:
可以得知:0.1的二进制转换中出现了无限循环的情况,也就是(0.1)10 = (0.000110011001100…)2,而不能把0.1转换为确定的二进制数
即计算机无法用二进制精确的表示0.1
IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)
但仅是用近似值表示小数,并非真实值,如果使用float、double等类型进行小数计算,仍然会丢失数值。并没有解决问题。
所以:为了解决这样的精度问题,Java中提供了BigDecimal来进行精确运算。
- BigDecimal 并不是Java的数据类型,而是一个Java对象!
变量
- 变量名:以字母开头,并由字母和数字构成的序列;(字母包括:'A'-'Z'、'a'-'z'、'_'、'$'、'ä')
- 不能使用java保留字作为变量名;
- 变量名对大小写敏感;
常量
- java 中利用关键字“final”指示常量;(表示变量只能被赋值一次)
- 习惯上,常量名使用全大写;
- 如果需要某个常量在一个类的多个方法中使用,则将其设置为类常量,用“static final”修饰;
运算符
常用运算:
- “+”:加
- “-”:减
- “*”:乘
- “/”:除
- “%”:取余(取模)
- 使用“stricfp”关键字标记的方法、类,其中的所有指令都要使用严格的浮点计算;【?没用过】
数学函数与常量
- 使用java.lang.Math
- 如果要得到一个完全可预测的结果,应该使用“StrictMath”【?】
Math 类中提供了各种数学函数:
- 平方根:“double y = Math.sqrt(x);”
- 幂运算:“double y = Math.pow(x, a);”
- 三角函数:
- Math.sin
- Math.cos
- Math.tan
- Math.atan
- Math.atan2
- 指数函数、自然对数、以10为底的对数:
- Math.exp
- Math.log
- Math.log10
- 常量π、e的近似值:(近似值!)
- Math.PI
- Math.E
数值类型间的强制转换
- 如果其中一个为double,则另一个会被转换为double;
- 否则,如果如果其中一个为float,则另一个会被转换为float;
- 否则,如果如果其中一个为long,则另一个会被转换为long;
- 否则,两操作数都会被转换为int;
强制类型转换
强制类型转换(cast):用于类似由double向int、float这类,可能会丢失信息的转换。
如:
double x = 9.997;
int nx = (int)x;
如果需要对浮点数进行舍入运算,以便得到最接近的整数,则用“Math.round”(其返回值为long):
double x = 9.997;
int nx = (int)Math.round(x);
关系运算
- “<”:小于
- “>”:大于
- “<=”:小于等于
- “>=”:大于等于
- “&&”:逻辑与
- “||”:逻辑或
- “!”:逻辑非
- “?:”:三目运算
- “&&”、“||”是按照“短路”方式来求值的(即:如果第一个操作数能确定表达式的值,则不再计算第二个表达式)
- 如:“expression1 && expression2”:如果“expression1”为false,则不再计算“expression2”
- 如:“expression1 || expression2”:如果“expression1”为true,则不再计算“expression2”
位运算
- “&”:and
- “|”:or
- “^”:xor(亦或,相同为真,相异为假)
- “~”:not
- “>>”:右移
- “<<”:左移
- “>>>”:用0填充高位
- 这些运算符,按照位模式处理;(把操作数的二进制数,按照从右至左,对每一位进行运算)
- 移位运算符的右操作数要完成模32的运算(若左操作数为long,则右操作数模64)【???what???】
- 如:“1<<35”等同于“1<<3”或8()
- 【猜测:对于4字节(32位)的类型来说,位移超过了32位,就会从另一侧出来(就像转动一个环?)】
枚举类型
枚举类型:用于取值在一个有限的集合范围内。
定义:
enum Size{SMALL, MEDIUM, LARGE, EXTRA_LARGE};
声明:
Size s = Size.MEDIUM;