第十三章 字符串(一)之 String
这一节来学习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的更多相关文章
- 第5章 字符串----char与String
1.java有8种基本数据类型: 数值型:整数类型(byte,short,int,long) :浮点类型(float,double) 字符型:char 布尔型:true,false 2.char: ...
- 《Java编程思想》笔记 第十三章 字符串
1.String对象不可变 String对象不可变,只读.任何指向它的引用都不能改变它的内容.改变String内容意味着创建了一个新的String对象. String 对象作为方法参数时都会复制一份引 ...
- java编程思想第四版第十三章字符串 总结
1. String和StringBulider的使用 通过书中介绍, 我们得知如下结论: 当使用+连接符将字符串进行拼接的时候, 编译器会进行自动优化为使用StringBuilder连接字符串. 当在 ...
- java编程思想第四版第十三章字符串 习题
fas 第二题 package net.mindview.strings; import java.util.ArrayList; import java.util.List; /** * 无限循环 ...
- 第十三章 字符串 (四)之Scanner类
一.Scanner简述 Scanner扫描器类本质上是由正则表达式实现的,可以接受任何能产生数据的数据源对象,默认以空白符进行分词(包括\n等),使用各种next方法进行扫描匹配,获取匹配的数据. 二 ...
- Gradle 1.12用户指南翻译——第二十三章. Java 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 第二十三章 多项目集中权限管理及分布式会话——《跟我学Shiro》
二十三章 多项目集中权限管理及分布式会话——<跟我学Shiro> 博客分类: 跟我学Shiro 跟我学Shiro 目录贴:跟我学Shiro目录贴 在做一些企业内部项目时或一些互联网后台时 ...
- 编写高质量代码:改善Java程序的151个建议(第4章:字符串___建议56~59)
建议56:自由选择字符串拼接方法 对一个字符串拼接有三种方法:加号.concat方法及StringBuilder(或StringBuffer ,由于StringBuffer的方法与StringBuil ...
- 《Linux命令行与shell脚本编程大全》 第二十三章 学习笔记
第二十三章:使用数据库 MySQL数据库 MySQL客户端界面 mysql命令行参数 参数 描述 -A 禁用自动重新生成哈希表 -b 禁用 出错后的beep声 -B 不使用历史文件 -C 压缩客户端和 ...
随机推荐
- noi 第n小的质数
总时间限制: 1000ms 内存限制: 65536kB 描述 输入一个正整数n,求第n小的质数. 输入 一个不超过10000的正整数n. 输出 第n小的质数. 样例输入 10 样例输出 29 一定 ...
- 透彻tarjan
tarjan 求强连通分量: #include<cstdio> #include<iostream> #include<cstdlib> #define N 100 ...
- sscanf简介
#include<cstdio> #include<cstring> using namespace std; int main() { ]; //用法一:取指定长度的字符串 ...
- Liferay使用Structure和Template制作Video Portlet
Liferay提供Structure和Teamplate机制,Structure定义以如何引入内容,Teamplate定义怎样展现内容,能快速为页面添加新内容展示. FlowPlayer是一款开源的W ...
- 九款Web服务器性能压力测试工具
一.http_load 程序非常小,解压后也不到100Khttp_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般不会 ...
- Nginx-HTTP之ngx_http_top_body_filter
1. ngx_http_top_body_filter 该链表用于构造响应消息的响应正文. 大致有以下模块在该链表中插入了自己的函数: ngx_http_range_filter_module: ng ...
- Python中的变量、对象
由于没时间系统学习下Python 只能见一个问题探究一个问题了 一.初级 - 对象 关于Python中的数据类型,今天重新认识了下.[参考] 首先,Python中,对象才有类型, 变量是没有类型的,它 ...
- android data binding jetpack VIII BindingConversion
android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...
- Fragment 和Activity的数据传递实例代码
package com.example.fragment; import android.os.Bundle; import android.support.v4.app.FragmentActivi ...
- Javah提示未找到 ..的类
Javah相关错误,如下图所示: