数据类型与变量
1. 字面常量
常量就是程序运行期间,保持不变的量,通常保存在常量池。
举例:
- 字符串常量:“12345”、“hello world”
- 字符常量:’A’,’1’
- 布尔常量:true、false
- 整形常量:100
- 浮点型常量:3.14
- 空常量:null
2. 数据类型
分为:基本数据类型和引用数据类型。
2.1 基本数据类型
有四类八种:
-
四类: 整型、浮点型、字符型、布尔型
-
八种:
数据类型 关键字 内存占用 范围 字节型 byte 1字节 -128~127 短整型 short 2字节 -32768 ~ 32767 整形 int 4字节 -231 ~ 231-1 长整型 long 8字节 -263 ~ 263-1 单精度浮点数 float 4字节 有范围,一般不关注 双精度浮点数 double 8字节 有范围,一般不关注 字符型 char 2字节 0 ~ 65535 布尔型 boolean 无明确规定 true、false 注意:
- 无论在多少位的机器中,整形都是4字节、单精度浮点数都是4字节,其他类型同理。
- 整形默认是
int,浮点型默认是float。 - 整形和浮点型都是带有符号的。
- char属于基本数据类型。
2.2 引用数据类型
有6类:
- 类(Class) : 用于引用任何类的实例。例如,
String、Integer、ArrayList等。 - 接口(Interface) : 用于引用实现了该接口的任何类的对象。接口类型可以作为方法的参数类型、返回值类型,以及变量的类型。
- 数组(Array) : 用于存储固定大小的同类型元素序列。数组类型由基本数据类型(如
int[]、double[])或引用数据类型(如String[]、Integer[])组成。 - 枚举(Enum) : 用于定义一组常量。枚举类型可以作为变量类型,这些变量只能赋值为枚举中定义的常量之一。
- 注解(Annotation) : 用于为程序元素(类、方法、变量等)提供元数据。注解类型通常用于编译时处理,而不是在运行时使用。
- 类型变量(Type Variable) : 在泛型编程中,类型变量允许你为类、接口或方法指定一个占位符类型,这个类型在实例化时会被具体类型替换。
注意:
-
String属于引用数据类型。
-
所有引用类型都继承自Java.lang.Object类
这意味着所有的引用类型都拥有以下方法:
-
引用类型还有垃圾回收方法(Garbage Collection),当对象不在被任何引用对象引用时,JVM会自动回收其占用的内存。
-
引用类型变量通常以大写字母开头,这是Java命名的规定。
3. 类型转换
3.1 自动类型转换(显式)
在一个数据类型前,加上一个带括号的、其他类型,将原本的类型转换为括号中的数据类型。
例如:
public static void main(String[] args) {
float a = 3.14F;
System.out.println((int)a);// 发生了显式类型转换
}
3.2 自动类型转换(隐式)
除了显式发生的类型转换,剩下的转换都为隐式转换,通常发生在参数传递、不同类型变量赋值时。
但是隐式转换只会发生在小范围转换为大范围的数。
例如:
int b = 3; double c = 6.28; b = c;// 编译报错 c = b;
3.3 类型提升
不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
4. String类
String是一种引用数据类型,并非基本数据类型。
4.1 String的构造
-
使用字符串常量
// 1.使用常量串构造 String s1 = "hello bit"; -
使用new String() 的构造方法
// 2.直接newString对象 String s2 = new String("hello bit"); -
使用字符数组
// 3.使用字符数组进行构造 char[] array = {'h','e','l','l','o','b','i','t'}; String s3 = new String(array);
4.2 String 对象的比较
因为String是引用类型,所以其本身并不存储对象的实际数据,只存储对象在内存中的地址。
所以在使用 ”==“ 进行判定两个String对象是否相等时,会将他们的地址相比较,会有两种情况:
-
使用字符串常量进行构造String对象
这种情况下,JVM会将两个String对象都指向同一个内存地址,也就是说,这个字符串常量只在常量区保存了一份。
-
使用new String() 构造方法构造String对象
这种情况下, JVM会在堆上构造两份内容相同的String对象,也就是说,这两个String指向不同。
所以,我们在比较字符串的时候,会选择使用eqluals()方法进行比较,直接上源码:
可以看出,equals()方法是在对于字符串的具体内容进行比较。
String对象中的字符串军保存在类中的value属性中(是一个char[])。
4.3 字符串的不可变性
由于String中的内容均保存在private final char value[];中,所以不可对于String中的内容进行更改(final对象)。
final表示value这个字符数组不可指向其他的字符数组,而并非abc不可进行改变。
例如,考虑以下代码:
public class test2 { public static void main(String[] args) { final StringBuilder s = new StringBuilder("abc"); s.append("xyz"); System.out.println(s); } }运行结果:
在上述代码中,尽管s变量被final修饰,但是仍然可以通过
append()方法对其指向的内容进行更改。这并不是对于s进行更改,而是对于s指向的内存内容进行更改。
str是想要
append()的对象,getChars()是对于value的count位置处,加上长度为len的str字符数组。
所以任何对于String对象的更改操作都会创建一个新的String副本,对其进行更改操作。
5. String、StringBuffer、StringBuilder的区别
- String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
- StringBuffer与StringBuilder大部分功能是相似的 StringBuffer采用同步处理,属于线程安全操作;
- StringBuilder未采用同步处理,属于线程不安全操作