java.lang.String使用了final修饰,不能 被继承;
字符串底层封装了字符数组及针对字符数组的操作算法;
字符串一旦创建,对象永远无法改变,但字符串引用可以重新赋值;
Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的定长编码。
Java为了提高性能,静态字符串(字面量/常量/常量连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串;
对于重复出现的字符串直接量,JVM会首先在常量池中查找,如果存在即返回该对象
java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,常量池存在于方法区中
/** 测试String常量池 */
@Test
public void testConstantPool() {
String str1 = "Hello";
// 不会创建新的String对象,而是使用常量池中已有的"Hello".
String str2 = "Hello";
System.out.println(str1 == str2); // 输出?
// 使用new关键字会创建新的String对象.
String str3 = new String("Hello");
System.out.println(str1 == str3); // 输出?
**
* java编译器有一个特征
* 编译时可确定某个表达式结果的值,编译时就进行计算,并将结果编译到字节码文件中
* 直接把编译结果放入class文件中
* java有常量优化机制,在编译时
* 因此下面代码会被编译器改为:
* string d=abc123
*/
String a1 = "abc123";
String d = "abc" + "123";
System.out.println(a1 == d);//true
String a2 = "abc";
String d2 = a2 + "123";
System.out.println(a1 == d2);//false
//==比较地址 equals比较内容
System.out.println(s1.equals(s2));
System.out.println("编译时:");
String 构造
package string;
import java.io.UnsupportedEncodingException;
public class StringDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// string 构造器
// 1.string();
String str1 = new String();// 开辟栈堆内存
str1 = "abc";
// 引用地址被改变
str1 = "bcd";
System.out.println(str1);
// 2.string(char[],int offest,int count)
char[] ch = { 'a', 'b', 'c', 'd' };
String str2 = new String(ch);// 取全部字符
String s1 = new String(ch, 1, 2);// 取部分字符,定义起始位置,长度
System.out.println(str2 + " " + s1);
// 3.String(byte[],int offest,int length,charset)
byte[] b = { 1, 48, 65, 97, 98, 99, 100 };
String str3 = new String(b);
String s2 = new String(b, 1, 4);
String s3 = null ;
try {
s3= new String(b, 2, 3, "gbk");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str3+" "+s2+" "+s3);
}
}
String方法
package string;
public class StringDemo2 {
public static void main(String[] args) {
// String 类方法
String s = "abcdefgbe";
// 1.indexof();获取索引从头开始获取第一个
// lastIndexof从结尾开始获取第一个
int index = s.indexOf("b");
int last = s.lastIndexOf("e");
// 2.charAt();获取字符
char ch = s.charAt(5);
// 3.substring()截取字符串
String substr1 = s.substring(3, 5);
// 4.split()根据字符切割字符串,把字符串边长数组
String[] splitstr2 = s.split("d");
for(String a:splitstr2) {
System.out.println(a);
}
// 5.toUpperCase toLowerCase 全部变大写,全部变小写
String upper = s.toUpperCase();
String lower = s.toLowerCase();
// 6.startWith endWith 判断是否以输入字符为开头或结尾
boolean start = s.startsWith("a");
boolean end = s.endsWith("g");
// 7.contain()判断是否包含输入字符
boolean concat = s.contains("d");
// 8.replace 替换
String str3=s.replace("ab", "你好");
// 9.length()
// 10.trim()取出左右空格
System.out.println("index:" + index + ",last:" + last + ", ch:" + ch + ",substr1: " + substr1 + " ,splitstr2"
+ splitstr2 + " ,upper" + upper + " ,lower:" + lower + ",start " + start + ", end " + end + ",concat "
+ concat + " ,s" + s + " " + s.length() + s);
System.out.println(str3);
//11.toCharryof 将字符串装换为数组
char[] ch2=s.toCharArray();
for(char c:ch2) {
System.out.println(c);
}
//valueof可以任意类型装换为字符串,tovalueof转换为字符串,前提是必须是字符串
int sa=123;
String dd=String.valueOf(sa);
System.out.println(dd);
}
}
/** 将其他类型转换为字符串类型 */
public void testValueOf() {
double pi = 3.1415926; int value = 123;
boolean flag = true;
char[] charArr = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' };
String str = String.valueOf(pi);
System.out.println(str);
str = String.valueOf(value);
System.out.println(str);
str = String.valueOf(flag);
System.out.println(str);
str = String.valueOf(charArr);
System.out.println(str)