这一节来学习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. 【线性代数】4-2:投影(Porjections)

    title: [线性代数]4-2:投影(Porjections) categories: Mathematic Linear Algebra keywords: Projections Project ...

  2. JVM——内存结构

    一.程序计数器/PC寄存器 (Program Counter Registe) 用于保存当前正在执行的程序的内存地址(下一条jvm指令的执行地址),由于Java是支持多线程执行的,所以程序执行的轨迹不 ...

  3. Mybatis源码学习之整体架构(一)

    简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...

  4. chrome获取xpath元素-f12工具

    Chrome浏览器获取XPATH的方法----通过开发者工具获取 引用源:https://blog.csdn.net/li6727975/article/details/46126079   版权声明 ...

  5. Linux-常用shell简介及shell基本操作

    1.查询shell环境变量,切换shell种类 ​​​ 表明目前使用的shell种类是bash. 要想改变shell种类,在终端输入想要运行的shell名称即可.在切换shell种类的过程中,可能会操 ...

  6. Spring AOP常见面试题

    一.AOP是什么? 与OOP对比,面向切面,传统的OOP开发中的代码逻辑是至上而下的过程中会长生一些横切性问题,这些横切性的问题和我们的主业务逻辑关系不会散落在代码的各个地方,造成难以维护,AOP的编 ...

  7. hibernate持久化类中,修改字符串长度时,注意的问题

    在使用hibernate注解修饰字符串长度时,如果一开始没有把String类型的变量长度设计好,在网数据库插入数据时,容易造成字段长度超出错误,这时候需要修改@Column里length的大小.如果使 ...

  8. 记录一次webpack3升级到webpack4过程

    升级之前也参考了一些网上的教程.借鉴之,进行的自己的升级.一些版本为什么设为那个版本号也是参考别人的结果. 整体是按照先升级npm run dev:在升级npm run build的顺序. 首先升级w ...

  9. C++ STL——常用算法

    目录 一 常用查找算法 二 常用遍历算法 注:原创不易,转载请务必注明原作者和出处,感谢支持! 注:内容来自某培训课程,不一定完全正确! 一 常用查找算法 /* find算法 查找元素 @param ...

  10. selenium 学习中遇到的问题汇总

    1.使用document.getByClassName时无click事件,然后就不知道怎么办了,也不太懂前端,与开发大哥确认,div 中class实现展开和收起是通过隐藏和显示这种方式实现的,在编写时 ...