美文网首页
在 Java 中解开你的字符串

在 Java 中解开你的字符串

作者: 小城哇哇 | 来源:发表于2022-08-31 10:54 被阅读0次

    在任何编程语言中,要执行任何类型的计算,您总是使用数值(Int、float、double 等)、布尔和字符串类型的数据。据说它们是核心或原始数据类型,您甚至需要创建复杂的结构/类,并且详细了解这些总是有助于您设计更好的代码,并选择正确的数据组合以从您的函数/程序中获得准确的输出.

    在本文中,我们将深入探讨字符串的概念。了解它们在 Java 中是如何工作的,以及您可以对它们执行的所有操作,因此无需任何费用,让我们开始吧!

    java中的字符串是什么?

    字符串?你首先想到的问题是它们是什么?它们长什么样?他们的回答非常简单,就像在我们的英语语法中一样,字符串只不过是集合,是一些字符(字母和符号)放在一起。它不是一个你有意义或没有意义的字符串,直到是一组字符,它是一个字符串。例如“This is a sample String”,甚至“zxczxvc adsad qwe”也是一个字符串。

    不同的编程语言有不同的表示字符串的方式,例如有些表示为'hello world'或“hello world”,需要注意的是字符串可以以单引号-'或双引号-“”开头。同样通过语言设计,语言有可能不直接支持字符串类型,它们可能支持字符作为原始类型,并且可以通过这些字符的组合形成字符串。如果语言支持字符类型,则字符始终以单引号开头,而字符串将以双引号开头。

    无论如何,背景已经足够了,回到我们在这里学习的语言是 TADA ...... Java,这里的 String 不是原始数据类型,即使它包含在语言中。Java 支持字符类型,即。char数据类型。让我们看看它的例子:

    字符类型示例:

    char thisIsa = 'a';
    char thisIsA = 'A';
    
    

    只是为了你的信息thisIsa不等于thisIsA。有很多关于角色的知识我们不会深入研究(您可以从这里了解更多关于它们的信息 → chetangupta.net)。

    字符串类型示例:

        String thisIsA = "A";
        String thisIsa = "a";
    
    

    同样去那里thisIsa不等于thisIsA,因为字符串是区分大小写的。希望您现在了解有关字符串的要点和背景……

    如果是这样,给我解谜?

        char thisIsA = 'A';
        String thisIsAlsoA = "A";
    
    

    既然我们说字符串是字符序列的集合,那么字符串变量thisIsAlsoA是否等于thisIsA?如果你好奇地想,如果你直到文章结尾都找不到棒子……

    如何创建字符串对象?

    让我们深入了解 Java 中的字符串创建过程。我们使用双引号创建 String 的方式称为创建String Literal

    例子 :

        String a = "A";
        String greet = "Hello World!";
        String pokemon = "Pikachu";
    
    

    创建它的其他方法是 using String Object,因为我们知道在 Java 中创建对象是使用new运算符完成的,因此我们将创建类似的字符串String apple = new String(``"``apple``"``);

    更多示例:

        String a = new String("A");
        String greet = new String("Hello World!");
        String pokemon = new String("Pikachu");
    
    

    你可能会想有什么区别?还有为什么我应该使用 Object 方法创建它,看起来更冗长?好吧,您需要了解 Java 内存模型的幕后实际发生了什么。

    当我们创建 String Literal 时,JVM 会在 String Pool 中查找相同的值是否已经存在。如果找到,它将返回对象引用,如果没有,则创建具有给定值的新字符串对象并存储在字符串池中。

    PS:要了解更多关于字符串池结帐chetangupta.net

    而当我们使用new运算符创建对象时,会发生两件事,我们传递的字符串值会检查并放入字符串池中,但字符串的对象是创建到堆内存中的。因此这个方法需要更长的时间来执行,另一方面要记住的是它每次都会构造一个新对象。

    好的,知道这个背景很好,但它如何解释new操作员用例?让我们理解:

    字符串文字是字符串对象,但字符串对象并不总是字符串文字。字面量也表示固定值,即常量,这意味着字符串字面量一旦创建就不能修改,因此通常说 Java 字符串是不可变的。稍后我们将详细讨论它们。但是 String Object 不同,它被设计为可以变异的。

    因此,每当我们处理需要大量更新的字符串时,我们会更喜欢字符串对象而不是字符串文字。

    总是喜欢使用StringBuffersStringBuilders制作需要大量修改的字符串对象。因为StringBuilders它们比 StringBuffers 更现代并且具有更多功能。

    例子 :

        StringBuilder greetBuilder = new StringBuilder("");
    
        greetBuilder.append("hello");
        greetBuilder.append(" ");
        greetBuilder.append("World");
        greetBuilder.append("!");
    
        String greet = greetBuilder.toString();
        System.out.println(greet) // output : hello World!
    
    

    希望您现在了解字符串对象与字符串文字的作用。

    字符串操作和方法:

    现在有趣的部分来了,让我们探索一下我们可以对 String 数据类型执行哪些可能的操作:

    字符串长度:

    如果您想知道字符串的长度,即字符串中的字符总数,请使用函数length()而不是字符串示例:

        String apple = "Apple";
        println(apple.length()); // output --> 5
    Character at Index :
    
    

    由于 String 是一个字符序列,我们可以根据给定的索引获取字符。所以我们可以使用索引获取字符charAt(index)

    例子 :

        // if we want to get `l` from string apple then
        String apple = "Apple";
        println(apple.charAt(3)); // output --> `l`
    
    

    注意:请理解字符串是不可变的,即您可以读取索引处的值但不能更新给定索引上的值,即setCharAt(index)字符串上没有类似的函数。

    字符串的连接/添加:

    我们可以使用函数将两个字符串(也称为连接)添加到单个字符串中concat()。注意:我们操作后得到的新连接字符串将是新字符串,因为字符串是不可变的。

    例子 :

        String apple = "Apple";
        String orange = "Orange";
        println(apple.concat(orange)); // output --> AppleOrange
        println(orange.concat(apple)); // output --> OrangeApple
    
    

    子字符串:

    子字符串意味着根据给定的索引获取字符串的一部分。为此有两种重载函数方法:

    1. subString(int startIndex) : String:它将返回从开始索引到字符串结尾的字符串
    2. subString(int startIndex, int endIndex):String :它将返回从开始索引到结束索引的字符串

    例子 :

        String orange = "Orange";
        println(orange.substring(/*StartIndex*/4)); // output --> ge
        println(orange.substring(/*StartIndex*/1,/*EndIndex*/5)); // output --> rang
    
    

    包含:

    我们使用 Contains 来检查 String 是否包含另一个字符串。注意:在后台它检查 CharSequence 以获得比检查每个单词更快的评估。(从这里了解更多信息:chetangupta.net

    例子 :

        String orange = "Orange";
        println(orange.contains("range")); // output --> true
        println(orange.contains("apple")); // output --> false
    
    

    加入字符串:

    Join 顾名思义,它将连接两个字符串,但您可能想知道 join 和 concat 之间有什么区别?

    1. 只需查看他们收到的参数,对于 Join,您可以为字符串传输 'n' 数字,但对于 concat 它只能使用两个字符串,
    2. 加入作为提供分隔符/分隔符的能力,即在合并字符串时使用的符号。
    3. 与 concat 不同,Join 是 String 类的静态函数。

    例子 :

        String apple = "Apple";
        String orange = "Orange";
        String berry = "StrawBerries";
        String seperator = "|";
        println(String.join(seperator,apple,orange,berry)); 
        // output --> Apple|Orange|StrawBerries
    
    

    与字符串比较:

    只是为了让您知道,当我们执行比较操作时,我们会审查两个项目是否相等,第一个项目大于(>)第二个项目或第一个项目小于(<)第二个项目。

    在编程中,比较函数返回整数值来表示相同的场景。

        if item1 == item2 then returns 0,
        if item1 > item2 then returns 1,
        if item1 < item2 then returns -1,
    
    

    在字符串中,这些比较是基于字典(字典顺序)的,即

        if string1 == string2 then returns 0
        if string1 > string2 then returns 1, (string 1 comes ahead in dictinoary order)
        if string1 < string2 then returns -1, (string 2 comes ahead in dictinoary order)
    
    

    在 Java 中,我们有两个函数用于比较 Java 中的字符串。

    1. compareTo():这比较两个字符串,但区分大小写。
    2. compareToIgnoreCase():这比较两个字符串,但不区分大小写。

    让我们看看例子:

        // case sensitive comparison
        String apple = "Apple";
        println(apple.compareTo("Apple")); // output  --> 0
        println(apple.compareTo("apple")); // output  --> -32
    
        // case in-sensitive comparison
        String apple = "Apple";
        println(apple.compareToIgnoreCase("Apple")); // output  --> 0
        println(apple.compareToIgnoreCase("apple")); // output  --> 0
    
    

    字符串中的大小写:

    我们可以使用两个函数来控制字符串字符的大小写:

    1. toUpperCase():此函数将输出字符串中的所有字符大写,
    2. toLowerCase():类似地,这个函数将输出字符串中的所有字符小写。
        String apple = "ApPlE";
        println(apple); // output --> ApPlE
        println(apple.toUpperCase()); // output --> APPLE
        println(apple.toLowerCase()); // output --> apple
    
    

    剥离空白:

    字符串值通常可以从开头或结尾包含空格。注意:字符之间的空格不是空格。我们可以使用trim()函数来删除它们。

        String appleTrimmed = " apple ".trim();
        println(appleTrimmed) // output --> apple
        println(appleTrimmed.length()) // output --> 5
    
    

    替换字符串中的字符:

    如果要将字符从旧字符替换为新字符。

    注意:请记住,替换字符是字符串与在字符串中的某个索引处设置字符的过程不同。字符串不可变的规则也将应用在那里,因此当您尝试替换字符时,您会得到一个带有替换字符的全新字符串。

    例子 :

        String apple = "apple";
        println(apple.replace("a","pinea")); // output --> pineapple
    
    

    使用“+”运算符进行字符串连接

    我们已经看到了连接两个字符串的两种方法,一种是 concat,另一种是 join,但是你会遇到一个非常常见的连接两个字符串的模式是“+”。

    使用“+”运算符与 concat 函数的工作方式非常相似。例子 :

        String apple = "apple";
        String orange = "Orange";
        String berry = "StrawBerries";
    
        println(apple.concat(orange).concat(berry)); // output --> appleOrangeStrawBerries
        println(apple + orange + berry); // output --> appleOrangeStrawBerries
    
    

    我们应该使用哪一个?

    在我们看来,比较“concat()”和“+”,“+”运算符似乎更具可读性,但在数字类型数据中使用时要小心。

    例子 :

        int orangeCount = 5;
        int berryCount = 5;
        println("fruits count:" + orangeCount + berryCount); 
        // wrong output --> fruits count:55
    
        println("fruits count:" + (orangeCount + berryCount)); 
        // right output --> fruits count:10
    
    

    但正如我们建议的与 concat 相同的问题,由于字符串是不可变的,我们基本上创建新字符串更好更快的方法是使用 StringBuilder。

    创建格式字符串

    我们已经介绍了字符串的许多核心功能,并且我们可以清楚地看到一个用例,在该用例中,我们将字符串附加到字符串、浮点数、数字等……如果我们可以在字符串中包含占位符值,并且在运行时这些占位符会怎么样可以替换为我们想要输入的值吗?

    这就是String.format()函数的作用。我们使用占位符/说明符创建一个字符串,并用值填充它们,我们也将这种类型的字符串称为模板字符串。

    我们对不同类型的数据类型使用不同的说明符,最常用的一次是:

    1. %b 为布尔值,
    2. %s 用于字符串,
    3. %d 仅用于整数数字
    4. %f 用于浮点数

    还有其他的,您可以从这里阅读更多内容:chetangupta.net

    例子 :

    println(String.format("%s has %d apple, and %d oranges", "John Doe", 3, 2));
    // output --> John Doe has 3 apple, and 2 oranges
    
    

    注意:值根据它们在函数参数中的出现被放置到模板位置,

    与 concat 或 plus 运算符相比,此方法在处理非常长的字符串时很有用。性能方面它不如 StringBuilder 好,因为它需要在生成字符串之前解析整个字符串和参数。

    字符串中的转义字符

    当我们使用长字符串时,如果我们尝试将其分成两部分,您最容易想到的就是按 Enter 并在下一行继续使用您的字符串,但如果您尝试这样做,编译器将处理你语法错误,例如:

        String message = " 
            I want to make 
            very lengthy String!
        ";
    
    

    要执行这些功能,您需要在字符串中使用特殊字符来\n在字符串中添加新行。

        String message = "\nI want to make\nvery lengthy String!";
        /* 
        * Output :
        * I want to make
        * very lengthy String!
        */
    
    

    转义字符:

    \t → add horizontal tab 
    \n → add new line
    \’ → add single quotes in String
    \” → add double quotes in String
    \\ → add backslash in the String
    
    

    例子 :

        String message = "Hello\tWorld!";
        println(message); // output --> Hello  World!
    
        message = "Hello\nWorld!";
        println(message); 
        /*
        * Output -->
        *  Hello
        *  World!
        */
    
        message = "Hello\'World\'!";
        println(message); // output --> Hello'World'!
    
        message = "Hello\"World!\"";
        println(message); // output --> Hello"World!"
    
        message = "Hello\\World!\\";
        println(message); // output --> Hello\World!\
    
    

    Java 字符串是不可变的

    如果您通读整篇文章,您就会一次又一次地重复这句话。这是因为它是 Java 字符串发挥作用的主要机制。

    将 String 设置为不可变的关键原因是具有缓存、性能和安全性的好处。

    String 是任何程序中使用最广泛的数据结构,JVM 通过在 String 池中仅存储每个 String 的一个副本来优化为它们分配的内存量。

    因此缓存字符串文字并重用它们可以节省大量堆空间,因为不同的字符串变量引用字符串池中的同一个对象,从而节省了关键的内存资源并提高了应用程序的性能。

    String 不可变的另一个优点是它们是线程安全的,因此并发环境中的 String 可以安全地读取和更新。

    奖励:谜语解决方案

       char thisIsA = 'A';
        String thisIsAlsoA = "A";
    
    

    isthisIsAlsoA等于thisIsA? 这是我们问的谜语。

    如果您认为是,那么对不起,伙计!您错了。从概念上讲你是对的,这应该是正确的,但问题是 Java 不是动态类型的语言,它是静态类型的。因此类型在这里扮演着重要的角色。由于 String 和 char 的类型不匹配,因此失败。它不会在 JavaScript 这样的语言中失败。

    还有一件事...... String 是 char 的集合,对吧?,因此我们可以使用 将我们的 String 转换为 Character Array toCharArray(),因为 Array 是一个集合,因此以编程方式证明我们的语句是正确的,如果我们将数组的第一个索引位置与字符进行比较,它将是相等的. 好的 !

    结论

    让我们回顾一下:

    1. 我们了解到字符串是字符序列的集合
    2. 在 Java 中,我们可以通过两种方式创建字符串 - 字符串字面量和字符串对象
    3. 我们可以对字符串执行各种操作 - 连接、长度、比较等等
    4. 什么是字符串中的特殊转义字符
    5. 最重要的是为什么 String 是不可变的!

    我们希望您学到了很多,并解开了围绕 Java String 的所有奥秘和疑虑。

    文章来源:https://ch8n.hashnode.dev/untangle-your-strings-in-java-cl36y41xp02wgmgnv0ym83yi8

    相关文章

      网友评论

          本文标题:在 Java 中解开你的字符串

          本文链接:https://www.haomeiwen.com/subject/lchdnrtx.html