java基础之字符串

1.String

1.1介绍

String是被final修饰的类,是不可变的,但是引用的指向可以变。
创建的方式有两种:

String str2 = "str1";
String str1 = new String("str1");

第一种会直接在字符串常量池查找是否存在对应的字符串,没有则创建,直接指向该字符。
第二种会在推内存里面创建一个对象,再在字符串常量池查找是否存在对应的字符串,没有则创建,直接指向该字符。
因为第二种有可能创建两个对象,所以第一种效率更高,推荐使用第一种创建方式。并且==是false,equals返回值是true

直接赋值字符串连接时,考虑编译器和运行期

/**
		 * 四种情况分析: 直接赋值字符串连接时,考虑编译器和运行期
		 * 1.如果在编译期可以被确定,那么可以使用已有的对象,否则会创建新的对象
		 */
		String a = "a";
		String a1 = a + 1;
		String a2 = "a1";
		System.out.println(a1 == a2);
		System.out.println(a2.equals(a1)); // false 因为a是个变量只有到运行的时候才知道值
		
		final String b = "b";
		String b1 = b + 1;
		String b2 = "b1";
		System.out.println(b1 == b2); // true final修饰是个常量,是个已确定的值
		
		String c = getC();
		String c1 = c + 1;
		String c2 = "c1";
		System.out.println(c1 == c2); // false 方法只有运行时才执行
		
		final String d = getD();
		String d1 = d + 1;
		String d2 = "d1";
		System.out.println(d1 == d2); // false 方法只有运行时才执行
	}

	public static String getC() {
		return "c";
	}
	
	public static String getD() {
		return "d";
	}

1.2常用的方法

1.2.1 charAt 根据索引拿到值
String str = "shshojkaklls1234";
System.out.println(str.charAt(1)); // 根据索引拿到值 h
1.2.2 toCharArray 转换成数组
String str = "shshojkaklls1234";
System.out.println(str.toCharArray()); // 拿到数组 shshojkaklls1234
1.2.3 substring 获取字符串的子串
String str = "shshojkaklls1234";
System.out.println(str.substring(2)); // shojkaklls1234
System.out.println(str.substring(2, 5)); // sho
1.2.4 字符串的比较
public int compareTo(String str)
// 该方法是对字符串内容按字典顺序进行大小比较,
// 通过返回的整数值指明当前字符串与参数字符串的大小关系。
// 若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。

public int compareToIgnoreCase (String str)
// 与compareTo方法相似,但忽略大小写。

public boolean equals(Object obj)
// 比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。

public boolean equalsIgnoreCase(String str)
// 与equals方法相似,但忽略大小写。
1.2.5 字符串中字符的大小写转换
String str = new String("JavaStudy");
String str1 = str.toLowerCase();
// str1 = "javastudy"
String str2 = str.toUpperCase();
// str2 = "JAVASTUDY"
1.2.6 字符串去空格
String str2 = " sss ";
System.out.println(str2.trim()); // sss
1.2.7 按照关键字分割
String str = "sgs#jkc#eer";
String[] str1 = str.split("#");
for (int i = 0; i < str1.length; i++) {
  System.out.println(str1[i]);  // sgs  jkc eer
}
1.28 替换字符串
String str3 = "hjdfjdskdd";
String str4 = str3.replace('h','g');
//str1 ="gjdfjdskdd"
String str5 =str3.replace("hj","xxx");
//str2 = "xxxdfjdskdd"
String str6 =str3.replaceFirst("d","c");
//str3 = "hjcfjdskdd"
String str7 =str3.replaceAll("hj","xxx");
//str4 = "xxxdfjdskdd"
System.out.println(str4+"\n"+str5+"\n"+str6+"\n"+str7);

2.StringBuffer

StringBuffer目的是解决String常量相加带来的性能问题,内部采用的是字符数组,默认的长度是16,超过数组大小时,动态扩充的算法是原来的长度*2 + 2。

StringBuffer sb = new StringBuffer();
sb.append("my ").append("name ").append("is zhangsan");
System.out.println(sb.toString()); // my name is zhangsan
// 当我们知道长度时,我们可以使用带参数的构造方法,来避免动态扩充的次数从而提高效率
StringBuffer sb2 = new StringBuffer(3);
sb2.append("aaa");

StringBuffer是线程安全的,因为其添加字符的操作是用synchronized修饰的,那同时性能也会受到影响。
在这里插入图片描述

3.StringBuilder

StringBuildert和StringBuffer目的是解决String常量相加带来的性能问题,和StringBuffer相比是没有线程安全的问题,但同时也提高了性能。它们两个都是继承自AbstractStringBuilder类。

StringBuilder sb1 = new StringBuilder();
sb1.append("my ").append("name ").append("is zhangsan");
System.out.println(sb1.toString()); // my name is zhangsan
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值