Java八大数据类型和String

JAVA基本数据类型

JAVA基本数据类型: byte,short,int,long为整型;float,double为浮点型;char为字符型;boolean 为布尔类型
在这里插入图片描述

基本类型间的转换

存储范围小的类型到存储范围大的类型: 自动转换
byte → short(char) → int → long → float → double

从存储范围大的类型到存储范围小的类型(使用强转,可能会损失精度)
double → float → long → int → short(char) → byte

String

八大基本本数据类型存在栈(stack),String的对象实例存在堆(heap),除此之外还要明白一个概念,常量池。

       	String s1 = "abc";              // String 直接创建
        String s2 = "abc";              // String 直接创建
        String s3 = s1;                    // 相同引用
        String s4 = new String("abc");   // String 对象创建
        String s5 = new String("abc");   // String 对象创建

在这里插入图片描述

以上代码的执行过程是这样的:

String s1= “abc”, 首先看常量池中有没有“abc”这个字符串,显然没有,那么在常量池中创建一个“abc”字符串, s1 指向这个字符串。

String s2 = “abc”, 在常量池中找到了字符串“abc”,那么 s2直接指向这个串。

如果遇到new,那么就不在常量池中找了,直接在堆中创建实例。

验证结果

 		System.out.println(s1 == s2);
        System.out.println(s1 == s3);
        System.out.println(s1 == s4);
        System.out.println(s4 == s5);

在这里插入图片描述
如果仅仅是想判断字符串值相等,那么就使用equals。

String 特性

String类 是final修饰的,不可以被继承。

String类的底层是基于char数组的。

String类被设计成不可变(immutable)类,所以它的所有对象都是不可变对象,线程安全,不会有并发问题。

字符串连接

    public static void main(String[] args) {
        String str = "a"+"b"+"c";
        System.out.println(str);
    }

这段代码会产生几个String对象呢,使用javap查看其字节码,可以看出只有一个
在这里插入图片描述

String str = "a";
        String str2 = "b";
        String str3 = "c";
        str = str+str2+str3;
        System.out.println(str);`

这段代码查看源代码,可以看出生成了4个String对象,先是创建了str,str2,str3 ,然后用StringBuilder将他们append起来,返回新的一个String对象在这里插入图片描述

StringBuffer 和StringBuilder

由于String的不可变性,对其任意的修改都会产生一个新的对象,如果需要频繁变更,那就要使用StringBuffer和StringBuilder

StringBuffer 线程安全,但效率慢
StringBuilder 线程不安全,但效率快

String,StringBuffer,StringBuilder

原文地址:https://www.cnblogs.com/ryyy/p/14228225.html