2021.4.24 Java基础知识(一)——数据类型方面
一、数据类型
1、变量
用法同C,先定义后使用。定义时需指定变量类型
如果在定义时未指定初始值,则默认为0。
2、基本数据类型
用法仍然同C
- byte、short、int、long
- float、double
- 字符:char
- boolean
内存占用
- byte:1B
- short、char:2B
- int、float:4B
- long、double:8B
整型取值范围
Java整型数都是带符号数
- byte:-128~127
- short:-2^15~2^15-1
- int:-2^31~2^31-1
- long:-2^63~2^63-1
浮点型
- float型浮点数,定义时需要加f后缀;double则不需要;
float f=3.14f;
- float与double都有科学计数法;写法是底数e指数,代表的值为底数*10^指数;指数为负数时,可以直接加-号,而不用加括号;
float f=3.14e10f; double d=3.14e-123;
boolean
只有true、false两种
Java对boolean类型的存储并没有规定,理论上存储boolean类型只需1b,但是通常JVM内部会把boolean表示为4B整数。
char
char表示单个字符。Java的char类型除了可以表示标准的ASCII外,还可以表示一个Unicode字符(即可以无条件将单个中文文字赋值给某char变量)
char类型使用单引号,字符串是双引号。
3、引用类型
除了以上基本类型的变量,剩下的都是引用类型。最常用的是String——字符串:
String s="hello";
引用类型类似C中的指针,指向某个对象在内存中的地址。
4、常量
定义变量时,加final修饰符,这个变量就成为了常量:
final float PI = 3.14; int r = 5; float area = PI * r * r;
根据习惯,常量名全部大写。
5、var关键字
用途:自动识别变量类型,用于代替具体的变量类型前缀。
var i = 5; var f = 3.14f; var sb = new StringBuilder(); //以上等价于 int i = 5; float f = 3.14f; StringBuilder sb = new StringBuilder();
当然用的时候,还是写清楚为好。
6、变量的作用范围
Java中,多行语句用{}括起来。很多控制语句——判断、循环,都以{}作为它们自身的范围。这些在同一个{}中的语句,称为一个语句块,定义在某个语句块中的语句,其作用范围只能是该语句块。而Python语句块的判断,则是完全以缩进为标准的。
为了保持良好的书写规范,建议在Java中同时使用{}和缩进。
二、运算
1、整型运算
运算符跟C完全相同:
++、--、*、/、%、+、-、<<、>>、&、|、+=、-=、*=、/=
2、浮点运算
浮点运算存在误差,所以判断两浮点数是否相等常常会出现错误的结果。正确的比较方式是判断两个浮点数之差是否小于一个很小的数:
double r = Math.abs( x - y ) if(r < 0.00001){ //可以认为相等 } else{ //不相等的情况 }
3、特殊值
NaN:Not a Number
Infinity:正无穷
-Infinity:负无穷
4、强制类型转换
对浮点数进行强制类型转换,int——直接截取整数部分
5、布尔运算
逻辑运算符
同C——>、>=、<、<=、==、!=、与&&、或||、非!
短路现象:对与&&、或||,如果第一项判断为假(真),则不再判断第二项。
选择运算符 ? :
三、字符和字符串
1、字符编码值
字符类型的内存占用为2B,如果要显示一个字符的Unicode编码,可以将char类型直接赋值给int类型变量就行(此外,也可以用相反的操作,将一个int值赋值给char类型):
int n1 = 'A'; //A的Unicode编码65 int n2 = '中';//'中'的Unicode编码是20013 char c1='\u0041'//十六进制 char c2='\u4e2d'
2、字符串
1)转义字符——标志\
常用转义字符:
\n——换行
\r——回车
\t——Tab
\u####——Unicode编码字符,后跟十六进制数
2)多行字符串
三个双引号,可以用于表示多行字符串
String s = """ this is a long string however they are one not three strings """;
3)换行
①直接在字符串最后加\n;
②用多行字符串,且结束标志"""在第二行;
4)不可变特性
字符串具有不可变性——当我们创建、修改了一个String时,变化的只是String对象的指向地址。
例如:
String s = "hello";
s = "world";
①JVM创建字符串"hello";字符串变量s指向它;
②当我们修改s时,并不是修改s中的值,而是在JVM中额外创建了字符串"world",然后使s指向它;这意味着,原来的字符串“hello”还在,只是我们无法通过变量s访问它
5)空值:null
一个字符串是空值的两种情况:
①定义时直接赋值为null;
②定义时没有赋值;
String s1 = null ; String s2 ;
空值与空字符串是不同的;
四、数组
1)定义、初始化
数组的定义和C++中动态数组的定义类似:
//①先定义后初始化 int [] arr = new int [5]; arr = new int [] { 1,2,3,4,5 };
//②定义时进行初始化
//最常用 int [] arr = { 1,2,3,4,5 }; //③如果要创建一个长度未知的数组 //可以先声明,后在初始化时指定 int [] arr; arr = new int[] { 1,2,3,4,5 };
2)特性
- 定义后数组元素自动初始化为默认值,整型是0,浮点型是0.0,布尔型boolean;
- 数组创建之后,大小不可改变
- 索引下标都是从0开始
3)修改指向
Java中的数组依然是浮动的——我们定义的数组变量其实是指向某一连续数据的起始地址,因此它可以随便改变其指向,只不过上一串数据的地址就丢失了(但是数据仍保存在内存中)。
例如:
我们即使先定义了一个大小为5的数组,在我们改变指向为大小为3的数组后,用length属性查看该数组的大小时,数组的长度就变为3了:
public class Test{ public static void main(String[]args){ //初始化之后,未赋值之前 int [] val = new int [5]; System.out.println(val.length); //赋值之后 val = new int[] { 1,2,3,4,5 }; System.out.println(val.length); //改变指向之后 val = new int[] {6,7,8}; System.out.println(val.length); } }
输出结果:
5 5 3
可以看到,由于改变了指向,所以其长度也不为最开始的长度了。
4)字符串数组
字符串数组中保存的并不是字符串本身,而是在内存中额外开辟了存储了字符串的空间,然后将其首地址保存到了字符串数组中。(这一点也同C++)
例如:
String [] str = { "abc","123","xyz" };
同样,修改其中某一项时,并不是修改原来的值,而是新开辟了空间然后第一项指针改指向了它。

浙公网安备 33010602011771号