前言
相信各位读者都听说过java这门编程语言,它是一门面向对象的编程语言(Object Oriented Programming,简称OOP)。java与python,C++都是如今比较火爆的语言,但是在应用方面,这几种语言又各有不同。如java广泛运用在大型应用的开发中,但python就更偏向于数据科学和机器学习。
得益于java较高的性能以及丰富的库和框架,学习java已经成为了学习计算机的路上一个必备的过程,例如AP系列课程中的计算机科学(AP Computer Science A)就使用java作为主要的编程语言。
作为选修过AP CSA并考了五分,以后也想继续学习计算机的高中生,我将会在接下来的几篇文章中介绍关于java的基础知识,希望能帮助到更多的计算机初学者以及同样学习AP CSA这一门课的学生。
在本篇文章,同时也是java基础知识系列的第一篇中,我将详细讲解java数据类型相关的内容。
引入
1)变量类型以及声明
在java中,声明变量需要提前设置变量的类型以及名字,例如:
int a = 8;
double n = 1.5;
String s = ”hello world”;
由于java中变量类型转换并不是那么简单,需要满足一定的条件,因此在声明变量之前务必要深思熟虑。同时,java中的变量名设置也需要遵循一定的规则,变量名中只能包括字母,数字,下划线和美元符号,并且数字不能作为名字的开头。在命名的过程中,很多人会选择给变量起一个描述性的名字,这并不是一个强制性的要求,但可以使代码更加容易理解。
2)栈(stack)&堆(heap)
栈和堆是java中两种不同的内存分类,当我们声明变量时,原始类型(primitive)的变量(如int,double,boolean等)都存储在栈上面,而引用类型(reference)的变量(如String,Class等)中,变量名存储在栈上,变量内容存储在堆上,栈中的变量名指向堆中的变量内容。
例
声明一个名为s,内容为“hello world”的字符串
主要数据类型
1)Integer整数(primitive类)
顾名思义,Integer类型的变量中只能存储整数,声明方式为:int 变量名=变量内容(只能为整数);
可能初次接触Integer变量的同学会有些疑惑,为什么在java中声明整数变量时用的是int但变量类型的名字又不叫int而叫Integer呢?
这个问题涉及到java中的包装类(Wrapper Class),即将一个原始类型(primitive 类)的变量包装起来,将原始类型的数据强制存到堆空间上。关于包装类更详细的信息我会在讲解class时一并说明。
在java中,整数类型的变量是有存储限制的。Java中能存储的最小整数是-2147483648,能够存储的最大整数是2147483647,在java中调用这两个值可以直接输入Integer.MIN_VALUE(调用最小值)以及Integer.MAX_VALUE(调用最大值)。
和其他所有的编程语言一样,java中也可以对数据进行运算,常见的运算符有以下几个
运算 | 在java中的形式 | 示例 |
---|---|---|
加 | + | int n=1+2; n为3 |
减 | - | int n=3-1; n为2 |
乘 | * | int n=3*2; n为6 |
除 | / | int n=4/2; n为2 |
余数 | % | int n=4%3; n为1 |
值得一提的是,和python不一样,java中没有计算幂的符号。在java中计算幂有两种方式,一是将数字或者变量乘以自身多次,比如计算x的三次方就可以通过x*x*x来算;二是使用Math类中的pow方法,关于Math这个类我也会在class的内容中进行讲解。
且在java中,“/“的结果默认为整数,如果计算出来的结果是小数,java会自动将结果的小树部分抹掉,如5/2本来应该是2.5,但在java中的结果是2。
在声明int类型的变量时如果利用了小数进行运算,java会报错,可以将小数强制转换为整数(利用(int))来计算,(int)会将括号后的第一个小数强制转换为小数,但不会四舍五入,只会抹掉小数部分。
对于java的最大值和最小值进行计算时,会发生溢出(overflow),即用最大值加其他数字时,会得到最小值。
例
int n = Integer.MAX_VALUE+1;
此时输出的结果为-2147483648。
同理,用最小值减去某个数字,也会得到最大值。
2)Double浮点数(primitive类)
在java中,double类型是用来存储小数的,如果利用double存储整数,则数字会从整数变为小树形式,如将2存在一个double类型的变量中,2会变成2.0。
double类变量的运算和int类基本相同,但double的除法是可以得到小数结果的。
例
计算3/2并且将结果赋值给a变量
double a = 3/2;
此时a的值为1.0,如果想给a赋值1.5,可以将3和2中其中一个数变成小数形式
double a = 3.0/2;
或者
double a = (double)3/2;
(double):将括号后第一个整数强制转换为小数。
值得注意的是,double类型的数据在存储的过程中可能会导致精度的缺失,这是因为将小数转换为二进制时,往往不能精确转换,只能存储近似值,因此有时候存储的小数值会不准确。
3)Boolean布尔值(primitive类)
Boolean只包括两个值,即true和false,因此,boolean类型的变量常被用在需要判断情况下,如用在if-else结构中,又或者是在声明class的时候作为用户输入的变量。同时,java中的三个逻辑运算符号,||(或),&&(与),!(非)也会与boolean类型的值搭配使用。
4)char(primitive类)
char类型的变量只包括一个字符,如一个字母,一个数字或者是一个汉字等,声明char类型变量时需要将变量内容用单引号括起来。
5)String字符串(reference类)
在java中,字符串是一个非常重要的变量类型,通常人们会将文本内容存放在字符串类型的变量中。
字符串的一个很重要的特点就是不可变(immutable)。
前文中提到过,reference类型的变量在声明时名字存在栈(stack)上,而内容存在堆(heap)上,因此,string在声明时就有一个值生成在了堆上,而栈上的变量名指向堆上的内容。堆上的值一旦生成了就不会改变,我们修改string的内容时,只是在堆上又生成了一个新的值,并且栈上的变量名指向了这个新生成的值,但是原本的值没有改变。
因此,不可变指的是字符串的变量名指向新的值时,旧的值仍然在堆上存在,而不是字符串包括的内容无法改变。
在java中,字符串是有长度的,并且它的长度为字符串里字符的数量,如String s = “hello world”; 字符串s的长度为11。而且字符串中每个字符都有一个下标,这个下标从0开始,到字符串长度-1结束,如字符串s中“h”的下标为0,“d”的下标为10,即11-1。
java中有很多关于字符串的方法,下表中列出了几个常用的方法,并且以上一段中的字符串s为例
方法 | 内容 | 用法 |
---|---|---|
length() | 计算字符串长度 | s.length() 返回11 |
indexOf(substring) | 查找字符串中有没有substring里的内容,若有,则返回substring第一个字符在字符串中的下标,没有则返回-1 | s.indexOf(“world”) 查找字符串s里是否包括substring里的内容 返回6 |
substring(index1,index2) | 截取字符串中从下标index1开始到下标index2之前的内容。 不写index2或者index2为字符串长度时,默认为截取字符串下标index1后的全部内容。 若填写的index超过了字符串范围(即大于字符串长度)则报错 | s.substring(6,10) 返回“worl” |
charAt(index) | 返回字符串中下标为index的字符 | s.charAt(3) 返回“l” |
总结
以上的五类变量是java中最基础的数据类型,其中int,double,string,boolean在代码编写的过程中尤为常见。由于篇幅限制,更多的数据类型,如array,arraylist等,我将会在后续的文章中进行更详细的讲解。