【JavaSE】数据类型与变量

数据类型与变量

1. 字面常量

常量就是程序运行期间,保持不变的量,通常保存在常量池

举例:

  1. 字符串常量:“12345”、“hello world”
  1. 字符常量:’A’,’1’
  2. 布尔常量:true、false
  3. 整形常量:100
  4. 浮点型常量:3.14
  5. 空常量:null

2. 数据类型

分为:基本数据类型和引用数据类型

2.1 基本数据类型

有四类八种:

  1. 四类: 整型、浮点型、字符型、布尔型

  2. 八种:

    数据类型 关键字 内存占用 范围
    字节型 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

    注意:

    1. 无论在多少位的机器中,整形都是4字节、单精度浮点数都是4字节,其他类型同理。
    2. 整形默认是int,浮点型默认是float
    3. 整形和浮点型都是带有符号的。
    4. char属于基本数据类型

2.2 引用数据类型

有6类:

  1. 类(Class) : 用于引用任何类的实例。例如,StringIntegerArrayList 等。
  2. 接口(Interface) : 用于引用实现了该接口的任何类的对象。接口类型可以作为方法的参数类型、返回值类型,以及变量的类型。
  3. 数组(Array) : 用于存储固定大小的同类型元素序列。数组类型由基本数据类型(如 int[]double[])或引用数据类型(如 String[]Integer[])组成。
  4. 枚举(Enum) : 用于定义一组常量。枚举类型可以作为变量类型,这些变量只能赋值为枚举中定义的常量之一。
  5. 注解(Annotation) : 用于为程序元素(类、方法、变量等)提供元数据。注解类型通常用于编译时处理,而不是在运行时使用。
  6. 类型变量(Type Variable) : 在泛型编程中,类型变量允许你为类、接口或方法指定一个占位符类型,这个类型在实例化时会被具体类型替换。

注意:

  1. String属于引用数据类型。

  2. 所有引用类型都继承自Java.lang.Object类

    这意味着所有的引用类型都拥有以下方法:

    【JavaSE】数据类型与变量_第1张图片

  3. 引用类型还有垃圾回收方法(Garbage Collection),当对象不在被任何引用对象引用时,JVM会自动回收其占用的内存。

  4. 引用类型变量通常以大写字母开头,这是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. 使用字符串常量

    // 1.使用常量串构造
    String s1 = "hello bit";
    
  2. 使用new String() 的构造方法

    // 2.直接newString对象
    String s2 = new String("hello bit");
    
  3. 使用字符数组

    // 3.使用字符数组进行构造
    char[] array = {'h','e','l','l','o','b','i','t'};
    String s3 = new String(array);
    

4.2 String 对象的比较

因为String是引用类型,所以其本身并不存储对象的实际数据,只存储对象在内存中的地址

所以在使用 ”==“ 进行判定两个String对象是否相等时,会将他们的地址相比较,会有两种情况:

  1. 使用字符串常量进行构造String对象

    这种情况下,JVM会将两个String对象都指向同一个内存地址,也就是说,这个字符串常量只在常量区保存了一份

  2. 使用new String() 构造方法构造String对象

    这种情况下, JVM会在堆上构造两份内容相同的String对象,也就是说,这两个String指向不同。


所以,我们在比较字符串的时候,会选择使用eqluals()方法进行比较,直接上源码:

【JavaSE】数据类型与变量_第2张图片

可以看出,equals()方法是在对于字符串的具体内容进行比较。

String对象中的字符串军保存在类中的value属性中(是一个char[])。

4.3 字符串的不可变性

由于String中的内容均保存在private final char value[];中,所以不可对于String中的内容进行更改(final对象)。

final表示value这个字符数组不可指向其他的字符数组,而并非abc不可进行改变
【JavaSE】数据类型与变量_第3张图片

例如,考虑以下代码:

public class test2 {
    public static void main(String[] args) {
        final StringBuilder s = new StringBuilder("abc");
        s.append("xyz");
        System.out.println(s);
    }
}

运行结果:
【JavaSE】数据类型与变量_第4张图片

在上述代码中,尽管s变量被final修饰,但是仍然可以通过append()方法对其指向的内容进行更改。

这并不是对于s进行更改,而是对于s指向的内存内容进行更改。
【JavaSE】数据类型与变量_第5张图片

str是想要append()的对象,getChars()是对于value的count位置处,加上长度为len的str字符数组。

所以任何对于String对象的更改操作都会创建一个新的String副本,对其进行更改操作。

5. String、StringBuffer、StringBuilder的区别

  1. String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  2. StringBuffer与StringBuilder大部分功能是相似的 StringBuffer采用同步处理,属于线程安全操作;
  3. StringBuilder未采用同步处理,属于线程不安全操作

你可能感兴趣的:(java,java,前端,数据库)