--20150820
1.String及其常用API
1)java中String对象为不可变对象,一旦在内存中创建,内容不能发生变化,若要对字符串内容改变,那么就会创建新对象。这样做的目的是可以最大程度的重用相同内容的字符串以减小系统资源的开销。
2)String常量池
当我们通过字面量,常量来初始化一个字符串时,JVM首先会从字符串的常量池(一个JVM内部维护的内存区域,用来保存已经创建过的字符串对象)中查询用来保存该字符串的对象是否存在,若存在则直接引用,若不存在则创建该字符串对象并存入常量池,然后引用它。因为字符串内容不能改变,所以我们可以放心的重用他们。
3)内存编码及长度
java存储每一个字符均使用2个字节保存,使用的是Unicode编码。并且任何一个字符(无论是英文还是汉字)每个字符的长度都是1。所以字符串的长度就是该字符串所有的字符个数。
int length():返回当前字符串的长度。
例如:
package day01; /** * int lenght() * 获取当前字符串中的字符个数(长度),无论是中英文 * 每个字符占两个字节(Unicode编码) * @author soft01 * */ public class StringLengthDemo { public static void main(String[] args) { String str = "我爱,java"; System.out.println(str.length()); //7 } }
4)indexOf实现检索
int indexOf(int ch):用来检查给定的一个字符在当前字符串中第一次出现的下标位置。这里的下标和数组的下标意思相近,0表示该字符串的第1个字符,以此类推。当该字符串中并不包含给定的字符时,那么该方法返回-1。
例如:
package day01; /** * int indexOf(String str) * 查找给定的字符串在当前字符串中第一次出现的位置。 * 返回值为给定的字符串第一个字符在当前字符串的下标 * 由于java大小写敏感,所以必须全部匹配上才返回具体下标。否则返回-1 * @author soft01 * */ public class IndexOfDemo { public static void main(String[] args) { String str = "thinking in java"; //检查in的位置 int index = str.indexOf("in"); System.out.println(index); //2 /* * 重载方法: * indexOf(String str,int from) * 从当前字符串指定下标位置开始查找第一次出现 * 给定字符串的位置。 * 同样的,若没有找到返回-1。 */ index = str.indexOf("in",2); //下标 System.out.println(index); //2 index = str.indexOf("in",3); System.out.println(index); //5 /* * int lastIndexOf(String str) * 查找当前字符串中最后一次出现给定字符串的位置。 */ index = str.lastIndexOf("in"); System.out.println(index); //9 /* * 实际应用中,常被用作检查一个字符串是否出现 * 了要求的关键字,甚至确定位置使用。 */ } }
5)substring获取子串
String substring(int begin,int end):用来截取当前字符串的部分内容以获取这个子字符串。我们只需要传入两个整数,一个用来表示从哪里开始,另一个用来表示截取到哪里。这里的位置要使用字符串的下标来表示,并且要注意,这两个数字表示的范围是“含头不含尾的”,换句话说就是包含开始下标的字符,但是不包含结束下标的字符。
例如:
package day01; /** * 获取字符串中的部分内容 * substring(int start,int end) * 从指定下标start处对应的字符开始,截取到指定下标end处 * 之间的字符串,需要注意,不包含end位置的字符。 * java API中凡是使用2个数字表示一个范围,通常都是"含头不含尾"的。 * * @author soft01 * */ public class SubstringDemo { public static void main(String[] args) { String str = "www.baidu.com"; System.out.println(str.length()); //13 String substr1 = str.substring(4,9); System.out.println(substr1); //baidu String substr2 = str.substring(4,13); //str.length()-13 System.out.println(substr2); //baidu.com ////一个参数,从指定下标到结尾 String substr3 = str.substring(4); System.out.println(substr3); //baidu.com } }
6)trim()
String trim():将字符串两边的空白(空白有很多种,空格是其中之一)去除掉,并将去除后的新字符串返回给我们。
例如:
package day01; /** * String trim() * 去除当前字符串中两边的空白 * @author soft01 * */ public class TrimDemo { public static void main(String[] args) { String str = " hello world "; System.out.println(str); String trim = str.trim(); System.out.println(trim); System.out.println(); } }
7)charAt()
char charAt(int index):用于给定一个下标位置,来获取该字符串中这个位置的字符。
例如:
package day01; /** * char charAt(int index) * 获取当前字符串中指定位置(下标)对应的字符 * @author soft01 * */ public class CharAtDemo { public static void main(String[] args) { String str = "thinking in java"; char c = str.charAt(0); System.out.println(c); //t } }
8)startsWith和endsWith
boolean startsWith(String suffix):用来判断当前字符串是否是以给定的字符串开始的。这里要注意大小写是敏感的。
boolean endsWith(String suffix):用来判断当前字符串是否是以给定的字符串结尾的。
例如我们可以使用endsWith()就可以根据一个文件的名字来判断它是否是以".jpg",".gif"等字符串结尾来得知该文件是否为图片。
例如:
package day01; /** * boolean startsWith(String str) * --判断当前字符串是否以给定的字符串开头的 * boolean endsWith(String str) * --判断当前字符串是否以给定的字符串结尾的 * @author soft01 * */ public class StartsWithDemo { public static void main(String[] args) { String str = "thinking in java"; boolean starts = str.startsWith("think"); System.out.println(starts); //true boolean end = str.endsWith("va"); System.out.println(end); //true } }
9)大小写变换
String toUpperCase():用来将当前字符串中的英文部分的字符全部变为大写后再将新的字符串返回
String toLowerCase():用来将当前字符串中的英文部分的字符全部变为小写后再将新的字符串返回
例如,我们上网时常会要求我们输入验证码,图片中的英文可能是大写的,但我们输入时并不需要严格按照大小写输入却依旧可以验证成功。这就得力于该方法。我们可以将输入的验证码全部转换为大写,在将图片中显示的内容也全部转换为大写后再比较即可。
例如:
package day01; /** * String toUpperCase() * String toLowerCase() * 将当前字符串中的英文部分转换成全大写和全小写。 * @author soft01 * */ public class ToUpperCaseDemo { public static void main(String[] args) { String str = "我爱Java1.8"; String upper = str.toUpperCase(); System.out.println(upper); String lower = str.toLowerCase(); System.out.println(lower); //通常用来忽略大小写判断(例如验证码判断) } }
10)valueOf()
字符串提供了很多重载的valueOf()方法,可以将其他基本类型的值以字符串的形式描述。
static String valueOf(int i): 返回 int 参数的字符串表示形式
static String valueOf(boolean b): 返回 boolean 参数的字符串表示形式
static String valueOf(char c): 返回 char 参数的字符串表示形式
static String valueOf(double d): 返回 double 参数的字符串表示形式
static String valueOf(char[] c): 返回 char 数组参数的字符串表示形式
static String valueOf(char[] c,int offset,int count): 返回 char 数组参数的特定子数组的字符串表示形式。
static String valueOf(float): 返回 float 参数的字符串表示形式
static String valueOf(long l): 返回 long 参数的字符串表示形式
static String valueOf(Object o): 返回 Object 参数的字符串表示形式
例如:
package day01; /** * static String valueOf() * 字符串提供了若干的静态方法valueOf() * 作用就是将其他类型转换为字符串。 * 比较常用的是将基本类型转换成字符串。 * * @author soft01 * */ public class ValueOfDemo { public static void main(String[] args) { int a = 123; String s1 = String.valueOf(a); //"123" System.out.println(s1+4); //"1234" System.out.println(a+4); //127 System.out.println(a+""+4); //"1234" double d = 123.123; String s2 = String.valueOf(d); //"123.123" System.out.println(s2+4); //"123.1234" System.out.println(d+4); //127.123 String s3 = 123+""; //没有String.valueOf(a)效率高 } }
2. StringBuilder及其常用API
1)StringBuilder封装可变字符串
String类我们已经得知,它是不变对象,那么每当对内容修改时都会引发新对象的创建。那么当我们有一个需求是需要频繁修改字符串时,这样不仅不能减少内存的开销,返回会增加内存的开销。为此java为我们提供了一个专门用于修改字符串内容的类:StringBuilder.
该类封装了可变的字符串,换句话说,当我们需要改变字符串内容时,并不会创建新对象,而是在原对象基础上进行修改。从而减小了内存的开销。
2) StringBuilder常用方法
StringBuilder类的常用方法有:
append(String str):追加字符串;
insert (int dstOffset,String s):插入字符串;
delete(int start,int end):删除字符串;
replace(int start,int end,String str): 替换字符串;
reverse():字符串反转。
3)StringBuilder
StringBuilder的很多方法的返回值均为StringBuilder类型。这些方法的返回语句均为:return this。
由于改变封装的字符序列后又返回了该对象的引用。可以按照如下简洁的方式书写代码:
buf.append("ibm").append("java").insert(3, "oracle").replace(9, 13, "JAVA");
System.out.println(buf.toString());
4)使用append实现追加
StringBuilder append(String):用于将给定的字符串追加到当前字符串末尾。
5) 使用insert实现插入
StringBuilder insert(int offset, String str):用于将给定的字符串插入到指定的位置。这个位置也是字符串的下标。
6)使用delete实现删除
StringBuilder delete(int start,int end):用于删除给定字符串中的部分内容。需要传入两个参数,描述要删除的字符串的范围,同样这个范围是"含头不含尾的"
7)StringBuilder 总结
StringBuilder是可变字符串。字符串的内容计算,建议采用StringBuilder实现,这样性能会好一些。
java的字符串连接的过程是利用StringBuilder实现的,代码如下所示:
String s = "AB"; String s1 = s + "DE"+1;
String s1 =
new StringBuilder(s).append("DE").append(1).toString();
8)StringBuffer 和StringBuilder的区别:
StringBuffer是线程安全的,同步处理的,性能稍慢;
StringBuilder是非线程安全的,并发处理的,性能稍快
代码演示:
package day01; /** * java.lang.StringBuilder * 内部维护一个可变的字符数组。为了解决频繁修改 * 字符串内容带来的性能损耗。 * 内部提供了用于编辑字符串的相关方法: * 增删改插 * * @author soft01 * */ public class StringBuilderDemo { public static void main(String[] args) { String str = "努力学习java,为了找个好工作!"; StringBuilder sb1 = new StringBuilder(); //"" StringBuilder sb = new StringBuilder(str); //还可以是字符串直接量 //System.out.println(sb.hashCode()); /* * 努力学习java,为了找个好工作!然后改变世界! * StringBuilder append(String str) * 在当前字符串末尾追加给定内容 */ sb.append("然后改变世界!"); str = sb.toString(); System.out.println(str); //System.out.println(sb.hashCode()); /* * 努力学习java,为了改变世界! * StringBuilder delete(int start,int end) * 删除当前字符串中给定范围内的字符串 */ sb.delete(11,19); str = sb.toString(); System.out.println(str); StringBuilder sb2 = sb; /* * 努力学习java,就是为了改变世界! * StringBuilder insert(int offset,String str) * 将给定的字符串内容插入到指定位置处 */ sb.insert(9,"就是"); str = sb.toString(); System.out.println(str); //System.out.println(sb2==sb); //System.out.println(sb2); /* * 活着,就是为了改变世界! * StringBuilder replace(int start,int end,String str) * 将当前字符串中给定范围内的字符串替换为给定的字符串 */ sb.replace(0,8,"活着"); str = sb.toString(); System.out.println(str); /* * 字符串反转 */ sb.reverse(); str = sb.toString(); System.out.println(str); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。