字符串入门

来源:互联网 发布:unity3d按轨迹运动 编辑:程序博客网 时间:2024/05/28 11:49

前言

字符串的操作是非常基础的东西,之前做的一些程序Demo也都频繁的使用到了字符串,发现了很多自身不足的地方,所以这个整理是有必要的。这里摘录了很多《Java语言程序设计》上的语句,主要供自己记忆混乱时可以随时查看。

先放一张说明Java数据类型的图

Java数据类型


Java基本数据类型

这是一篇介绍Java数据类型的博文,下面开始整理String


String类型

String类型属于引用类型(reference type)。任何Java类都可以将变量表示为引用类型。使用引用类型声明的变量称为引用变量,它引用一个对象。

String sentence="Hello World!";

这里的sentence就是一个引用变量,它引用一个内容为Hello World的字符串对象。

下面列出一些String对象的简单方法,这些方法只能从一个特定的字符串实例(这里设为s)来调用:

  • length():返回字符串中的字符数

  • charAt(index):返回字符串s中指定位置的字符

  • contact(s1):将本字符串和字符串s1连接,返回一个新字符串

  • toUpperCase():返回一个新字符串,其中所有的字母大写

  • toLowerCase():返回一个新字符串,其中所有的字母小写

  • trim():返回一个新字符串,去掉了两边的空白字符

由于这些方法只能从一个特定的字符串实例来调用,这些方法称为实例方法,而非实例方法我们成为静态方法静态方法可以不使用对象来调用。比如定义在Math类中的所有方法都是静态方法。它们没有绑定到一个特定的对象实例上。


调用一个实例方法的语法是:

reference-Variable.methodName(arguments)

一个方法可以有一个或多个参数,或者也可以无参。


调用一个静态方法的语法是:

ClassName.methodName(arguments)

String类

String对象是不可改变的。字符串一旦创建,内容不能再改变。


构造字符串

可以用字符串直接量字符数组创建一个字符串对象。


使用如下语法,用字符串直接量创建一个字符串:

String newString=new String(stringLiteral);

参数StringLiteral是一个括在双引号内的字符序列。

由于Java将字符串直接量看作String对象,所以下面两种写法都是合法的:

String sentence=new String("Hello World!");
String sentence="Hello World!";

现在来用字符数组创建字符串。下面的语句可以构造一个字符串”Hello World!”:

char [] charArray={'H','e','l','l','o',' ','W','o','r','l','d','!'};String sentence=new String(charArray);

String变量存储的是对String对象的引用,String对象里存储的才是字符串值。严格来说的话,术语String变量、String对象和字符串值是不同的。但在大多数情况下会忽略它们之间的区别。


不可变字符串与限定字符串

String对象是不可变的,它的内容不能改变。比如:

String a="Apple";a="Google";

第一条语句创建了一个内容为”Apple”的String对象,并将其引用赋值给了a。
第二条语句创建了一个内容为”Google”的新String对象,并将其引用赋值给a。
但是赋值后,第一个String对象是仍然存在的,只是不能再通过a来访问它罢了,因为变量a现在指向了新的对象。


由于字符串在程序设计中是不可变的,但同时又会频繁地使用到它,所以Java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串直接量使用同一个实例。这样的实例称为限定的(interned)字符串

举个栗子:

String s1="Hello World!";String s2=new String("Hello World!");String s3="Hello World";System.out.println("s1==s2 is "+(s1==s2));System.out.println("s1==s3 is "+(s1==s3));

运行结果会显示:

s1==s2 is falses1==s3 is true

这是因为s1和s3指向相同的限定字符串”Hello World!”,而s1和s2尽管内容相同但它们是不同的字符串对象。


字符串的替换和隔离

字符串一旦创建,它的内容就不能改变。但是String类提供了替换和分隔字符串的方法(方法replace、replaceFirst和replaceAll会返回一个源自原始字符串的新字符串,但并未改变原始字符串。):

  • replace(oldChar,newChar):将字符串中所有匹配的字符替换成新的字符,然后返回新的字符串。

  • replaceFirst(oldString,newString):将字符串中第一个匹配的子字符串替换成新的子字符串,然后返回新的字符串。

  • replaceAll(oldString,newString):将字符串中所有匹配的子字符串替换成新的子字符串,然后返回新的字符串。

  • split(String):返回一个字符串数组,其中包含被分隔符分隔的子字符串集。

例:

"Welcome".replace('e','A') //返回一个新的字符串,WAlcomA"Welcome".replaceFirst("e","AB") //返回一个新的字符串,WABlcome"Welcome".replaceAll("e","AB") //返回一个新的字符串,WABlcomAB"Welcome".replace("el","AB") //返回一个新的字符串,WABcome

split方法可以从一个指定分隔符的字符串中提取标识。例:

String[] tokens="Facebook#Linkedin#Apple#Google".split("#");for(int i=0;i<tokens.length;i++)    Sytem.out.print(tokens[i]+" ");

结果为:

Facebook Linkedin Apple Google

正则表达式

直接贴教程不废话,正则表达式是世界上最帅的东西之一~

正则表达式30分钟入门教程

正则表达式语法


字符串与数组之间的转换

字符串不是数组,但是字符串可以转换成数组,反之亦然。
将字符串转换成一个字符数组可以使用toCharArray方法。

char[] chars="Java".toCharArray();

则,chars[0]是’J’,chars[1]是’a’,chars[2]是’v’,chars[3]是’a’。


还可以使用方法getChars(int srcBegin,int srcEnd,char[]dst,int dstBegin)将下标从srcBegin到srcEnd-1的子串复制到字符数组dst中下标从dstBegin开始的位置。

例如:

char [] dst={'J','A','V','A','c','u','t'};"HiBoy".getChars(2,5,dst,4);

于是dst就变成了{‘J’,’A’,’V’,’A’,’B’,’o’,’y’}


若要将一个字符数组转换成一个字符串,应该使用构造方法String(char[])或者方法valueOf(char[]):

String str=new String(new char[]{'J','a','v','a'});String str=String.valueOf(new char[]{'J','a','v','a'})

将字符和数值转换成字符串

  • 通过Integer.parseInt(str)可以将一个字符串转换为一个int值,那么反过来也可以使用字符串的连接操作符(+)来将字符或者数字转换为字符串。

  • 使用重载的静态valueOf方法也可以将字符和数值转换成字符串。
    例如要将double值1.25转换成字符串,可以使用String.valueOf(1.25)。返回值是由字符‘1’、’.’、’2’和’5’构成的字符串。



StringBuilder和StringBuffer类


StringBuilder和StringBuffer类似于String类,区别在于String类是不可改变的


StringBuilder/StringBuffer类比String类更灵活。我们可以给StringBuilder或StringBuffer中添加、插入或追加新的内容,但String对象一旦创建,它的值就确定了。


StringBuffer类和StringBulider类最大的区别在于StringBuffer中修改缓冲区的方法是同步的,这意味着只有一个任务被允许执行方法。

如果是多任务并发访问,就使用StringBuffer,因为这种情况下需要同步以防止StringBuffer崩溃。而如果是单任务访问,则使用StringBuilder会更有效。


参考书籍:《Java语言程序设计》| 梁勇.著 | 戴开宇.译

0 0