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

只有truefalse两种

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"
};

同样,修改其中某一项时,并不是修改原来的值,而是新开辟了空间然后第一项指针改指向了它。

posted @ 2021-04-24 23:06  ShineLe  阅读(125)  评论(0)    收藏  举报