JAVASE——String

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值