java知识总结——基本类型与运算(一)
说明
本文仅仅为了博主面试时方便查阅与梳理相关知识,如果有错误与不到位的地方,欢迎大佬指点改正,谢谢!
阅读书籍:《java程序员面试笔试宝典》
一、java中的基本数据类型
java语言提供了8种原始的数据类型(byte、short、int、long、float、double、char、boolean),这些数据类型不是对象,而是java语言中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上被分配内存空间。
除了这8种基本引用类型外,其他类型都是引用类型,引用类型以特殊的方式指向对象实体,这类变量在声明时不会被分配内存空间,只是存储了一个内存地址而已。
java中基本数据类型及其描述:
数据类型 | 字节长度 | 范围 | 默认值 | 包装类 |
---|---|---|---|---|
byte | 1(bit) | [-128~127] | 0 | Byte |
short | 2(16bit) | [-32768,32767] | 0 | Short |
int | 4(32bit) | -231~231-1 | 0 | Integer |
long | 8(64bit) | 263~263-1 | 0L或0l | Long |
float | 4(32bit) | 32位单精度范围 | 0.0F或0.0f | Float |
double | 8(64bit) | 64位双精度范围 | 0.0 | Double |
char | 2(16bit) | Unicode | u0000 | Character |
boolean | 1(8bit) | true和false | false | Boolean |
封装类型与原始类型的不同点:
1、原始数据类型再传递参数时都是按值传递,包装类型是按引用传递的。
2、原始数据类型与包装类型用作某个类的实例参数时,所指定的默认值不同,对象引用实例变量的默认值都是null,原始类型实例变量的默认值与它们的类型有关。
注意:在java中,默认声明的小数是double类型的,因此对float类型的变量进行初始化时需要进行类型转换。
float类型的变量有两种初始化方法:float=1.0f或(float)1.0。
在java中null值是什么?在内存中null是什么?
null不是一个合法的Object实例,所以编译器并没有为其分配内存,它仅仅用于表明该引用目前没有指向任何对象。null是将引用变量的值全部置0。
如何理解赋值语句String x = null?
在java语言中,变量被分为两大类型:原始值和引用值。
声明为原始类型的变量,其存储的是实际的值。
声明为引用类型的变量,存储的是实际对象的地址。
对于赋值语句String x = null,它定义了一个变量“x”,x中存放的是String引用,此处为null。
二、不可变类
1、概念
不可变类是指当创建了这个类的实例后,就不允许修改它的值了,即一个对象一旦被创建出来,在其整个声明周期中,它的成员变量就不能被修改了。
注意:在java中,所有基本类型的包装类都是不可变类,此外,String也是不可变类。
2、创建不可变类
创建不可变类需要遵循以下基本原则:
(1)类中所有成员变量被private修饰。
(2)类中没有写或者修改成员变量的方法,只提供构造函数,一次生成,永不改变。
(3)确保类中所有方法不会被子类覆盖,可以通过把类定义为final或者把类中的方法定义为final来达到这个目的。
(4)如果一个类成员时不可变量,那么在成员初始化或者使用get方法获取该成员变量时,需要通过clone来确保类的不可变性。
(5)**如果有必要,可以覆盖Object类的equals()方法和hashCode()方法。在equals()方法中,根据对象的属性值来比较两个对象是否相等,并且保证用equals()方法判断为相等的两个对象的hashCode()方法的返回值也相等,**这可以保证这些对象能被正确地放到HashMap或HashSet中集合。
3、优点与缺点
不可变类的优点是:使用简单、线程安全、节省内存。
缺点是:不可变类的对象会因为值的不同而产生新的对象,从而导致无法预料的问题。
三、值传递和引用传递
1、值传递
在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
2、引用传递
在方法调用中,传递的是对象(也可以看做是对象的地址),这是形参和实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
注意:在java语言中,8种基本数据类型在传递参数时都是按值传递,其他所有类型在传递参数时是按引用传递的。
总结:
1.值传递不会改变实际参数的值;
2.引用传递不能改变实际参数的地址;
3、引用传递能改变实际参数的内容。
四、不同数据类型的转换
在java语言中,当参与运算的两个变量的数据类型不同,就需要进行隐式的数据类型转换,转换的规则为:从低精度到高精度转换,即优先级满足byte<short<char<int<long<float<double
。反之,则需要通过强制类型转换来实现。
在java语言中,类型转换可以分为以下几种类型:
1、类型自动转换
低级数据类型可以自动转换为高级数据类型。
当类型自动转换时,需要注意以下几点:
(1)char类型的数据转换为高级类型,会转换为其对应的ASCII码。
(2)byte、char、short类型的数据再参与运算时会自动转换为int型,但当使用“+=”运算时,就不会产生类型的转化。
(3)基本数据类型与boolean类型是不能相互转换的。
当有多种类型的数据混合运算时,系统会先自动地将所有数据转换成容量最大的数据类型,然后再进行计算。
2、强制类型转换
当需要从高级数据类型转换为低级数据类型时,就需要进行强制类型转换。
注意:在进行强制类型转换时可能会损失精度。
五、强制类型转换的注意事项
1、java语言在设计byte、short和char类型的运算时,首先会把这些类型的变量强制转换为int类型,然后对int类型的值进行计算,最后得到的值也是int类型。
2、“+=”为java语言规定的运算法,java编译器会对其进行特殊处理。