这一节来学习String的特性和方法。

一、String对象的不变性

不变性:String对象是由一个final char[] value 数组实现的,因此String对象是不可变的。任何看起来改变String对象的行为,其实质就是创建了一个新的对象。

示例一:

public class Demo1 {

    public static String upcase(String s) {
return s.toUpperCase();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = "abc";
String s2 = upcase(s1);
System.out.println("s1: " + s1);
System.out.println("s2: " + s2);
} }

输出结果:

s1: abc
s2: ABC

结果说明:可以看到s1所指向的对象没有发生变化,得到的只是一个新的String。

二、String、StringBuilder、StringBuffer

1、区分String、StringBuilder、StringBuffer

这三个类都是继承自CharSequence,他们都是字符序列,只不过类型不同特点不同罢了。

String:底层实现是使用final char[] value数组实现,所以String对象的内容不可更改。

StringBuilder:可以在原序列上进行append和insert等操作,来改变原字符序列的内容,不过它是线程不安全的。

StringBuffer:它和StringBuilter用法一样,但是它是线程安全的,要花费更大的代价,自然就没有StringBuilter快。

2、StringApI

我这里并没有全列出,挑几个熟悉一下就好,也没有必要全部记得。

 package stringdemo;

 public class Demo2 {

     public static void main(String[] args) {
//使用byte数组初始String
String s = new String(new byte[] {0x61, 0x62, 0x63, 0x64, 0x65});
System.out.println("[1] s: " + s);
//length()返回String的长度
System.out.println("[2] length(): " + s.length());
//charAt()返回指定索引处的Char值
System.out.println("[3] charAt(): " + s.charAt(0));
//contains()是否包含参数内容
System.out.println("[4] contains(): " + s.contains("abc"));
//contentEquals()两个String内容全等,则为true
System.out.println("[5] contentEquals(): " + s.contentEquals("abcde"));
//concat()链接字符串
System.out.println("[6] concat(); " + s.concat("fg"));
//返回指定数组的String形式
System.out.println("[7] copyValueOf(): " + String.copyValueOf(new char[] {'x', 'y', 'z'}));
//equalsIgnoreCase()忽略大小写,全等则相等
System.out.println("[8] equalsIgnoreCase(): " + s.equalsIgnoreCase("ABCDE"));
//endsWith()匹配指定后缀
System.out.println("[9] endsWith(): " + s.endsWith("de"));
//starsWith()匹配指定前缀
System.out.println("[10] startsWith(): " + s.startsWith("ab"));
//返回一个代表String内容的char数组
char[] chars = new char[10];
s.getChars(0, 5, chars, 0);
System.out.print("[11] getChars(): ");
for(char c : chars) {
System.out.print(c + " ");
}
System.out.println();
//返回一个代表String内容的byte数组
byte[] bytes = s.getBytes();
System.out.print("[12] getBytes(): ");
for(byte b : bytes ) {
System.out.print(b + " ");
} System.out.println(); //换回指定字母在String序列中的下标
System.out.println("[13] indexOf(): " + s.indexOf('c'));
//String与正则表达式是否相匹配
System.out.println("[14] matches(): " + s.matches("[a-f]+"));
//返回String的子串
System.out.println("[15] substring():" + s.substring(1,3));
//返回数组的String形式
System.out.println("[16] valueOf(): " + String.valueOf(new char[] {'u', 'v', 'w'})); } }

输出结果:

[1] s: abcde
[2] length(): 5
[3] charAt(): a
[4] contains():  true
[5] contentEquals(): true
[6] concat(); abcdefg
[7]  copyValueOf(): xyz
[8] equalsIgnoreCase(): true
[9] endsWith(): true
[10] startsWith(): true
[11] getChars(): a b c d e

3、在循环中使用StringBuilder更加高效

 public class Demo4 {

     public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder s = new StringBuilder("[");
for(int i = 0; i < 10; i++) {
s.append(i);
s.append(", ");
}
s.delete(s.length()-2, s.length());
s.append("]");
System.out.println(s);
} }

输出结果:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

结果说明:对String的链接操作编译器都会生成StringBuilder对象,因为StringBuilder更加高效,在循环中使用StringBuilder对象,编译器就只会生成一个StringBuilder对象,如若使用String,则编译器会生成很多StringBuilder对象。

第十三章 字符串(一)之 String的更多相关文章

  1. 第5章 字符串----char与String

    1.java有8种基本数据类型: 数值型:整数类型(byte,short,int,long) :浮点类型(float,double) 字符型:char  布尔型:true,false 2.char:  ...

  2. 《Java编程思想》笔记 第十三章 字符串

    1.String对象不可变 String对象不可变,只读.任何指向它的引用都不能改变它的内容.改变String内容意味着创建了一个新的String对象. String 对象作为方法参数时都会复制一份引 ...

  3. java编程思想第四版第十三章字符串 总结

    1. String和StringBulider的使用 通过书中介绍, 我们得知如下结论: 当使用+连接符将字符串进行拼接的时候, 编译器会进行自动优化为使用StringBuilder连接字符串. 当在 ...

  4. java编程思想第四版第十三章字符串 习题

    fas 第二题 package net.mindview.strings; import java.util.ArrayList; import java.util.List; /** * 无限循环 ...

  5. 第十三章 字符串 (四)之Scanner类

    一.Scanner简述 Scanner扫描器类本质上是由正则表达式实现的,可以接受任何能产生数据的数据源对象,默认以空白符进行分词(包括\n等),使用各种next方法进行扫描匹配,获取匹配的数据. 二 ...

  6. Gradle 1.12用户指南翻译——第二十三章. Java 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  7. 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》

    二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro  目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...

  8. 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)

    建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...

  9. 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记

    第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...

随机推荐

  1. 北京清北 综合强化班 Day4

    财富(treasure) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是以 ...

  2. 【luoguP1182】数列分段 Section II

    题目描述 对于给定的一个长度为N的正整数数列A-i,现要将其分成M(M≤N)段,并要求每段连续,且每段和的最大值最小. 关于最大值最小: 例如一数列4 2 4 5 1要分成3段 将其如下分段: [4 ...

  3. 泛目录程序(莲花泛目录程序/黑帽SEO/寄生虫/莲花泛目录解析/泛目录软件)

    莲花泛目录程序强大之处: 1.内容分类详细2.自动推送URL链接3.内置超强原创内容功能系统,页面深受百度搜索引擎喜爱.4.蜘蛛触发繁殖:蜘蛛触发程序任何页面,程序自动生成独立页面并引导繁殖.5.操作 ...

  4. codeforces gym #101161G - Binary Strings(矩阵快速幂,前缀斐波那契)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: $T$组数据 每组数据包含$L,R,K$ 计算$\sum_{k|n}^{}F(n)$ 定义 ...

  5. Elasticsearch6.5.1破解x-pack,设置密码并使用head插件登陆。

    #没有许可证的es无法持久的设置密码,而且使用一段时间后会过期,过期后,一些功能无法被使用,例如head插件无法看到es状态. 下图是过期的es的状态,可通过此url查看:http://ip:port ...

  6. tornado框架学习

    tornado是一个非阻塞的web服务器框架,每秒可以处理上千个客户端连接(都是在一个线程中,不需要为每个客户端创建线程,资源消耗少),适合用来开发web长连接应用,如long polling(轮询) ...

  7. 生成 XML 文档时出错。

    找来找去,在CSDN 里看到高手解答了. 原来 WebService 传递参数时,不能使用 DataTable 如果需要使用DataTable  那就要用 DataSet  包装起来. 如果担心数据太 ...

  8. idea git操作 -- 已有项目添加到git

    我们在使用git时,如果是先从git克隆项目,然后配置项目运行没问题,如果将已有项目添加到git,则项目环境还是提交不了git,还需要到克隆的仓库文件夹打开项目去操作git,如果有有类型情况可按照如下 ...

  9. 升级到Android Studio3.x遇到的问题及解决方案

    升级到Android Studio3.x遇到的问题及解决方案 转 https://www.2cto.com/kf/201711/695736.html 升级到Android Studio3.0遇到的问 ...

  10. virtualbox迁移虚拟机

    我用的Ubuntu16.04,下图为装好virtualbox时安装好系统后默认的存储位置. 促使我想迁移的原因是我的/home下因为虚拟机的存储原因导致/home下还剩1.5M可用空间..... 该目 ...