java核心技术Note——第三章 Java的基本程序设计结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sha18751330807/article/details/83006643

数据类型

Java是一种强类型语言,这意味着必须为每一个变量申明一种类型。Java中,共有8种基本类型:byte, short, int, long , char, float, double, boolean。

整形

类型 存储需求 存储需求
int 4字节 -2147483648~2147483647(正好超过20亿)
short 2字节 -32768~32767
long 8字节 -9223372036854775808~9223372036854775807
byte 1字节 -128~127

ps: 计算机系统中数值一律用补码存储(最高位为符号位),因为补码中只有一个0(0000,0000或0000,0000,0000,0000等)因此人为规定1000,0000为-128,1000,0000,0000,0000为-32768等。
java整形范围与运行java代码的机器无关,每种数据类型的取值范围都是固定的。
长整形数值后有一个后缀L(如:400000L),十六进制数有一个前缀0x(如:0xCAFE),八进制有前缀0,易混淆因此不建议使用八进制。
ps:java中没有无符号类型

浮点类型

类型 存储需求 取值范围
float 4字节 大约 ± \pm 3.40282347E+38F(有效位数为6~7位)
double 8字节 大约 ± \pm 1.79769313486231570E+308(有效位数为15位)

float类型数值后有一个后缀F(例如:3.14F),没有后缀的默认位double类型(java默认浮点型位double),double类型值也可以带后缀D
ps:浮点数不适用于出现舍入误差的计算中,例如:System.out.println(2.0-1.1)将打印出0.89999999999。这是因为二进制系统中无法精确表示分数1/10,就好像十进制不能精确表示1/3。如果需要数值计算中不含舍入误差,应使用BigDecimal类。

char类型

java中使用UTF-16编码描述一个代码单元(code unit),一个完整的字符是一个code point,一个code point对应1~2个code unit, 一个code unit一定是2字节。因为char是变长,所以不建议使用
PS:出现这种情况的原因是java 设计之初Unicode字符较少,16位足够表示,但随着字符增多,16位不够表示,因此UTF-8变成了变成编码,Java中又采用了UTF-16编码方式,因此char长度也就变成边长的了,但常用字符的长度一般仍是2字节。
编码补充
ASCII字符集用7bit表示一个字符,总共表示128个字符。之后ASCII扩展成8bit表示一个字符,第一位为0,则表示常用的128个字符。
Unicode也是个字符集,字符集是将字符与数字对应(Unicode1使用0至65535之间的数字来表示所有字符,其中0到127表示的字符和ASCII完全一样,剩余的数字对应其他的字符),字符与数字对应是第一步,然后就是怎么把0-65535(现在的Unicode2已经有9万多字符了)之间的数字转化成01串保存到计算机中,这就是不同的编码方式。于是出现了UTF(unicode transformation format),有UTf-8,UTF-16,UTF-32等编码方式。
其中UFT-32是定长编码,使用4个字节表示一个字符;UTF-8与UTF-16则是变长编码,UTF-8可以使用1-8个字节表示一个字符,UTF-16则使用2或4个字节表示一个字符。

boolean类型

注意:Java中布尔值与整形值不能进行互相转化,即不能把整形变量当成逻辑条件,尽管c++和python都可以。

变量

  • java中普通变量在使用前一定要初始化,不会有默认值,只有类内的普通变量会赋予默认值。
  • java中不区分声明和定义,只有声明和初始化。
  • 利用final关键字修饰的变量是常量,常量只能被赋值一次,后面不能修改。

运算符

  • 两个操作数的类型决定了除法符号‘/’是整数除法还是浮点数除法,有一个操作数是浮点数就表示浮点数除法,否则就是整数除法。(整数被0除产生异常,浮点数被0除得到无穷大或NaN结果)
  • 对负数取余,结果一定是负数。
  • 自增运算符有前缀和后缀形式,前缀形式++i先进行加1运算,后缀形式则使用变量原来的值,最后加1i++例如:
int m = 7,n =7;
int a = 2 * ++m;  //now a is 16, m is 8
int b = 2 * n++;  //now b is 14, n is 8
  • 常用关系运算符:
    1. == != < > <= >=表等量关系
    2. && || !表逻辑运算符或与非,其中或与是符合短路规则的
    3. 三元操作符 condition?expression1:expression2
  • 位运算符& | ~ ^分别表示按位与,或 非 异或,另外“>>”和“<<”运算符将二进制位进行右移或左移操作。ps:“>>>”用0填充高位;“>>”用符号位填充高位,没有“<<<”运算符。
    补充:逻辑移位移出的空位都用0来补,算术移位要区分有符号型与无符号型,无符号型与逻辑移位一致,而对于有符号型,算术左移等同于逻辑左移,算术右移高位补符号位(正补0,负补1)

数值类型转换


实线表数据类型无损转换,虚线箭头表示可能出现精度损失的转换。

  • 两个数值进行二元计算时,先要将两个操作数转换为同一类型。
  • 强制转换时,原值超出目标类型的范围时,会发生截断。

括号和运算符级别

在无括号的情况下, 同一级别的运算符按从左往右进行计算(从右往左结合的除外)

运算符 结合性
[] . () (方法调用) 从左向右
! ~ ++ – ++ +(一元) -(一元) (强制类型转换) new 从右向左
* / % 从左向右
+ - 从左向右
<< >> >>> 从左向右
< <= > >= instanceof 从左向右
== != 从左向右
& 从左向右
^ 从左向右
&& 从左向右
?: 从右向左
= += -= *= /= %= &= |= ^= <<= >>= >>>= 从右向左

PS:运算符结合性:结合性是指一个操作数左右两边各有一个操作符时,先按照操作的优先级决定运算次序,如果优先级相同,再按照操作符的结合性来决定运算次序,如:假设是一个运算符,又有表达式abc,如果是左结合的,那么该表达式被解析为(ab)c,如果是右结合的,那么该表达式将被解析为a(b~c)

字符串

  • Java中字符串是不可变对象
  • 检测字符串是否相等时,应使用equal方法如:s.equal(t),==运算符只能确定两个字符串是否放置在同一个位置上。PS:只有字符串常量是共享的,而+或substring产生的结果不共享。
  • 检查一个字符串既不是null也不为空串if( str != null && str.length() !=0)
  • length方法返回UTF-16编码表示的代码单元数量,要想得到实际长度,即代码点数量,可以调用:
    int cpCount = greeting.codePointCount(0, greeting.length())
  • 采用字符串连接的方式拼接很多较短的字符串效率比较低,因为每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间,这时应使用StringBuilder类。
// 构建一个空的字符串构造器
StringBuilder builder = new StringBuilder();
builder.append(ch);  // 添加单个字符
builder.append(str);  // 添加字符串
// 构建字符串
String completedString = builder.toString();

控制流程

多重选择:switch语句

Scanner in = new Scanner(System.in);
int a = in.nextInt();
switch(a){
  case 1...
    break;
  case 2:
    ...
    break;
  default:
    ...
    break;
}
  • 如果在case分支语句的末尾没有break语句,那么会接着执行下一个case语句。
  • case标签可以是:
    • 类型为char,byte, short, int或对应的包装器类的表达式
    • 枚举常量
    • java SE7开始,可以是字符串常量

大数值

如果基本的整数和浮点数精度不能够满足需求,可以使用java.math包总的:BigInteger和BigDecimal,它们可以处理包含任意长度数字序列的数值。BigInteger实现了任意精度的整数运算,BigDecimal实现了任意精度的浮点数运算。

// 使用静态的valueOf方法可以讲普通的数值转为大数值
BigInteger a = BigInteger.valueOf(100);
BigInteger c = a.add(b); // c = a+b
BigInteger d = c.multipy(b.add(BigInteger.valueOf(2)));  // d = c*(b+2)
// 除法 devide()

API:
BigInteger subtract(BigInteger other) 差
BigInteger mod(BigInteger other) 余数
BigInteger compareTo(BigInteger other) 比较,相等返回0,小于other返回负数,反之返回正数。

数组

数组是一种顺序存储的数据结构(内存上连续),用来存储同一类型的值的集合。创建数组的语法:int[] a = new int[100],数组长度不要求是常量,可以是变量。
创建一个数字数组时,所有元素都初始化为0。boolean数组初始化为false。对象数组的元素则初始化为null,表示这些元素还未存放对象。
for each结构可以遍历数组。

数组初始化方式

int[] a = {1,2};
new int[]{1,2};  //初始化匿名数组
a = new int[]{1,2};  //在不创建新变量的情况下重新初始化一个数组

数组拷贝

将一个数组变量拷贝给另一个数组变量。这是,两个变量将引用同一个数组。
使用Arrays.copyOf方法可以将一个数组的所有值拷贝到一个新的数组中去。例如:int[] a = Arrays.copyOf(c, c.length);

命令行参数

main方法中带有String[] args参数,它接受一个字符串数组,也就是命令行参数。例如:java Message -g cruel world,args数组将包含以下内容:args[0]:“-g” args[1]:“cruel” args[2]:“world”
ps:程序名并不存储在args数组中。
数组API: java.util.Arrays
static void sort(type[] a) // 优化的快排
static int binarySearch(type[] a, type v)
static int binarySearch(type[] a, int start, int end, type v) //二分搜索, 返回-1或对应下标
static fill(type[] a, type v) //将数组的所有数据元素都设置为v
static boolean equals(type[] a, type[] b) //如果数组大小相等且对应位置元素相等返回true

多维数组

Java实际没有多维数组,多维数组被解释为“数组的数组”,如果b一个二维数组,那么b[i]引用第i个字数组,即二维表的第i行,b[i][j]表引用这个数组的第j项。
ps:for each循环无法自动处理多维数组的每个元素,应按照行和每行的元素来遍历每个元素,但不能改变数组

猜你喜欢

转载自blog.csdn.net/sha18751330807/article/details/83006643