(底层是字符数组+对数组的操作)
特点:
(1)是不可变的字符串类型,(不可变:对象的内容不能更改)
(2)final修饰的类型
(3)字符下标(索引/index)从0开头
(4)重写了equals方法和toString方法
(5)默认使用的是unicode字符集,任意字符都占两个字节。
构造器:
String() 创建一个空字符序列的字符串对象
String(byte[] bs) 创建一个字符串对象。使用默认字符集进行解码的字符串。
String(byte[] bs,String charset) 将字节数组使用指定字符集进行解码成相应的字符串对象
String(char[] ch) 将字符数组转换成字符串对象
String(String str) 指定一个字符串字面量创建一个字符串对象
常用方法:
int length() 返回字符串对象的字符个数
char charAt(int index) 返回此字符序列中指定索引处的字符
String concat(String another) 将指定字符串another拼接到此字符序列的末尾,返回新对象
boolean stratsWith(String prefix)/endsWith(String suffix) 查看此字符序列是否以prefix为前缀/以suffix为后缀
byte[ ] getBytes() 将此字符串按照默认字符集编码成字节序列,返回一个新的字节数组
byte[ ] getBytes(String charset) 将此字符串按照指定的字符集编码成字节序列,返回新的字节数组
int indexOf(String str)/indexOf(String str, int fromIndex) 查找字符串中的字符/子字符串的位置
int indexOf(int ch) 返回字符ch在此字符串中第一次出现的下标(索引/位置)
int intexOf(int ch,int fromIndex) 返回字符ch从此字符串fromIndex下标开始,往后第一次出现的位置
int indexOf(String str):
int indexOf(String str,int fromIndex) 注意:返回-1,说明要找字符/子字符串 不存在查找序列中
int lastIndexOf(int ch);
int lastIndexOf(String str)
int lastIndexOf(int ch,int endIndex)
int lastIndexOf(String str,int endIndex) 查找字符/子字符串截止到某一下标时,最后一次出现的位置。
上述四个方法:查找字符/子字符串在此字符序列中最后一次出现的位置,找不到返回-1
截取子字符串的方法:
String substring(int beginIndex) 从此字符序列的beginIndex开始截取,截取到最后
String substring(int beginIndex,int endIndex) 从此字符序列的beginInde开始截取,截取到endIndex,包前不包后
字符串转成字符数组的方法:
char[ ] toCharArray() 将此字符序列变成字符数组
字符串中的字母转成大写/小写
String toUpperCase() 将字符串中的字母都变成大写,返回新字符串
String toLowerCase() 将字符串中的字母都变成小写,返回新字符串
前后去空格的方法:
String trim() 去掉此字符序列的前与后的空格
将任意参数变成字符串对象
static String valueOf(Type v) 将参数v变成字符串对象
equals方法与==的区别
==:用来比较是不是同一个对象
equals:用来比较两个对象的内容是否相同
String类型中重写了equals方法
==============================================================================================
先介绍一些Buffer
Buffer 类是 java.nio 的构造基础。一个 Buffer 对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里,数据可被存储并在之后用于检索。缓冲区可以被写满或释放。对于每个非布尔原始数据类型都有一个缓冲区类,即 Buffer 的子类有:ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer 和 ShortBuffer,是没有 BooleanBuffer 之说的。尽管缓冲区作用于它们存储的原始数据类型,但缓冲区十分倾向于处理字节。非字节缓冲区可以在后台执行从字节或到字节的转换,这取决于缓冲区是如何创建的。
可变字符串类型:(字符串:底层是字符数组,及其对数组的操作)
特点:
(1)此类型是final修饰的
(2)没有重写equals方法
(3)此类型提供的大多数方法都带有返回值,
即: return this 返回同一个地址
构造器:
StringBuilder() 构造了一个空的StringBuilder对象,初始容量为16。
StringBuilder(String str) 创建一个指定字符串的StringBuilder对象
常用方法:
int length() 返回有效字符的长度。
StringBuilder append(Type a) 将参数a追加到StringBuilder对象里,返回此对象
StringBuilider insert(int index,Type a) 将参数a插入到对象的下标index处
StringBuilder delete(int start,int end) 删除此对象里的部分字符,从start开始,到end结束,注意:包前不包后
StringBuilder replace(int start,int end,String str) 使用str替换此对象从start开始到end结束的子串
StringBuilder reverse() 将StringBuilder对象的内容进行翻转
练习代码
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder sb = new StringBuilder();
System.out.println("初始长度:"+sb.length());
System.out.println("初始容量:"+sb.capacity());
//追加字符串
sb.append("java");
System.out.println("追加后:"+sb);
//插入
sb.insert(0,"hello");
System.out.println("插入后:"+sb);
//替换
sb.replace(5, 6, ",");
System.out.println("替换后:"+sb);
//删除
sb.delete(5,6);
System.out.println("删除后:"+sb);
//反转
sb.reverse();
System.out.println("反转后:"+sb);
System.out.println("当前字符串长度:"+sb.length());
System.out.println("当前容量:"+sb.capacity());
//改变StringBuilder的长度,将只保留前面部分
sb.setLength(5);
System.out.println("改变长度后:"+sb);
}
此类与StringBuilder用法一模一样。
但是:
在线程安全上考虑:StringBuffer线程安全,StringBuilder线程不安全
在执行效率上:StringBuffer效率低,StringBuilder效率高
练习代码
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuffer sb = new StringBuffer();
System.out.println("初始长度:"+sb.length());
System.out.println("初始容量:"+sb.capacity());
//追加字符串
sb.append("java");
System.out.println("追加后:"+sb);
//插入
sb.insert(0,"hello");
System.out.println("插入后:"+sb);
//替换
sb.replace(5, 6, ",");
System.out.println("替换后:"+sb);
//删除
sb.delete(5,6);
System.out.println("删除后:"+sb);
//反转
sb.reverse();
System.out.println("反转后:"+sb);
System.out.println("当前字符串长度:"+sb.length());
System.out.println("当前容量:"+sb.capacity());
//改变StringBuffer的长度,将只保留前面部分
sb.setLength(5);
System.out.println("改变长度后:"+sb);
}
==============================================================================================
String,StringBuffer,StringBuilder运行时间对比:
public static void main(String[] args) {
Date date1 = new Date();
long t1 = date1.getTime();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 100000; i++) {
buffer.append("java");
}
Date date2 = new Date();
long t2 = date2.getTime();
System.out.println("StringBuffer用时:" + (t2 - t1));
Date date3 = new Date();
t1 = date3.getTime();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 100000; i++) {
builder.append("java");
}
Date date4 = new Date();
t2 = date4.getTime();
System.out.println("StringBuilder用时:" + (t2 - t1));
Date datestr = new Date();
t1 = datestr.getTime();
String str = new String();
for (int i = 0; i < 100000; i++) {
str+="java";
}
Date datestr2 = new Date();
t2 = datestr2.getTime();
System.out.println("String用时:" + (t2 - t1));
}
结果: