String 字符串基本使用
一、JavaDoc解释
String类表示字符串,所有Java程序中的字符串像是"abc"都是此类的实例,字符串是恒定的,不可变的,字符串的值一旦创造就不能被更改,字符串缓冲区支持可变
因为String对象是不可变的,所以能够被共用
String str = "abc";
// 等同于
char[] data = {'a','b','c'};
String str = new String(data);
一些示例说明字符串为什么不可变
System.out.println("abc");
String cde = "cde";
System.out.println("abc" + cde);
String c = "abc".substring(2,3);
String d = cde.substring(1, 2);
Java语言对string提供了特殊的支持像是 " + "的连接操作和转换其他对象到字符串,字符串连接实现了StringBuffer 和 StringBuilder的append 方法,string类型的转换也是实现了Object.toString()方法,并且被Java中所有的类继承
除非有另外说明,否则将null传递给构造函数或者方法会导致NullPointerException
二、基础属性和构造函数
介绍完JavaDoc官网对String的简单用法外,下面来介绍一下String内部有哪些属性和构造函数
基本属性
// 该值用于字符存储
private final char value[];
String是个字符串,字符串是一串字符的拼接,这是一个char数组,用来存储每一个字符序列
// 缓存字符串的哈希码
private int hash; // Default to 0
每生成一个字符串都会对应生成一个字符串的哈希编码
构造函数
String的构造函数有很多,下面对主要的构造函数进行介绍
- String支持几类构造函数,将创建空String的构造函数称为默认的构造函数
// 初始化一个新创建的String实例,能够代表一个空的字符序列。
// 注意使用这个构造器不是必要条件,因为字符串是不可变的。
public String() {
this.value = "".value;
}
eg:
String s = new String();
- 通常希望创建含有初始值的字符串。 String类提供了各种构造函数来完成这项功能。使用如下的构造函数可以创建一个被字符数组初始化的字符串
// 分配一个新的字符串,使其能够代表包含字符类型参数的字符串序列。
// 这个字符串的内容是一份副本随后的修改,字符数组不会影响新创建的字符串
public String(char value[]) {
this.value = Arrays.copyOf(value, value.length);
}
eg:
char[] chars = {'a','b','c'};
String s = new String(chars);
- 使用下面的构造函数可以指定字符数组的一个子区域作为初始化值。
/*
* 分配一个新的String包括新的字符数组参数,offset参数是字符数组的第一个字符,count是
* 数组字符的指定长度,
*/
public String(char value[], int offset, int count) {
if (offset < 0) {
throw new StringIndexOutOfBoundsException(offset);
}
if (count <= 0) {
if (count < 0) {
throw new StringIndexOutOfBoundsException(count);
}
if (offset <= value.length) {
this.value = "".value;
return;
}
}
// Note: offset or count might be near -1>>>1.
if (offset > value.length - count) {
throw new StringIndexOutOfBoundsException(offset + count);
}
this.value = Arrays.copyOfRange(value, offset, offset+count);
}
/*
* 将指定数组的指定范围复制到新的数组中,索引的范围必须介于0和original.length之间,
* 包括original.length。
*/
public static char[] copyOfRange(char[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
char[] copy = new char[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}
eg:
char[] chars = {'a','b','c','d','e','f'};
String s = new String(chars,2,3);
- 用下面的构造函数可以构造一个String对象,该对象包括了与另一个String对象相同的字符序列。
/*
* 初始化一个新创建的String实例,能够表示相同参数的序列。换句话说,新创建的字符串是参数字符串
* 的副本,除非需要original的显式副本,注意使用这个构造器不是必要条件因为字符串是不可变的。
*/
public String(String original) {
this.value = original.value;
this.hash = original.hash;
}
eg:
public class UseOfString {
public static void main(String[] args) {
char[] array = {'a','b','c','d','e'};
String s1 = new String(array);
String s2 = new String(s1);
System.out.println("s1 = " + s1);
System.out.println("s2 = " + s2);
}
}
- 尽管Java的Char类型使用16位(bit)表示Unicode编码字符集,在Internet中,字符串的典型格式使用由ASCII字符集构成的8位字节数组。因为8位ASCII字符串是共同的,当给定一个字节(byte)数组时,String类提供了初始化字符串的构造函数。
/*
* 通过解码指定的字节数组构造一个新的String对象,新的String长度是字符集的一个功能,
* 因此可能不等于字节数组的长度
*/
public String(byte bytes[]) {
this(bytes, 0, bytes.length);
}
// 通过解码指定的子数组来构造一个新的String,使用平台默认的字符集。
public String(byte bytes[], int offset, int length) {
checkBounds(bytes, offset, length);
this.value = StringCoding.decode(bytes, offset, length);
}
eg:
public class UseOfString {
public static void main(String[] args) {
byte[] byteArray = {65,66,67,68,69,70};
String s1 = new String(byteArray);
System.out.println("s1 = " + s1);
String s2 = new String(byteArray,2,3);
System.out.println("s2 = " + s2);
}
}
字节-字符串转换的扩展版本也有定义,使用该版本,你可以指定实现字节-字符串转换的字符编码方式。不过,大多数情况下,一般会选择操作平台提供的默认编码。
三、基本方法说明
1. 字符串长度
字符串的长度是指其所包含的字符的个数。
public class UseOfString {
public static void main(String[] args) {
// 字符串长度
char[] chars = {'a','b','c','d','e'};
String s = new String(chars);
System.out.println("s = " + s.length());
}
}
2. 字符串连接
- 上面创建字符串的方式都是通过String的构造函数来创建,String也能像基本数据类型一样赋值
String s = "abc";
System.out.println("s = " + s);
- 通常,Java不允许对字符串进行操作,但是使用" + "是个例外," + " 可以连接两个字符串,产生一个String对象,也可以使用一连串的字符串+进行运算
public class UseOfString {
public static void main(String[] args) {
String age = "9";
String s = "He " + "is " + age + "years old ";
System.out.println(s);
}
}
- 字符串连接的实际使用时当一个字符串的长度很长的时候,可以将他拆开,使用" + "将它们连接起来
public static void main(String[] args) {
String longStr = "This could have been " +
"a very long line that would have" +
"wrapped around. But String concatenation" +
"prevents this";
System.out.println(longStr);
}
- 字符串与其他数据类型的连接,考虑类型的转换关系
public static void main(String[] args) {
int age = 9;
String s = "He is " + age + " years old";
System.out.println(s);
}
第一个例子的age是
String
类型,第二个例子中age 是int
类型,但是产生的结果是一样的,这是因为字符串在使用+
号进行连接的时候,会默认把int
类型自动的转换为String
类型再进行连接,这种转换思想具有普适性,其他数据类型也是如此
但是这种在连接的过程中转换的思想也会产生不如意的结果
// 字符串拼接
public static void main(String[] args) {
String result = "The result 2 + 2 is " + 2 + 2;
System.out.println(result);
}
正如上面所说的,
String
类型和任何
类型的相加都会变为String
类型的结果,上面程序的运行过程会先执行"The result 2 + 2 is" 加2,得到的结果再加2 ,就会变成The result 2 + 2 is 22
3. 字符串转换
当Java在连接时将字符串转换为其他字符串形式时,它是通过调用一个由字符串(String)定义的字符串转换方法valueOf()
的重载方法来完成的。valueOf()
方法对所有简单的类型和类型Object重载。对于简单类型
的数据,valueOf()
方法返回一个字符串,对于对象,valueOf()
方法调用toString()
方法。
valueOf(boolean) : String
valueOf(char[]): String
valueOf(char): String
valueOf(char[],int,int): String
valueOf(double): String
valueOf(float): String
valueOf(int) : String
valueOf(long) : String
valueOf(Object) : String
每一个类都是执行toString()
方法,因为它是由Object
定义的方法,然而toString()的很多默认实现方法是不够的,对于大多数所创建的类,通常需要你提供自己重写过的toString()
方法。
它的一般形式:
String toString();
通过对所创建类的toString( )方法的覆盖,允许将得到的字符串完全集成到Java的程序设计环境中。例如它们可以被用于print( )和println( )语句以及连接表达式中。下面的程序中用Box类重载toString( )方法说明了这些。
public class Box {
double wight;
double height;
double length;
public Box(double w,double h,double l){
this.wight = w;
this.height= h;
this.length = l;
}
@Override
public String toString() {
return "Box{" +
"wight=" + wight +
", height=" + height +
", length=" + length +
'}';
}
}
public class UseOfString {
public static void main(String[] args) {
Box box = new Box(12,15,20);
String boxFix = "Box b" + box;
System.out.println(box);
System.out.println(boxFix);
}
}
该程序的输出:
Box{wight=12.0, height=15.0, length=20.0}
Box b = Box{wight=12.0, height=15.0, length=20.0}
正如你所看到的,当Box对象在连接表达式中使用或出现
println()
表达式的时候,Box的toString()
方法能够自动被调用
4. 字符截取
String类提供了很多字符串截取的方法,下面来逐一介绍一下,尽快字符串中的字符不能像字符数组一样能够被索引,许多字符串方法利用下标或偏移对字符进行操作
- charAt()
方法用于从字符串(String)中截取一个字符。可以通过charAt()方法直接引用单个字符
char charAt(int where);
这里,where指的是字符串索引的位置,它是非负的,charAt()方法返回指定字符。
String str = "chars";
char c = str.charAt(1);
System.out.println(c);
- getChars
如果想一次截取多个字符,可以使用getChars()方法,它有如下一般形式
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)
它的一般用法如下
:
public static void main(String[] args) {
String s = "This is a demo of the getChars method.";
int start = 10;
int end = 14;
char[] buf = new char[end-start];
s.getChars(start,end,buf,0);
System.out.println(buf);
}
这里的srcBegin指定了字符串开始的下标,srcEnd指定了字符串结束的下标。因此字符串包含了从srcBegin到srcEnd - 1的字符。dst数组是需要进行存储的数组。dstBegin定义存储数组的起始位置。
- getBytes()
有一种称为getBytes()
的方法,它是实现将字符存放于字节数组的getChars()
替代,它使用平台提供的默认字符到字节的转换。下面是它的最简单的形式:
byte[] getBytes();
它的一般用法如下
:
// 演示getBytes()用法
public static void main(String[] args) {
String s = "ABCDE";
byte[] bytes = s.getBytes();
for(byte b : bytes){
System.out.print(" b = " + b);
}
System.out.println();
}
输出如下:
b = 65 b = 66 b = 67 b = 68 b = 69
输出的结果是一个个的字节类型。
- toCharArray()
如果想将字符串对象中的字符转换为一个数组,那么可以使用toCharArray()
方法。对应整个字符串,它返回一个字符数组,一般形式为:
char[] toCharArray();
使用getChars()
也能得到相同的结果。
5. 字符串比较
String类包括了几个用于比较字符串或字符串内字符串的比较方法
- equals(Object anObject) 和 equalsIgnoreCase(String anotherString)
equals(Object anObject)
方法用于比较两个字符串的值是否相同equalsIgnoreCase(String anotherString)
方法用于比较两个字符串的值是否相同,不区分大小写,也就是说a - z 与 A - Z的比较是相同的。
// 演示字符串的比较方法
public static void main(String[] args) {
String s1 = "Hello";
String s2 = "Hello";
String s3 = "HELLO";
String s4 = "WORLD";
String s5 = "world";
System.out.println("s1.equals(s2) = " + s1.equals(s2));
System.out.println("s1.equals(s3) = " + s1.equals(s3));
System.out.println("s1.equalsIgnoreCase(s2) = " + s1.equalsIgnoreCase(s2));
System.out.println("(s1 + s5).equals(s3 + s4) = " +
(s1 + s5).equalsIgnoreCase(s3 + s4));
}
- regionMatches
regionMatches()方法将一个字符串中指定的区间和另一字符串指定的区间进行比较,它的重载形式允许在比较时忽略大小写
regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len)
regionMatches(int toffset, String other, int ooffset, int len)
以第二个方法为例:
// 演示regionMatches()用法
public static void main(String[] args) {
String s1 = "He is a good boy";
String s2 = "He is not a good boy";
System.out.println(s1.regionMatches(6,s2,10,s1.length()-6));
}
此示例使用了第二个方法,参数分别表示为 toffset(需要比较字符串的起始位置),other(被比较的字符串),ooffset(被比较字符串的起始位置),len(长度)
- startsWith() 和 endWith()
字符串定义两个例程,startWith()方法判断一个给定的字符串是否从指定位置开始,endWith()方法判断一个给定的字符串是否从指定位置结束
public static void main(String[] args) {
String s = "FooBar";
System.out.println(s.startsWith("Foo"));
System.out.println(s.endsWith("Bar"));
}
还有另外一种形式,是从指定位置处开始索引
startsWith(String prefix, int toffset)
- equals() 与 == 比较
理解equals 方法和 == 方法是非常重要的,如何上面解释的一样,equals比较的是字符串中的字符,而==是比较两个对象的引用是否相同,也就是比较两个对象引用看他的是否引用相同的实例。如下面程序
public static void main(String[] args) {
String s1 = "Hello";
String s2 = new String(s1);
System.out.println("s1.equals(s2) = " + s1.equals(s2));
System.out.println("s1 == s2 : " + s1 == s2);
}
- CompareTo
通常,仅仅知道两个字符串是否相同往往是不够的,对于排序应用来说,还需要知道一个字符与另一个字符之间的关系,是大于,小于还是等于,一个字符串小于另一个指的是它在字典中先出现。而一个字符串大于另外一个指的是在字典中后出现。
int compareTo(String str);
下面是一个对字符串数组进行排序的例子程序,程序在冒泡排序中使用compareTo()确定排序的顺序:
public class UseOfString {
static String[] arr = {
"Now", "is", "the", "time", "for", "all", "good", "men",
"to", "come", "to", "the", "aid", "of", "their", "country"
};
public static void main(String[] args) {
for(int i = 0;i < arr.length;i++){
for(int j = i + 1;j < arr.length;j++){
if(arr[i].compareTo(arr[j]) > 0){
String a = arr[j];
arr[j] = arr[i];
arr[i] = a;
}
}
System.out.println(arr[i]);
}
}
}
6. 搜索字符串
String类提供了两个搜索字符串的方法,一个是从第一个字符处开始搜索,另外一个是从最后一个字符处向前搜索。它们的一般形式如下:
/*
* 返回第一次出现指定字符处的索引,如果一个字符出现在了一个字符序列中,
* 那么第一次出现指定字符的索引将被返回。
*/
indexOf(int ch):
/*
* 从某个起始位置开始,返回出现指定字符的位置
*/
indexOf(int ch, int fromIndex):
/*
* 搜索出现指定字符串的位置
*/
indexOf(String str):
/*
* 从指定位置开始,搜索出现指定字符串的位置
*/
indexOf(String str, int fromIndex):
// lastIndexOf和indexOf的用法很相似
lastIndexOf(int ch)
lastIndexOf(int ch, int fromIndex)
lastIndexOf(String str)
lastIndexOf(String str, int fromIndex)
一般用法如下
:
public static void main(String[] args) {
String str = "Java is the best Language";
int charIndex = str.indexOf('a');
int strIndex = str.indexOf("best");
System.out.println("strIndex = " + charIndex);
System.out.println("strIndex = " + strIndex);
}
注意: indexOf(int ch) 这个方法的参数 ch 可以是数字,也可以是字符类型(char),在搜索指定字符的时候,会将字符转换成为Unicode编码再进行搜索
7. 修改字符串
substring()
因为字符串的不可变性,在每当想对字符串进行操作的时候,都需要采用将它复制到StringBuffer或者使用下面方法中的一种,这些方法都将完成一个字符串的拷贝
有两种形式:substring(int beginIndex) 和 substring(int beginIndex, int endIndex)
用法如下
:
public static void main(String[] args) {
String str = "The quick brown fox jumps over the lazy dogs";
// 从位置为3的地方开始截取字符串
String s = str.substring(3);
System.out.println("s = " + s);
// 从位置为3的地方截取字符串,截止到length() - 1 处。
s = str.substring(3,str.length()-1);
System.out.println("s = " + s);
}
输出:
s = quick brown fox jumps over the lazy dogs
s = quick brown fox jumps over the lazy dog
- concat()
使用concat()可以连接两个字符串,一般形式如下:
String concat(String str);
这个方法创建创建一个新的对象,该对象包含调用字符串。而str内容跟在调用字符串的后面。concat()方法与"+"运算符执行相同的功能。
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "World";
System.out.println("str1.concat(str2) = " + str1.concat(str2));
}
通过使用concat能够达到和 + 号相同的效果
- replace()
replace()方法用另外一个字符代替调用字符串中的一个字符的所有值。它的一般形式
replace(char oldChar, char newChar)
这里的oldChar 是要被替换的字符串,而newChar 是要替换的字符串
例如
// 替换'u' - > 'o'
String s = "Hellu".replace('u','o');
- trim()
trim方法返回一个调用字符串的拷贝,该字符串将位于调用字符串前面和后面的空格删除后的剩余部分
下面是一个例子:
String s = " Hello World".trim();
8. 利用valueOf()方法实现数据转换
valueOf()方法将数据的内部格式转换为可读的形式,它是一种静态方法
,对于所有内置的类型,在字符串中被重载
。以便每一种类型都能被转换成为字符串,valueOf()方法还被类型Object重载,所以创建的任何形式类的对象也可被用做一个参数,下面是它的几种形式:
valueOf(boolean b)
valueOf(char c)
valueOf(char[] data)
valueOf(char[] data, int offset, int count)
valueOf(double d)
valueOf(float f)
valueOf(int i)
valueOf(long l)
valueOf(Object obj)
使用静态方法也是effective Java 中所推崇的一种转换方式。
9. 改变字符串内字符大小写
toLowerCase()
方法将字符串内所有字符从大写转换为小写,而toUpperCase()
方法将字符处内所有字符从小写转换为大写。下面是这些方法的一般形式
String toUpperCase()
String toLowerCase()
下面是具体的示例
public class UseOfString {
public static void main(String[] args) {
String s = "This is a test";
System.out.println("Original : " + s);
String upper = s.toUpperCase();
String lower = s.toLowerCase();
System.out.println("Uppercase : " + upper);
System.out.println("Lowercase : " + lower);
}
}
程序输出:
Original : This is a test
Uppercase : THIS IS A TEST
Lowercase : this is a test
String 字符串基本使用的更多相关文章
- Java String字符串/==和equals区别,str。toCharAt(),getBytes,indexOf过滤存在字符,trim()/String与StringBuffer多线程安全/StringBuilder单线程—— 14.0
课程概要 String 字符串 String字符串常用方法 StringBuffer StringBuilder String字符串: 1.实例化String对象 直接赋值 String str=& ...
- [CareerCup] 1.3 Permutation String 字符串的排列
1.3 Given two strings, write a method to decide if one is a permutation of the other. 这道题给定我们两个字符串,让 ...
- 03-Java String字符串详解
1.Java字符串String A.实例化String字符串:直接赋值(更合理一些,使用较多).使用关键字new. B.String内容的比较 // TODO Auto-generated metho ...
- C++学习38 string字符串的增删改查
C++ 提供的 string 类包含了若干实用的成员函数,大大方便了字符串的增加.删除.更改.查询等操作. 插入字符串 insert() 函数可以在 string 字符串中指定的位置插入另一个字符串, ...
- C++学习37 string字符串的访问和拼接
访问字符串中的字符 string 字符串也可以像字符串数组一样按照下标来访问其中的每一个字符.string 字符串的起始下标仍是从 0 开始.请看下面的代码: #include <iostrea ...
- java String字符串——进度1
String字符串 在JAVA中提供了多种创建字符串对象的方法,这里介绍最简单的两种, 第一种是直接赋值, 第二种是使用String类的构造方法: 如下所示: Strin ...
- 关于String字符串反转
这是网上看到的一篇java面试题中的问题: 问题是: 如何将一个String字符串反转. String str = "1234567"; int length = str.leng ...
- JavaScript的内置对象(Date日期+string字符串)基础语法总结
1.Date日期对象可以储存任意一个日期,并且可以精确到毫秒数(1/1000 秒). 1)定义一个时间对象 : var Udate=new Date(); //注意:使用关键字new,Date()的首 ...
- 【转】String字符串相加的问题
String字符串相加的问题 前几天同事跟我说我之前写的代码中在操作字符串时候,使用字符串相加的方式而不是使用StringBuffer或者StringBuilder导致内存开销很大.这个问题一直在困扰 ...
- 从零开始学习前端JAVASCRIPT — 3、JavaScript基础string字符串介绍
1:字符串 JS中的任何数据类型都可以当作对象来看.所以string既是基本数据类型,又是对象. 2:声明字符串 基本数据类型:var sStr = '字符串'; 对象的方法:var oStr = n ...
随机推荐
- 输入url后发生了什么
(1)浏览器解析 (2)查询缓存 (3)DNS查询 顺序如下,若其中一步成功直接进去建立连接部分: -- 浏览器自身DNS -- 操作系统DNS -- 本地hosts文件 -- 像域名服务器发送请求 ...
- 工作中的Python脚本
本章内容 1.rawlog处理 2.域名item接口刷新 3.备案结果查询 4.多级域名中取主域 5.发送邮件 6.通过api获取cdn edge ip 7.多线程下载 1.rawlog处理 脚本 ...
- Java-获取堆的大小
package com.tj; public class getHeapInfo { public static void main(String[] args) { //获取当前堆的大小 byte ...
- 对于一棵二叉树,请设计一个算法,创建含有某一深度上所有结点的链表。 给定二叉树的根结点指针TreeNode* root,以及链表上结点的深度,请返回一个链表ListNode,代表该深度上所有结点的值,请按树上从左往右的顺序链接,保证深度不超过树的高度,树上结点的值为非负整数且不超过100000。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x ...
- HDU 5514 Frogs
Frogs Time Limit: 1000ms Memory Limit: 65536KB This problem will be judged on HDU. Original ID: 5514 ...
- shell-001
for: shell_test #!/bin/bash var= var=$var+ echo $var mkdir only_a_joke shell_joke #!/bin/bash ./shel ...
- 【Luogu】P1144最短路计数(BFS)
题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y ...
- 为什么上传文件的表单里要加个属性enctype----摘录
上传文件的表单中<form>要加属性enctype="multipart/form-data",很多人只是死记硬背知道上传表单要这么写,知其然而不知其所以然.那到底为什 ...
- 【bzoj4568】【Scoi2016】幸运数字 (线性基+树上倍增)
Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一 ...
- mysql报错Packet for query is too large (12238 > 1024). You can change this value
今天将项目部署到linux服务器的时候莫名其妙的报一些错误,可是在本地啥错没有,通过实时查看tomcat 的日志之后发现报错是: 实时查看日志: .先切换到:cd usr/local/tomcat5/ ...