这一节来学习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. linux 搭建 jenkins 前端自动构建时,老是提示 sh: vue-cli-service: command not found

    如题. 在 shell 里面执行  env 发现一个   NODE_ENV=production  的环境变量,是这个东西的原因. 通过  unset NODE_ENV  命令去掉这个环境变量就可以了 ...

  2. UVA 247 Calling Circles —— (强连通分量模板题)

    第一个强连通分量的题. 题意:有一堆人,a给b打电话表示a有一条向b的边,一个强连通分量代表一个电话圈,把每个电话圈里的人在一行内输出出来. 直接上模板即可,但是要注意把string用map映射一下的 ...

  3. 轻松搭建ES6开发环境

    首先,你要自行查阅什么是ES6和ES5.javascript有什么关系,为什么要编译ES6.废话不多说,just go! 第一步:创建项目并让它成为npm可以管理的仓库. 新建一个项目,名字假设为te ...

  4. ffmpeg编码h264设置规格

    ffmpeg -i demo.ts -profile:v baseline -vcodec h264 -acodec aac -f flv demo.flv

  5. 记录学习Linux过程

    第一步fdisk-l 出错 Permission denied? ubuntu@VM-0-6-ubuntu:~$ fdisk -l fdisk: cannot open /dev/vda: Permi ...

  6. Raspberry PI 2上的802.11ac网卡驱动编译

    Raspberry PI 2上的802.11ac网卡驱动编译 最近在树莓派2上折腾视频,用来做FPV,但是发现2.4G的控会严重干扰2.4G WIFI,在开控的时候我的台式机+外置USB网卡都频频掉线 ...

  7. Java同步数据结构之Collection-Queue

    概述 接下来开始学习java.util.concurrent包中一些Collection集合的子类,关于Map的一些子类将在这些子类完成之后再开始学习.下图是Java并发包中关于Collection接 ...

  8. Android下文件访问的权限

    * 默认情况下,Android中,应用程序的文件时私有的,其他应用程序不可以读取私有的文件 * 底层用的时Linux文件的权限 - rw- rw- ---                - :文件   ...

  9. springboot自定义filter获取spring容器bean对象

    今天在自己定义的filter中,想要直接注入spring容器的其它bean进行操作,发现不能正常的注入: 原因:web容器加载顺序导致, 加载顺序是listener——filter——servlet, ...

  10. 手把手教你如何玩转Solr(包含项目实战)

    一:Solr简介       Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引 ...