在 Java 中解开你的字符串

在任何编程语言中,要执行任何类型的计算,您总是使用数值(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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容