目录
接上集。
2.浮点数:float(32bit)、double(64bit)
float:32位,1位符号位,8位阶位(x),23数值位(y)。2^(x-127)*y。能表示的数在数轴上的分布:| | | | | ||| | | | | |
double:64位,1位符号位,11位阶位(x),52数值位(y)。2^(x-1023)*y
float x5 = 20.5f;
double x6 = 50.5;
- 有效位数:从第一个不为0的位置开始算。比如:0.000132的有效位是三,12.588的有效位是五。float的有效位是6~7位,对于316848785132009856265来说,计算机只能表示前面七位(3168487)。
- 超范围运算,结果可能不对,只保留最右侧的有效位,第一位为符号位,0正1负。
- float和int的精度对比:越靠近0,float精度越高。数值越大,int精度更高。
3.布尔型:boolean(32位)
boolean x7 = true;
boolean x8 = false;
- 为什么布尔型要占32位不是1位(用0和1表示)

数据越多排队概率越大,大类型的比例提高,可以减少数据排队的概率,所以布尔型要占32位而不是1位。
4.字符型:char(具体有几位,根据编码来决定8(ascii)/16(unicode)/24(utf-8)/32(utf-32)位)
- 字符——>符号——>几何图形
-
char x9 = 'a';//单引号表示,只能有一个符号 char x10 = '8'; int aa = x9;//char——>int char cc = (char)aa;//int-强制类型转换->char int m = x9 + x10; int n = x9 * x10;- 使用编码来存储字符,可以节省空间。因为显示一个字符,也就是显示一个图形,往往需要很多像素点。存储一个像素点需要56bit,显示多个字符就会需要很多需要很大的空间(比如存储aaaaaaaaaabbbbbbbbbb,需要万以上的bit)。如果有编码,就只用存储编码(最多占用2位的bit)。计算机存储char类型,其实就是存储一些数字,等显示的时候,对照编码表,显示相应的图形。
- 为什么Word占用的内存比记事本大:因为Word有各种各样的字体,这些字体是通过编码来实现。Word要保存他们对应的编码,所以占用的内存会更大。
- 输入法的实现:当你输入“f”时,输入法会把“f”对应的编码,去和与“f”有关的编码对比,然后返回值,比如:“fa”、“fen”等。
1.2 变量
1.2.1 变量
- 声明变量:每个声明以分号结束。
- 变量名命名规则:变量名必须是一个以字母开头并由字母或数字构成的序列。需要注意,与大多数程序设计语言相比,Java中"字母"和"数字"的范围更大。字母包括'A'~'Z'、'a'~'z'、'_'、'$'或在某种语言中表示字母的任何Unicode字符。同样,数字包括'0'~'9'和在某种语言中表示数字的任何 Unicode字符。但空格不能出现在变量名中。变量名中所有的字符都是有意义的,并且大小写敏感。变量名的长度基本上没有限制。此外,保留字不能作为变量名。
- 变量初始化
double salary;//变量声明 salary = 1054.5;//变量初始化- 局部变量:定义在方法里面的。一般用于保存一些临时变量,使用前要先赋值。
- 全局变量:定义在类里面,方法外面的变量。不用赋值也可以使用,会有默认值(0 0.0 false 字符是一个空字符"" 对象是null)。
- 局部变量和全局变量重名时,局部变量会覆盖全局变量。
- 无static标识的为非静态变量,想要访问就要先new一个变量。
- 有static的为静态变量,可以直接通过访问。方法里面直接访问,方法外通过类名访问。
static int app;1.2.2 常量
- 使用关键字final表示常量。
- 定义时必须要给初始值。
- final修饰的变量只能被赋值一次,一旦赋值就不能再更改了。
- final可以修饰全局变量和局部变量。
- 习惯上,常量名全部大写。
- final通常和static一起用。
- 在Java中,经常希望某个常量可以在一个类中多个方法中使用,通常将这些常量称为类常量。可以使用关键字static final设置一个类常量。需要注意的是类常量的定义位于main方法的外部。在同一个类中的其他方法也可以使用这个常量。如果一个常量被声明为public,那么其他类的方法也可以使用这个常量。
final double PI = 3.14; public static final double PI = 3.14;final的作用:- final修饰的基本类型不可以第二次赋值。
- final修饰的引用类型不可以第二次改变指向。
- final修饰的类不可以被继承。
- final修饰的方法不可以被重写。
- final防止指令重排序,遏制流水线优化,保障多线程并发场景下的可见性。
1.3 运算
1.3.1 运算符
System.out.println(5+2);//7 System.out.println(5+"7");//57 System.out.println(5/2);//2 System.out.println(5.0/2);//2.5 //System.out.println(8/0);//会报错:byzero。0不可以做除数 System.out.println(8.0/0);//Infinity 无穷大 System.out.println(5%2);//1 System.out.println(3+8*9.2/2);//39.81.3.2 Math类
在Math类中包含了各种各样的数学函数。
double a = Math.sqrt(4);//2.0 计算一个数值的平方根 double b = Math.pow(5,2);//25.0 计算5^2开根号公式
先找一个整数,其平方最接近21(但是小于等于21)结果是16(4*4=16)。重复以下步骤- 21-16=5 5*100=500
- 找一个最大x,使(4*20+x)*x最接近(小于等于)500。乘4,是因为目前已经找到的值为4。结果是x = 5。
- 500-425=75 75*100=7500
- 找一个最大x,使(45*20+x)*x最接近(小于等于)7500。乘45,是因为目前已经找到的值为4.5(小数点忽略不计)。结果是x = 8。
1.3.3 数值类型的转换
byte x1 = 10; short x2 = 32000; int x3 = 30; long x4 = 50L; //自动类型转换 小碗——>大碗 short s1 = x1; int s2 = x2; long s3 = x3; float s4 = x3; float s5 = x4; //强制类型转换 大碗——>小碗 int m1 = (int)x4; byte m2 = (byte)x2;//0 //因为short型会有16位表示 //但是byte只能表示8位,于是会取最右边的8位 //x2的二进制的最右边的8位恰巧都是0,所以结果是0图为自动类型转换图,6个实心箭头,表示无信息丢失的转换;3个虚箭头,表示可能有精度损失的转换。

1.3.4 自增与自减运算
++/--在前,先完成加1;++/--在后,先使用原来的值。
int n = 3; int m = n++;//结果:k=3 n=4 这个式子是将n加一之前的值赋值给变量m int k = ++n;//结果:k=4 n=4 这个式子是加n加一之后的值赋值给变量m例子1:
arr默认初始值为0。arr[i] = i++的值为[0,0,2,0,4]arr[i] = ++i的值为[1,0,3,0,5]例子2:答案:1 0 1
对于代码2为什么是0:- 步骤一:保存 x 的当前值:在执行后置自增运算符 ++ 时,Java 会先将 x 的当前值保存起来。因为此时 x 的值为 0,所以保存的值就是 0。
- 步骤二:对 x 进行自增操作:完成值的保存后,x 的值会进行自增操作。由于 x 原本为 0,自增后 x 的值变为 1。
- 步骤三:将保存的值赋给 x最后,Java 会将之前保存的 x 的值(也就是 0)重新赋给 x。这是因为后置自增运算符 ++ 是先返回变量的当前值,再进行自增操作。所以在赋值操作中,赋给 x 的是自增前保存的值 0。
简:++运算符的优先级大于=,先++(此时x=1),但是因为后缀++的特点,赋值时会赋值0。1.3.5 条件运算
与:&&,或:||&&和||运算符是按照短路的方式来求值,如果第一个操作数已经能够确定表达式的值,则不会计算第二个操作数。实际应用中可以将有风险表达式的放在第二个。1.3.6 位运算
计算时,要用补码来计算,得到的结果为补码。- & 按位与,同1位1。
- 10&8 结果为8
- -10&12 结果为4
- | 按位或,同0为0。
- ~ 取反,1—>0,0—>1。
- ^ 异或,相异为1,相同位0。
例子1:
例子2:

2951

被折叠的 条评论
为什么被折叠?



