在一篇文章中了解 Java 字符串数据类型

 2024-01-23 04:03:13  阅读 0

Java中的字符串类型

Java总共提供了三种类型来表示字符串:,,。

要讲为什么有三种字符串类型,我们首先需要讲一些特性。

1.它是唯一用文字常量设计的引用数据类型

String str = "hello";
System.out.println("请输入:");

评述:常量是指不可修改的数据量,与之相对应的是变量。 常量有两种类型:

(1) 符号常数;

(2)字面常量“符号常量”就是给常量起一个名字(符号)

final int STUDENT_NUM = 50;
final double PI = 3.14;
final double PRICE = 3.14;

为什么我们需要命名常量? 将商业意义带入数据量; 让修改变得容易,一旦改变,整个事情都会改变;

“文字常量”实际上更常用,但也更容易被忽略。 当我们在代码中出现:5L,-19,3.4,3.14f,'A'时,“你的年龄是:”。 所以,要注意——字面常量的特点,尤其是它的字面书写形式所代表的数据类型。

言归正传,我们不难发现,几乎所有的字面常量都是基本数据类型,只有这个引用数据类型有字面常量设计!

2.有“字符串常量池”设计

由于使用量较大,Java在设计时专门提供了“常量池”来优化文字常量。 “池”技术现在大家还是第一次接触,但未来它会大量出现。 所谓池就是在内存中预先放置一系列对象(字符串常量池就是放置的字符串常量对象)。 当需要使用的时候,暂时不需要创建,只需从池中取出一个来使用即可。

加载时,JVM会将加载的类代码中所有写入的字符串常量对象预先存储到一个特殊的内容空间——“字符串常量池”中。 然后开始执行指令语句。 当需要使用这个字符串常量对象时,直接去常量池获取即可。Demo

    String s0 = "hello";
    String s1 = "hello";

这时在加载期间,常量池中就会生成一个该类型的对象,里面的值为hello。 那么运行后,s0和s1就会被赋值为这个对象的引用。 因此,当与“==”进行比较时,我们可以得到true。

String s3 = new String("hello");

java判断字符串类型_java判断字符类型_java判断字符类型

由于使用了new语法,内存堆中会生成一个全新的对象,里面的字符值为hello。

要判断是否不为空,需要确定两个条件。

对于其他引用数据类型,只需判断“==”是否为null即可; 但有一个特殊之处。 可能不为null,但是所指向的对象不存储字符数据,是一个空字符串。因此必须通过两个条件来判断是否非空。

  //如果输入为空
if(str == null || str.equals("")){
  
}
  //如果输入不为空
if(str != null && !str.equals("")){
}      

对象的价值一旦确定,就无法更改。

这个功能其实和.net的源码设计有关。 我们可以将其视为封装的char[]。

public final class String{​
    private final char[] value;    
    /*
        还有其他属性和一大堆的方法。
    */​
}

在这个设计中,我们可以看到字符串中的数据值作为一个属性而存在,并且该属性是私有的,所以外部不能直接操作它。 您必须使用提供的方法进行操作; 同时,该属性是最终的。 所以它的值不能被修改。

JDK8之后,这个char[]被优化成了byte[]。 由于并非所有字符都需要 2 个字节的空间,许多字符只需要 1 个字节的空间。

这种内容不可更改的特性会带来新的问题。 当我们在程序中进行大量的字符串拼接或者需要修改字符串内容时,就会生成很多的字符串对象。 因此,Java设计了一种新的字符串类型来专门解决这个问题。

它是JDK5中提出的辅助字符串类型。 其最大的特点是:内容可变。 注意:它不是一个类型,而是一个新类型,所以下面的代码是错误的:

StringBuilder sb = "hello";
System.out.println(sb + "world");

既然是为了弥补不可变内容的缺点,那么它提供的方法几乎都是修改内容的方法。

1.()方法用于在字符串末尾添加内容。 为了方便在末尾添加多种数据类型,提供了大量的重载方法。

2、()方法用于删除字符串中从起始下标到结束下标的指定内容。

3.()方法用于在字符串的指定位置插入新内容。 它的第一个参数是插入位置的索引。

4、()方法用于将字符串中指定位置的内容替换为新的内容。 也是一个可变的字符串序列,具有完全相同的构造函数和提供的行为。 唯一的区别是:它是线程安全的。

Java字符串

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码