字符串比较:
- ‘==’比较的是字符串的计算机存储位置是否同一个。
- ‘equal’比较字符串值是否相等。
String s1 = "TestString1";
String s2 = "TeseString2";
s1 = "TeseString2";
//s1和s2都指向同一个地址空间,s1原来字符串丢失
System.out.println(s1 == s2); //true
s1 = new String("TeseString2");
//new操作是开辟一个新的地址空间,虽然内容一样,但是两个不同的字符串
System.out.println(s1 == s2); //false
字符串API:
int length();
char charAt(intdex); //返回指定字符串的下标
Boolean equals(String);
Boolean equalsIgnoreCase(String s); //与equals作用相同,但不考虑字符串大小写
int compareTo(String s); //如果该字符串与s相同则返回0,在字典序上小于s则返回-1,否则返回大于0
Boolean startsWith(String prefix); //判读字符串是否以prefix开始
Boolean endsWith(String suffix); //判读字符串是否以su结尾ffix
int indexOf(Strin4g str); //返回str在字符串首次出现的位置,否则返回-1
String substring(int begin,int end); //返回begin到end-1中间字符串
String replace(char old,char new); //new字符串替换old字符串
String t String startString = "abcdefg";
String reverseString = "";
for(int i=startString.length()-1;i>=0;i--){
reverseString+=startString.charAt(i);
}
System.out.println(reverseString);oLowerCase();
String toUpperCase();
String trime(); //该字符串开头和结尾去点空格
//字符串返序
String startString = "abcdefg";
String reverseString = "";
for(int i=startString.length()-1;i>=0;i--){
reverseString+=startString.charAt(i);
}
System.out.println(reverseString);
格式化字符串
语法:str.format(String format,Object...args);
日期和时间格式化:
public class Test {
public static void main(String[] args) {
Date date = new Date();
//将date进行格式化
String year = String.format("%tY",date); //4位年份
String month = String.format("%tB",date); //指定语言环境的月份全称
String day = String.format("%td",date); //一个月的第几天
System.out.println("今年是:"+year);
System.out.println("现在是:"+month);
System.out.println("今天是:"+day);
}
}
常用日期格式化转换符:
时间格式化转换符:
常规转换符:
StringBuffer类
StringBuffer是个可变的字符串序列,他的长度和组成元素是可变的。
//初始化一个StringBuffer
StringBuffer bs = new StringBuffer("Stringbuffer");
//实际上String + 是用StringBuffer实现的
String first = "比尔";
String last = "盖茨";
String name = first + " " + last;
//相当于
StringBuffer tempbf = new StringBuffer(first);
tempsf.append(last);
String name = tempsf.toString();
StringBuffer(StringBuilder)常用API
Append(type t);
Insert(int pos,type t); //pos出插入t,t可以为任何类型
delete(int start,int end);
deleteCharAt(int pos);
setCharAt(int pos,char ch); //设置pos出的字符串为ch
replace(int start,int end, String str);
int length();
String toString(); //将StringBuffer作为字符串返回
字符串生成器
String对象其长度是固定的,内容不可改变,虽然使用“+”可以附加新字符串,但是新生成的字符串都会在内存创建新的字符串对象。如果重复对字符串进行修改,将极大的增加系统开销。这个时候考虑用可变字符序列StringBuilder。
验证String和Stringbuilder的效率问题:
public class Test {
public static void main(String[] args) {
String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
str = str + i; //每追加一个字符串就是在内存新创建一个字符串对象
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime; //执行的时间差,即时间开销
System.out.println("String 消耗的时间是:" + time);
StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
builder.append(i); //循环追加字符串,都是同一个字符串对象
}
endTime = System.currentTimeMillis();
time = endTime - startTime; //StringBuilder的时间开销
System.out.println("StringBuilder消耗的时间是:" + time);
}
}
String 消耗的时间是:7
StringBuilder消耗的时间是:0
两次操作的操作存在一定的差距(jdk1.8 String相加得到了优化,如例所示,1000次相加差距也并不大),如果在程序中频繁的附加字符串,可以使用StringBuilder。新创建的StringBuilder对象初始容量是16个字符,可以自行指定初始长度。如果附加的字符超过可容纳的长度,则StringBuilder将自动增加长度以容纳附加的字符。若要输出字符串结果可以使用toString()方法。
什么时候用?
String包含的字符串是不能改变的,StringBuffer(StringBuilder)类型变量是可变的,所以使用遵循原则:
- 如果需要对字符串进行添加或删除工作,选择StringBuffer类。
- 如果要保证字符串稳定,选择String类。
StringBuffer 和 StringBuilder 的区别
都是继承 AbstractStringBuilder ,StringBuffer 的方法都是有关键字 synchronized修饰,所以是线程线程安全的,StringBuilder是非线程安全