这一节来学习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. 2019ICPC陕西邀请赛复盘

    题目链接:The 2019 ACM-ICPC China Shannxi Provincial Programming Contest A:签到,按花费时间从小到大排个序 #include<cs ...

  2. python录音程序

    # -*- coding: utf-8 -*- # @Time : 18-10-16 下午12:20 # @Author : Felix Wang import pyaudio import nump ...

  3. iptables 有关计算机名解析问题

    遇到一奇怪现象: 1.开启防火墙(iptables)所有的用计算机名解析的连接全部是失效,但是用IP的一切正常.ping计算机名不通.但是ping IP地址一切OK: 2.关闭防火墙(iptables ...

  4. Beta冲刺(1/4)

    队名:福大帮 组长博客链接: https://www.cnblogs.com/mhq-mhq/p/11990568.html 作业博客 : https://edu.cnblogs.com/campus ...

  5. 在linux上使用impdp命令时提示ORA-12154: TNS:could not resolve the connect identifier specified的问题

    今天在一台linux服务器上用impdp命令导入dmp文件时出现了错误: ORA: TNS:could not resolve the connect identifier specified 我使用 ...

  6. CodeIgniter安装和入门使用(一)

    CodeIgniter是个轻量级功能也强大的框架,适合做自己做小项目用,本文介绍CodeIgniter的安装和使用.安装 官网链接http://codeigniter.org.cn/user_guid ...

  7. 【MyBatis】【SQL】没有最快,只有更快,从一千万条记录中删除八百万条仅用1分9秒

    这次直接使用delete from emp where cdate<'2018-02-02',看看究竟会发生什么. Mapper里写好SQL: <?xml version="1. ...

  8. 14 statefulset (sts)控制器

    statefulset (sts)控制器 可以用于部署有状态的服务,比如说redis,mysql ,zk等等... 1. 稳定且唯一的网络标志符:2. 稳定且持久的存储3. 有序,平滑地部署和扩展:4 ...

  9. python之scrapy爬取jingdong招聘信息到mysql数据库

    1.创建工程 scrapy startproject jd 2.创建项目 scrapy genspider jingdong 3.安装pymysql pip install pymysql 4.set ...

  10. 连接局域网mysql数据库

    1.先确认mysql服务端端口在防火墙是否开放外网连接(添加): windows防火墙 >高级设置 >入站规则 >新建规则 >选择端口 >添加端口 >后面直接下一步 ...