【JAVA零基础入门系列】Day6 Java字符串

  字符串,是我们最常用的类型,每个用双引号来表示的串都是一个字符串。Java中的字符串是一个预定义的类,跟C++ 一样叫String,而不是Char数组。至于什么叫做类,暂时不做过多介绍,在之后的篇章中会有关于类的详细介绍,在这里,只需要将类理解为一个模具,就像做月饼那样,想要什么外观的月饼,就选用相应的模具一压,再往烤箱里一放,便能得到我们想要的月饼。用同一个模具所做出来的月饼基本是一样的。当然,这个比喻并不十分恰当,不过就目前而已,它是有效的。声明一个String类型的变量之后,这个变量便是String类型的一个实例,就好比模具做出来的月饼,而且能使用String类型的所有方法,也具有了String的所有属性。

  String这个类有一些基本的方法,如取子串,拼接,检测是否相等 等一些常用的API。字符串处理将是我们经常用到的,所以String的熟练使用将是不可或缺的。话不多说,我们直接上代码实操。

  新建项目的方法,我就不再多说了。代码如下:

 1 package pers.frank.test;
 2 
 3 public class Test {
 4     public static void main(String[] args){
 5         String str = "我爱Java!!!";
 6         String str1 = str.substring(0,4);
 7         System.out.println("str1:"+str1);
 8 
 9         String str2 = str + "但我也爱C++。";
10         System.out.println("str2:"+str2);
11 
12         String str3 = "我爱Java!!!";
13         System.out.println(str3.equals(str));
14         System.out.println(str == str3);
15         System.out.println(str.length());
16         System.out.println(str.charAt(0));
17         System.out.println(str.charAt(2));
18         System.out.println(str.charAt(4));
19 
20         String str4 = "我爱JavaScript!!!";
21         System.out.println(str4.substring(0,4) == str1);
22     }
23 }

  第5行定义了一个字符串变量str,并给它初始化赋值。第六行,调用了String的substring方法,取了前四个字符,这个方法一共两个参数,第一个参数代表想要取的第一个字符的位置,从0开始,第二个字符代表第一个不想取的字符的位置。所以str.substring(0,4)即取字符串str的前四个字符。

  第9行定义了str2,初始化的时候将str与字符串“但我也爱C++。”用“+”号拼接了起来,组成了新的字符串。

  第12行定义了str3,同样初始化赋值为“我爱Java!!!”,String的equals方法用于判断两个字符串的内容是否相同,因为调用str3.equals(str)时,会返回true,注意,判断两个字符串是否相同时不要使用“==”,虽然在某些情况下,使用等号判断可以顺利执行,但并非所有情况都如此。使用“==”号判断时,判断的是两个字符串变量是否同时指向同一个字符串常量,而不是比较它们的内容。String在这里更像是char*,字符串变量并没有真正存储字符串的内容,而是存储它们在内存中的位置,就像户口登记簿上写的是你家的地址,而不是把你家搬到登记簿里面去。用等号判断的时候,比较的是登记薄上记载的内容是否相同,而用equals方法比较的是两个地址指向的房子是否相同(可以不是同一栋房子)。在Java中,字符串常量都是被单独存放在内存空间的,在声明str和str2的时候,会新建两个字符串常量并存储在内存空间,然后把它们在内存空间的地址赋值给这两个变量。在声明str3的时候,并没有新建新的字符串常量,因为Java编译器会让字符串常量共享,所以实际上str3跟str指向的是同一个地址。这时使用等号来判断两者是否相等时可以得到正确的结果。但并不适用所有情况,如果再声明一个字符串变量str4,赋值为“我爱JavaScript!!!”,再调用substring方法跟str1用等号进行比较时,就不能得到正确的结果了。

  第15行调用的是length方法,返回字符串的长度。

  第16-18行调用charAt方法,返回的是第几个位置上的字符。以下是运行结果:

image.png

  因为java中的字符串都是Unicode字符,所以这里的字符概念跟某语言中的字符概念不太一样,既然说到了这里,那就顺便再详细的说明一下相关的概念。

  字符是抽象的最小文本单位。它没有固定的形状(可能是一个字形),而且没有值。“A”是一个字符,“€”(德国、法国和许多其他欧洲国家通用货币的标志)也是一个字符。 

  字符集是字符的集合。例如,汉字字符是中国人最先发明的字符,在中文、日文、韩文和越南文的书写中使用。

  编码字符集是一个字符集,它为每一个字符分配一个唯一数字。Unicode 标准的核心是一个编码字符集,字母“A”的编码为 004116 和字符“€”的编码为20AC16.Unicode 标准始终使用十六进制数字,而且在书写时在前面加上前缀“U+”,所以“A”的编码书写为“U+0041”。

  代码点是指可用于编码字符集的数字。编码字符集定义一个有效的代码点范围,但是并不一定将字符分配给所有这些代码点。有效的 Unicode 代码点范围是 U+0000 至 U+10FFFF.Unicode 4.0 将字符分配给一百多万个代码点中的 96382 代码点。

  再细说可能就要说到具体的编码上来了,由于不是本篇重点,所以还是不做过多介绍了,之后会有文章专门介绍。

  关于String的方法很多,但常用的并不多,这里不全部介绍,想要了解的话可以在这里查看

  暂时不需要全部记住,只要知道有那么个函数,就可以实现那样的功能就好了,以后的多码代码自然能够记住了。

  最后,再介绍一个叫做StringBuilder的类。这个类是干嘛用的呢?主要用于多字符串的拼接和处理。那你可能会问了,既然用“+”会把两个字符串拼接起来,为啥还要这个类呢?事实上,每次声明一个新字符串变量并赋上初值的时候,如果该字符串常量不存在,则会新建一个字符串常量并存储,就像上面声明str2的时候,会新建一个字符串对象“我爱Java!!!但我也爱C++。”而不是简单的将“但我也爱C++。”加在str后面,而且如果有多次拼接,特别是在循环中使用的时候,这种方式无疑会浪费很多空间,我们需要的只是最后的字符串,而不是过程中间的产生的字符串,所以过程中生成的字符串对象并没有存储的必要,对程序而言便是存储上的浪费,这个时候StringBuilder就产生了,可以调用它的append方法来拼接字符串,这样可以节省很多不必要浪费的空间。

  事实上,如果你有了解过C或者C++的话,对char[]应该比较熟悉,StringBuilder内部便是有一个自己维护的char数组,通过动态申请内存方式进行拼接和处理。

  StringBuilder常用的方法如下:

image.png

  同样不需要全部死记硬背,在之后的练习中多加使用便能熟练掌握。

  至此,字符串的讲解告一段落,欢迎大家继续关注!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python语言中list及tuple的使用示例

Python语言中的list Python有一种内置数据类型被称为列表:list。 1.list基本定义 list是一种有序的集合,可以随时添加和删除其中的元...

33570
来自专栏决胜机器学习

有趣的算法(五) ——Dijkstra双栈四则运算

有趣的算法(五)——Dijkstra双栈四则运算 (原创内容,转载请注明来源,谢谢) 一、概念 近期看到算法书上,提到dijkstra双栈的方法,实现输入一...

68370
来自专栏青玉伏案

在Objective-C中浅谈面向对象

  接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习O...

20060
来自专栏Golang语言社区

Go 语言的基本数据类型

0)变量声明 var 变量名字 类型 = 表达式 例: var num int = 10 复制代码 其中“类型”或“= 表达式”两个部分可以省略其中的一个。 1...

438110
来自专栏轮子工厂

6. 简单又复杂的“运算符”,建议你看一哈

昨天的《5. 很“迷”的字符与字符串》初稿本来很短的,但是我觉得内容太少了,就加了一些,结果好像就变得特别多〒▽〒。

10630
来自专栏闻道于事

Java之面向对象概述,类,构造方法,static,主方法,对象

一、面向对象概述 面向过程 “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于...

34650
来自专栏老九学堂

【必读】C语言基础知识大全

C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程...

88380
来自专栏机器学习算法工程师

客官,来嘛,谷歌小菜请你尝尝!

作者:柳行刚 编辑:王抒伟 谷歌面试题 等你来挑战 详情往下看 各位,看招 1 题目描述: 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重...

30880
来自专栏柠檬先生

你不知道的javaScript笔记(4)

类型: JavaScript 有7种内置类型 空值 (null) 未定义(undefined) 布尔值(boolean) 数字(number) 字符串(stri...

23650
来自专栏xingoo, 一个梦想做发明家的程序员

【面试虐菜】—— JAVA面试题(1)

今天参加笔试,里面有设计模式,和一些基础题! 印象最深的是:什么不是Object的函数,我蒙的finalize,哎,无知! 还问了,接口与抽象类的不同,还...

22290

扫码关注云+社区

领取腾讯云代金券