2019独角兽企业重金招聘Python工程师标准>>>
字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。
字符串是编程语言中表示文本的数据类型,在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。
在C语言中没有字符串类型,用字符数组处理字符串。类似的,Java也没有一个字符串类型,其字符串是以 String 类型的对象来实现的。
String 是一个类,当创建一个 String 对象后,所创建的字符串是不能改变的。 在需要使用可修改的字符串时,Java提供两个选择 StringBuffer 和 StringBuilder 。
String 类
String 字符串是只读的,不可变的。 可以查看 String 类的源码,String 类是被 final 关键字修饰的;
创建并初始化字符串:
1). 使用字符串常量直接初始化
String s="hello!";
2). 使用构造方法创建并初始化
String(); //初始化一个对象,表示空字符序列
String(value); //利用已存在的字符串常量创建一个新的对象
String (char[] value); //利用一个字符数组创建一个字符串
String(char[] value,int offset,int count); //截取字符数组offset到count的字符创建一个非空串
String(StringBuffer buffer); //利用StringBuffer对象初始化String对象
String 类常用的方法:
1、字符串的长度:
int length ();
2 、字符串转换
每个类都会实现 toString 方法,因为它是由 Object 定义的,对于大多数的自创建的类来说,通常要重写 toString () 并提供自己的字符串表达式。
3 、字符抽取
charAt(): 返回指定索引处的 char 值。
getChars(): 一次抽取多个字符。
getBytes(): 将字符存储在字节数组里。
4、字符串比较
equals()
方法 和 双等号 (==
) 运算符 :
equals () 方法是比较 String 对象中的字符. “ == ” 运算符是比较两个对象是否引用同一实例。
boolean startsWith(String prefix): 判断给定的String是否以特定的字符串开始。
boolean startsWith(String prefix,int toffset): 判断此字符从指定索引开始的字符串是否以指定的前缀开始。
endsWith(): 判断给定的String是否是以特定的字符串结束。
compareTo(): 用于比较字符串大小,并考虑大小写字母。
compareIgnoreCase():比较字符串大小并忽略大小写字母。
5、查找字符串
indexOf(): 返回指定子字符串在此字符串中第一次出现处的索引。
lastIndexOf(): 返回指定字符在此字符串中最后一次出现处的索引。
6、更改字符串
因为 String 对象是不能改变的,当需要更改一个字符串时,就必须将他复制到一个 StringBuffered 中,后者使用下列方法,在更改后会构造一个新的字符串副本。
substring(int startIndex): 返回从startIndex开始到调用字符串结束的子串的一个副本
substring(int startIndex,int endIndex),指定起点和终点,返回这中间的字符串,不包括终点。
replace(char originial,char replacement):用一个字符在调用字符串中所有出现另一个字符的地方进行替换。
replace(CharSequence originial,CharSequence replacement):用一个字符串序列替换另一个字符串序列。
trim(): 返回调用字符串对象的一个副本,但是所有起始和结尾的空白符都被删除了(字符中间的空白符未被删除)。
7、字符串大小写
toLowerCase(): 将所有字符改为小写
toUpperCase(): 将所有字符改为大写
8. 连接字符串
连接字符串有两种方式: 使用 concat() 方法、 使用 “+” 运算符:
concat(): 连接两个字符串,与“+”运算符相同。
8. String.format 格式化
String.format 方法: String 类的静态方法,在其内部实际上也是通过创建 Formatter 对象实现的;
System.out.println(String.format("%5d: %2f", 101, 1.131452));
StringBuffer 类
StringBuffer
是 String 的一个对等类,提供了字符串的许多功能,可增长、可改写。
这里只介绍几个StringBuffer类的方法函数:
**1、 append **
append(): 将任何数据类型的字符串表示连接到调用的 StringBuffer 对象的末尾。
当定String对象使用“+”运算符时,经常要调用append方法。
StringBuffer s = new StringBuffer("Hello");
s.append(" World");
s.append(" !");
System.out.println(s); // 输出字符串 “Hello World !”
**2、insert **:
insert(int index,String str) 将一个字符串插入到另一个字符串中。
**3、reverse **
reverse(): 颠倒 StringBuffer 对象中的字符
4、delete
delete(int startIndex,int endIndex),delete(int loc): 调用对象中删除一串字符。
StringBuilder 类
StringBuilder
类是jdk1.5 新增的操作字符串的类,与 StringBuffer 相似,唯一不同的是这个StringBuilder类不是同步的,意味着他不是线程安全的,其优势是更快的性能。
Java 8 默认使用 StringBuilder 拼接字符串。
字符串类 String 、StringBuffer 、StringBuilder 的区别
String
字符串常量, 内容不可变, 是线程安全的
StringBuffer
字符串变量(线程安全, 多线程使用)
StringBuilder
字符串变量, 非线程安全, 单线程使用)
如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。
String 在修改时不会改变对象自身。在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。
String str = "abc"; //地址str1
str = "def"; //地址str2
StringBuffer在修改时会改变对象自身。每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。StringBuffer 上的主要操作是 append 和 insert 方法。
StringBuffer strBuffer = new StringBuffer("abc"); //地址strBuffer,值是abc
strBuffer.append("def"); //地址strBuffer,值是abcdef
拓展内容
检测变量是否为数字或数字字符串
PHP 中有一个有用的方法 is_numeric
,检测变量是否是数字型的,Java一样可以实现,只需要自己封装一下即可。
/
检测变量是否为数字或数字字符串
@param str
@return
/
public static boolean is_numeric(String str) {
try {
Double d= Double.valueOf(str);
} catch (java.lang.Exception e) {
return false;
}
return true;
}
测试 String 、StringBuffer 、StringBuilder 三个类的执行效率
public class StringDemo {
public static void main( String[] args ) {
final int num = 100000; // 循环次数
// 测试1: String类
long start_1 = System.currentTimeMillis();
String s1 = "";
for (int i = 0; i <= num; i++) {
s1 += i;
}
long end_1 = System.currentTimeMillis();
long t1 = end_1 - start_1;
System.out.println("String: " + t1);
// 测试2: StringBuffer类
long start_2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < num; i++) {
sb .append(i);
}
long end_2 = System.currentTimeMillis();
long t2 = end_2 - start_2;
System.out.println("StringBuffer: " + t2);
// 测试3: StringBuilder类
long start_3 = System.currentTimeMillis();
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < num; i++) {
sBuilder .append(i);
}
long end_3 = System.currentTimeMillis();
long t3 = end_3 - start_3;
System.out.println("StringBuilder: " + t3);
}
}
在Eclipse中,JDK1.8 测试结果:
// 执行10万次
String: 23755
StringBuffer: 4
StringBuilder: 3
// 执行100万次:
String: 1876562
StringBuffer: 30
StringBuilder: 27
速度: StringBuilder > StringBuffer > String。 但是,可以看到 StringBuilder 与 StringBuffer 速度差距也不是很明显。
参考地址:
https://blog.csdn.net/chenliguan/article/details/51911906
https://blog.csdn.net/longlong2015/article/details/48134701 https://mp.weixin.qq.com/s/Wryv_Psks2teC1JZPQuyGg?