预览和回顾
- Java跨平台原理
- Java安全性
- 八种基本数据类型
- 位、字节和字
- 基本类型转换
- 递归的定义和优缺点
Java特点
Java跨平台原理
- C/C++语言都直接编译成针对特定平台机器码。如果要跨平台,需要使用相应的编译器重新编译。
- Java源程序(.java)要先编译成与平台无关的字节码文件(.class),然后字节码文件再解释成机器码运行。解释是通过Java虚拟机来执行的。
- 字节码文件不面向任何具体平台,只面向虚拟机。
- Java虚拟机是可运行Java字节码文件的虚拟计算机。不同平台的虚拟机是不同的,但它们都提供了相同的接口
- Java语言具有一次编译,到处运行的特点。就是说编译后的.class可以跨平台运行,前提是该平台具有相应的Java虚拟机。但是性能比C/C++要低。
- Java的跨平台原理决定了其性能没有C/C++高
Java安全性
语言层次的安全性主要体现在:
- Java取消了强大但又危险的指针,而代之以引用。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的,因为原来这个内存地址可能存储着重要数据或者是其他程序运行所占用的,并且使用指针也容易数组越界。
- 垃圾回收机制:不需要程序员直接控制内存回收,由垃圾回收器在后台自动回收不再使用的内存。避免程序忘记及时回收,导致内存泄露。避免程序错误回收程序核心类库的内存,导致系统崩溃。
- 异常处理机制:Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
- 强制类型转换:只有在满足强制转换规则的情况下才能强转成功。
底层的安全性可以从以下方面来说明
- Java在字节码的传输过程中使用了公开密钥加密机制(PKC)。
- 在运行环境提供了四级安全性保障机制:
字节码校验器 -类装载器 -运行时内存布局 -文件访问限制
数据类型
八种基本数据类型
基本类型 | 字节数 | 位数 | 最大值 | 最小值 | 默认值(零值) |
byte | 1byte | 8bit | 2^7 - 1 | -2^7 | (byte)0 |
short | 2byte | 16bit | 2^15 - 1 | -2^15 | (short)0 |
int | 4byte | 32bit | 2^31 - 1 | -2^31 | 0 |
long | 8byte | 64bit | 2^63 - 1 | -2^63 | 0L |
float | 4byte | 32bit | 3.4028235E38 | 1.4E - 45 | 0.0F |
double | 8byte | 64bit | 1.7976931348623157E308 | 4.9E - 324 | 0.0D |
char | 2byte | 16bit | 2^16 - 1 | 0 | '\u0000'(对应数字0,输出为空) |
boolean | 1bit | flase |
位、字节、字、KB、MB
位:“位(bit)”是电子计算机中最小的数据单位。每一位的状态只能是0或1。
字节:8个二进制位构成1个“字节(Byte)”,它是存储空间的基本计量单位。1个字节可以储存1个英文字母或者半个汉字,换句话说:1个汉字占据2个字节的存储空间。
字:“字”由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。
KB:K表示1024,也就是2的10次方。1KB表示1K个Byte,也就是1024个字节。
MB:1MB = 220 Bytes = 1048576Bytes
• 1 byte (B) = 8 bits (b) 字节=8个二进制位
• 1 Kilobyte(K/KB)=2 e10bytes=1,024 bytes 千字节
• 1 Megabyte(M/MB)=2 e20bytes=1,048,576 bytes 兆字节
• 1 Gigabyte(G/GB)=2 e30bytes=1,073,741,824 bytes 千兆字节
• 1 Terabyte(T/TB)=2 e40bytes=1,099,511,627,776 bytes吉字节
编码、字与字节的关系详细参照:
基本类型转换
箭头所指的方向均可进行数据类型的自动转换,反之则需要进行强制类型转换,强制类型转换过程中也容易造成数据精度的丢失。
自动类型转换
当一个数据类型从小范围向大范围进行转换时,java会自动进行隐式的类型转换,不需要我们手动进行处理。同时,数值在转换之后也不会存在数据精度丢失的问题。
强制类型转换
与自动类型转换相反,从取值范围大的数据类型转换至取值范围小的数据类型,如果不进行强制类型转换则会引发报错,同时在强制类型转换的过程中,也需要考虑能否接受精度缺失。
运算符和流程
用最有效率的方法算出2乘以8等于多少
使用位运算来实现效率最高。位运算符是对操作数以二进制比特位为单位进行操作和运算,操作数和结果都是整型数。对于位运算符“<<”, 是将一个数左移n位,就相当于乘以了2的n次方,那么,一个数乘以8只要将其左移3位即可,位运算cpu直接支持的,效率最高。所以,2乘以8等于几的最效率的方法是2 << 3。
空字符串和数字连接
int a = 10;
int b = 20;
System.out.println("" + 10 + 20);// 1020
System.out.println(10 + 20 + "");// 30
while和do-while循环的区别
while先判断后执行,第一次判断为false,循环体一次都不执行
do while先执行 后判断,最少执行1次。
如果while循环第一次判断为true, 则两种循环没有区别。
break和continue的作用
break: 结束当前循环并退出当前循环体。
break还可以退出switch语句
continue: 循环体中后续的语句不执行,但是循环没有结束,继续进行循环条件的判断(for循环还会i++)。continue只是结束本次循环。
递归的定义和优缺点
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
使用递归算法计算n!
public class Test {
public int factorial(int n) {
if (n == 1 || n == 0) {
return n;
} else {
return n * factorial(n - 1);
}
}
public static void main(String[] args) {
Test test = new Test();
System.out.println(test.factorial(6));
}
}