package 练习;

public class string类 {

	public static void main(String[] args) {
		//简单方法:
		String message="Welcome to Java !";
		
		//求长度
		int n = message.length();
		System.out.println("结果:"+n);
		
		//选择指定位置的字符
		for(int i=0;i<n;i++)
		{
			char c = message.charAt(i);
			System.out.println("结果:"+c);
		}
		
		//获取字符、字符串位置
		n = message.indexOf('o');//单参数
		System.out.println("字符位置:"+n);
		
		n = message.indexOf('o',n+1);//双参数
		System.out.println("字符位置:"+n);
			
		n = message.indexOf("come");
		System.out.println("字符串位置:"+n);
		
		//大写
		message = message.toUpperCase();
		
		//小写
		message = message.toLowerCase();
		System.out.println("小写结果:"+message);
		
		//去除两边空格
		message = "    1   2   3     ";
		System.out.println("原结果:"+message);
		message = message.trim();
		System.out.println("新结果:"+message);
		
		//字符串比较方法   equals()
		System.out.println("**样例1:**");
		String s1 = "123";
		String s2 = new String("123");
		if(s1==s2)
			System.out.println("1");
		else
			System.out.println("0");
		if(s1.equals(s2))
			System.out.println("11");
		else
			System.out.println("00");
		
		
		System.out.println("**样例2:**");
		String s3 = "123";
		if(s1==s3)
			System.out.println("1");
		else
			System.out.println("0");
		if(s1.equals(s3))
			System.out.println("11");
		else
			System.out.println("00");
		
		
		/*
		通过这两个样例发现,“==”与equlas()之间存在差异,==能够判断是否为同一个对象,
		而equals()判断的是两个对象的值是否相等。应当进行区别的一点是,值相等并不代表对象相同。
		那么深究,为什么会产生这两种差距呢?
		1.首先java中有两种创建String的两种方式:
		第一种采用直接“字面值”赋值的方式,即:String s1="123";
		第二种方式采用 “new”方式,即:String s2 = new String("123");
		
		在采用第一种“字面值”赋值方法时,系统会首先到Stringpool(字符串常量池)
		区域中查找是否存在这样一个字符串,如果不存在,系统会在常量池中创建一个该对象"123",
		并将对象引用的地址返回给s1,因此s1也就指向改对象;如果已经存在对象,系统不会再浪费资源,直接将"123"地址传递给s1.
		
		在这种情况下也就是  样例2  的情况,s1与s3都是字面值赋值,s1和s3中存储的都是"123"的地址,是同一个对象,因此会输出"1".
		
		在采用第二种方式“new”方式时,系统会创建两个“字符串对象”,第一个在常量池中创建,第二个在堆中创建。
		在本样例中,系统会首先到常量池中查看是否存在"123"。如果找到了,那么系统就不再在常量池中创建了,但是会在堆中创建一个"123",并且
		将堆中的"123"的地址返回给s2,注意这里返回的是堆中的字符串的地址。如果在常量池中未找到,首先在常量池中创建"123",再在堆中创建"123",
		返回堆中的地址。
		
		在这种情况下也就是 样例2 的情况,s1与s2中存储的地址是不一样的,因此==返回的是"0",而equals对比的是值,值相同,则返回了"11"。
		
		字符串常量池中的的String对象是不可变的。这样保证常量池中的对象能够被多个引用访问,但是不会改变其值。如果有引用重新进行赋值,
		新的值会再次存储在常量池中,作为一个新的对象。
		
		String pool 优缺点:保证了某字符串仅仅创建一次没节省空间与时间,但是浪费了JVM遍历常量池的时间,但总时间还是缩短的。
		
		*/
		
		/*
		不可变类:
		1.定义:创建对象后,其内容不能够被改变。 同时如果创建的是一个类,并不是类是不可变的,而是类中的属性是不可变的,被final修饰。
		在进行自定义不可变类时,首先要利用private和final进行修饰,同时需要创建进行初始化的构造函数,创建仅仅能够返回值的函数,
		2.不可变类存在的优点:能够被自由地共享、线程具有安全性、便于构造、访问、测试、使用
		3.如果以String为例子,
		*/
		
		//子串判断  contains()
		s1 = "123456789";
		s2 = "456";
		if(s1.contains(s2))
			System.out.println("子串:1");
		else
			System.out.println("子串:0");
		
		//前缀、后缀
		s3 = "789";
		s1 = "123456789";
		s2 = "123";
		if(s1.startsWith(s2))
			System.out.println("前缀:1");
		else
			System.out.println("前缀:0");
		
		if(s1.endsWith(s3))
			System.out.println("后缀:1");
		else
			System.out.println("后缀:0");
		
		//返回子串
		s2 = s1.substring(5);
		System.out.println("单参数:"+s2);
		s2 = s1.substring(5, 8);
		System.out.println("双参数:"+s2);
		
		//数值转换
		n = Integer.parseInt(s3);
		System.out.println("转化Int:"+n);
		double d = Double.parseDouble(s2);
		System.out.println("转化Double:"+d);
		
		
	}

}