Java核心卷 卷一 自我笔记 3.3Java的基本程序设计结构---字符串

字符串

在Java中,没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,叫String。每一个用双引号括起来的字符串都是String类的一个实例:

String e="";//这是个空串
String greeting="hello";

String 类的substring方法可以从一个较大的字符串提取一个子串。例如:

String s=greeting.substring(0,3);

创建了一个由字符"HEL"组成的字符串。从例子中可以看到,H代表了0位,L代表了3位。

和大部分语言一样,Java语言允许使用+号连接(拼接)两个字符串。

String expletive="Expletive";
String PG13="deleted";
String message=expletive+PG13;

当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如:

int age =13;
String rating="PG"+age;//PG13

这种特性经常用在输出语句中,并且将会打印出所希望的结果。

如果需要把多个字符串放在一起,用一个定界符分隔,可以使用静态join方法:
String all=String.join("/",“S”,“M”,“L”,“XL”);
//得到的字符串是 S/M/L/XL

当然,String 中没有提供用于修改字符串的方法。如果希望将greeting的内容修改为"Help",我们可以这样做:

greeting=greeting.substring(0,3)+"p!";

当然,这里,我更建议所以replace方法。

    String s = new String();
        s="hello";
        String s1 = s.replace("ello", "elp");
        System.out.println(s);// hello
        System.out.println(s1);//help

在Java中,不可变字符串有一个优点:编译器可以让字符串共享。
为了弄清具体的工作方式,可以想象将各种字符串存放在公共的存储器中。字符串变量指向存储池中的相应的位置。如果复制一个字符串变量,原始字符串与复制的字符串共享相同的字符。需要我们注意的是,一旦这个字符串被赋值(即指向了一个存储池中的位置),它就无法再改变了,例如:

  String s = new String();
        s="hello";
        s.replace("ello", "elp");
        System.out.println(s);//hello

在很多情况下,我们需要检测两个字符串是否相等。这个时候,我们就需要使用:
equals();方法
即:s.equals(t);
如果字符串s与字符串相等,返回true,否则,返回flase。
要想检测两个字符串是否相等,不分大小写,可以使用equalsIgnoreCase方法。
一定不能使用==运算符检测两个字符串是否相等!这个运算符只能确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放在不同的位置上。

字符串String中的空串与Null串
空串""是长度为0的字符串。可以调用以下代码检测一个字符串是否为空:

if(str.length()==0)
//或
if(str.equals(""))

空串是一个Java对象,用自己的串长度(0)和内容(空)。不过,String变量还可以放一个特殊的值,名为null,表示目前没有任何对象与该变量关联。

我们知道Java字符串由char值序列组成,char数据类型是一个采用UTF-16编码表示的Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码给定字符串所需要的代码单元数量。例如:

String greeting="Hello";
int n=greeting.length();// is 5.

charAt(n)将返回位置n的代码单元,n介于0 ~ s.length()-1之间。例如:

        char first = greeting.charAt(0);// H
        char last = greeting.charAt(4);//  o

在String中,我们还有其他一些方便实用的方法。例如:

new String(int[ ] codePoints,int offset,int cpCount);

用数组中从offset开始的count个码点构造一个字符串。

boolean startsWith(String prefix);
boolean endsWith(String prefix);

如果字符串以prefix开头或结尾,则返回true。

int indexOf(String str)
int indexOf(String str, int fromIndex)
int indexOf(int cp)
int indexOf(int cp, int fromIndex)

返回与字符串str或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。

int lastindexOf(String str)
int lastindexOf(String str, int fromIndex)
int lastindexOf(int cp)
int lastindexOf(int cp, int fromIndex)

返回与字符串str或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromIndex开始计算。

String substring(int beginIndex)
String substring(int beginIndex,int endIndex)

返回一个新字符串。这个字符串包含原始字符串中从beginIndex到串尾或者endIndex-1的所有代码单元。

String toLowerCase();
String toUpperCase();

返回一个新字符串,这个字符串将原始字符串中的大写(小写)字母改为小写(大写)。

String trim();
返回一个新字符串。这个字符串将删除了原始字符串头部和尾部的空格。

在之前,我们说过,拼接字符串少有+,因为Java有StringBulider类,可以实现拼接功能。首先,构建一个空的字符串构建器,当每次需要添加内容的时候,就调用append方法。在需要构建字符串时,就调用toString方法,将得到一个String对象,其中包含了构建器中的字符序列。

   StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("123");
        stringBuilder.append(456);
        String s = stringBuilder.toString();

需要注意的是,这个类的前身是StringBuffer,其效率稍低,但允许采用多线程的方式执行添加或删除字符的操作。如果所有的字符串在一个单线程中编辑,那么应该用StringBuilder 代替它。这两个类的API是相同的。

下面是一些StringBuilder 类中的重要方法:

int length();
返回构建器或缓冲器中的代码单元数量。

void setCharA(int i,char c);
将第i个代码单元设置为c。

StringBuilder insert(int offset,String str);
在offset位置插入一个字符串并返回this。

StringBuilder insert(int offset,Char c);
在offset位置插入一个字符并返回this。

StringBuilder insert(int startIndex,int endIndex);
删除从startIndex到endIndex-1的代码单元并返回this。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值