5.1 字符
字符指的用单引号括起来的单个字母。java中,char 表示字符的数据类型。一个字符在内存中占16位大小的空间(2个字节)。
5.2 字符串
字符串或串是由零个或多个字符组成的有限序列,它是编程语言表示文本的数据类型。
串的两个最基本的存储方式是顺序存储方式和链接存储方式
5.2.1 字符串声明与赋值
String是字符串变量的类型,字符串使用 String 关键字来声明,Java中,字符串一定是双引号括起来的零个或多个字符序列。
在Java 中,像其他原始数据类型一样,在使用字符串对象之前,需要先声明一个字符串变量:
// String 字符串变量名称;String userName
字符串变量必须赋值后才可以使用,称为字符串对象初始化。初始化有3种方式,分别为 使用 new 运算符,直接赋值和初始化为空。语法格式如下:
1Strint studentName = new String("zere"); 2//或者 3String studentName = "zere"; 4//或者 5String studentName = ""; 6studentName = "zere";
**注:**null 值和空字符串是不同的,空字符串不仅仅是不含字符,它还需要双引号括起来。而 null 值则是此变量本身就没有引用任何值。
5.2.2 获取字符串长度
length() 方法获取字符串长度,会返回字符串对象中包含的字符个数
5.3 字符串基本操作
5.3.1 字符串连接
String 类提供连接两个字符串的方法 concat();
1string1.concat(string2); 2//concat() 方法返回一个字符串,将string2添加到string1后面之后形成的新字符串 3 4class threeday 5{ 6 public static void main(String[] args) 7 { 8 String string1 = "Hello,"; 9 String string2 = "my name is Tom"; 10 String string3 = string1.concat(string2); 11 System.out.println(string3); 12 } 13} 14// HEllo,my name is Tom
也可以直接使用字符串字面量来调用 concat()方法:
String string2 = "Hello,"concat("my name is Tom");
连接字符串还可以使用“+”,这是一个重载了的运算符,用来直观的连接两个字符串,使用起来比 concat()方法更灵活。
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String string1 = "Hello,"; 6 String string2 = "my name is Tom"; 7 String string3 = string1+string2; 8 System.out.println(string3); 9 } 10} 11// HEllo,my name is Tom
当表达式中包含多个加号“+”,并且存在各种数据类型参与运算时,则按照+运算符从左到右进行运算,java会根据+运算符两边的操作数类型来决定是进行算术运算还是字符串连接的运算。
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 System.out.println(10+2.5+"price"); //先进行算术运算,再进行字符串拼接 6 System.out.println("price"+10+2.5); //进行字符串连接 7 } 8} 9 10//12.5 price 11// price102.5
5.3.2 字符串比较
equals() 方法,是比较两个字符串是否相等,返回boolean 值
string1.equals(string2);
equals() 方法会比较两个字符串中的每个字符,相同的字母,如果大小写不同,含义也是不同的
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String string1 = "hello"; 6 String string2 = "Hello"; 7 System.out.println(string1.equals(string2)); 8 } 9} 10 11// false
equalsIgnoreCase() 方法,忽略大小写的比较方法,同样返回boolean 值。
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String string1 = "hello"; 6 String string2 = "Hello"; 7 System.out.println(string1.equalsIgnoreCase(string2)); 8 } 9} 10 11// true
在比较字符串时,不能使用“==”,因为使用“==”比较对象时,实际上判断的是是否为同一个对象,如果内容相同,但不是一个对象,返回值为 false.
5.3.3 字符串截取
String 类中提供 substring 方法来实现截取功能
1String substring(int beginIndex); 2//截取从开始位置到结尾 3 4//或者 5 6String substring(int beginIndex,int endIndex); 7//截取从指定的开始位置到指定的结束位置 8 9class threeday 10{ 11 public static void main(String[] args) 12 { 13 String string1 = "I love Java!"; 14 String subs1 = string1.substring(2); //从位置2截取 15 String subs2 = string1.substring(2,6); //截取2-6之间的部分 16 System.out.println(subs1); 17 System.out.println(subs2); 18 } 19} 20 21// love Java! 22// love
5.3.4 字符串查找
在一个字符串中查找另一个字符串,String类提供了 indexOf() 方法来实现查找功能。
1str.indexOf(string substr); 2//指定字符串开始位置查找 3//或者 4str.indexOf(string substr,fromIndex); 5//指定字符串并指定开始位置查找
eg:
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String string1 = "I love Java!"; 6 String string2 = "love"; 7 int serindex1 = string1.indexOf(string2); //从开始位置查找“love”字符串 8 int serindex2 = string1.indexOf(string2,2); 9 //从所引2的位置开始查找“love”字符串 10 if(serindex1 >=0){ 11 System.out.println("love在I love Java!中第"+serindex1+"个位置出现"); 12 }else{ 13 System.out.println("love在I love Java!中未出现"); 14 } 15 if(serindex2 >=0){ 16 System.out.println("从索引2位置开始查找,love在I love Java!中第"+serindex1+"个位置出现"); 17 }else{ 18 System.out.println("从索引2位置开始查找,love在I love Java!中未出现"); 19 } 20 } 21} 22/* 23love在I love Java!中第2个位置出现 24从索引2位置开始查找,love在I love Java!中第2个位置出现 25*/
5.3.5 字符串替换
用一个新字符去替换字符串中指定的所有字符,String 类提供的 replace 方法
string1.replace(char oldchar,char newchar);
string1表示原字符串,用newchar替换string1中所有的oldchar,并返回一个新字符串
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String string1 = "I love Java!"; 6 char oldchar = 'a'; //被替换字符 7 char newchar = 'b'; //替换字符 8 String string2 =string1.replace(oldchar,newchar); 9 System.out.println("替换后的字符串为:"+string2); 10 } 11} 12 13//替换后的字符串为:I love Jbvb!
5.3.6 字符串与字符数组
将字符数组转换为字符串,然后利用字符串对象的属性和方法,进一步对字符串进行处理
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 char[] helloArray = {'H','e','l','l','o'}; //定义一个字符数组 6 // 将字符数组作为构造函数的参数 7 String helloString = new String(helloArray); 8 System.out.println(helloString); 9 } 10} 11 12// Hello
在使用new 运算符创建字符串对象时,将字符数组作为构造函数的参数,可以将字符数组转换为字符相应的字符串。相反,也可以将字符串转换为字符数组,这需要使用字符串对象的一个方法 toCharArray() 。它返回一个字符串对象转换过来的字符数组
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 String helloString = "hello"; 6 char[] helloArray = helloString.toCharArray(); 7 //将字符串转化为字符数组 8 //循环遍历字符数组,并输出数组当中每一个字符元素 9 for(int i =0;i<helloArray.length;i++){ 10 System.out.print(helloArray[i]); 11 } 12 } 13} 14 15// hello
5.3.7 字符串其他常用操作
String常用方法

5.4 StringBuffer 类
一个String对象的长度是固定的,如果使用String类对字符串进行不同的操作,会产生很多对象,需要另外分配空间。针对这个问题,Java 提供了StringBuffer类,既可以节省空间,又能够改变字符串的内容
5.4.1 认识StringBuffer 类
StringBuffer 类所产生的对象默认有16个字符的长度,内容和长度都可以改变。如果附加的字符超出可容纳的长度,则StringBuffer对象会自动增加长度以容纳被附加的字符。String类型和StringBuffer类型的主要性能区别其实在于String是不可变对象,因此在每次对String类型进行改变时其实都生成了一个新的String对象。而StringBuffer类型则不一样,每次操作结果都会在StringBuffer对象本身进行,不会生成新的对象。所以,在字符串经常改变的情况下使用StringBuffer类型,会让程序的运行效率提高。
5.4.2 StringBuffer 类提供的操作方法
在StringBuffer 对象上有 append() 和 insert() 方法,它们有多种重载形式,可以把不同类型的数据转换为字符序列,然后添加或插入到StringBuffer 对象中。append() 方法总是添加字符串到字符序列的最好,而insert() 方法则将字符或字符串添加到指定位置。
各种StringBuffer 方法

5.4.3 StringBuffer 实例
1class threeday 2{ 3 public static void main(String[] args) 4 { 5 StringBuffer sb = new StringBuffer(); //声明一个StringBuffer变量 6 sb.append("我"); //将字符串转换为字符数组 7 sb.append("爱"); 8 sb.append("Java"); 9 System.out.println(sb.toString()); 10 11 int i =sb.length(); 12 System.out.println("StringBuffer的长度是:"+i); 13 } 14} 15 16// 我爱Java 17// StringBuffer的长度是:6
5.4.4 String 类与 StringBuffer 类对比
String类:该类一旦产生一个字符串,其对象就不可以改变,并且字符串的内容和长度也是不变的。如果在程序中需要调用该字符串的信息,就需要调用系统所提供的各种字符串操作方法。通过这些方法来对字符串进行相关操作,不会改变对象实例本身,而是产生了一个新的字符串对象示例,并且系统在为String类分配对象时,也是按照对象所包含的实际字符数来分配的。
StringBuffer类:该类具有缓冲功能。StringBuffer类处理可改变字符串。如果需要修改一个StringBuffer类的字符串,不需要再创建一个新的字符串对象,可以直接在原来的字符串上进行操作。该类中的有些方法和String类不同。系统在为StringBuffer类对象分配内存时,除去当前字节所占有控件外,还另外提供了16个字符大小的缓冲区。Length方法可以返回当前实际所包含的字符串长度,而 capacity() 方法则可以返回当前数据容量和缓冲区容量的和。
非常感谢<从零开始学Java>一书对我的帮助,本文借鉴于此,仅用来学习,回顾,巩固。再次感谢。