天天看点

J2SE的学习——String类系统性学习

String类是我们在写代码的时候用到的最多的一种数据类型,那么关于String类有常用方法有哪些呢,又有哪些需要注意的地方的呢?这次我对String类进行了简单的学习。

1、String类常用的两种实例化的方法
J2SE的学习——String类系统性学习
2、用equals比较内容
package page20;

//equals比较的是具体的内容
public class Demo2 {
	public static void main(String[] args) {
		String name1="张三";
		String name2=new String("张三");
		String name3=name2;//传递,相当于C语言中的指针
		//比较的是引用,作用相当于地址
		System.out.println("name1==name2:"+(name1==name2));
		System.out.println("name1==name3:"+(name1==name3));
		System.out.println("name2==name3:"+(name2==name3));
		//比较的是内容
		System.out.println("name1==name2:"+(name1.equals(name2)));
		System.out.println("name1==name3:"+(name1.equals(name3)));
		System.out.println("name2==name3:"+(name2.equals(name3)));
	}
}
           
运行结果
J2SE的学习——String类系统性学习
先理解一下堆和栈的
J2SE的学习——String类系统性学习
name的相关视图
J2SE的学习——String类系统性学习

我们从下面把name1,name2,name3塞进去,出口就这一个,因此在数据结构中学的栈和队中,栈是先进后出的,并且系统分配的空间是连续的,而堆中,是在一个大的内存区域,开辟一块小区域,用于存放我们创建的对象,我们的name3是来源于对name2的引用的。

对于引用的理解我比较认同这个人说的,网址,自己点一下

J2SE的学习——String类系统性学习

通过上面的栈中的name对堆中的指向,可以看到,引用,和C语言中的指针很像,很可惜,java中是没有指针的,但是我们可以看到,name3中的数据,来自name2,因此系统是不会为一个引用分配新的堆存储单元的。

这里有一个常量池的概念,还有关于堆、栈、静态区、常量区、方法区的知识,因为自身能力的问题,没法写,不过这个人写的挺不错的,通俗易懂

Java内存图以及堆、栈、常量区、静态区、方法区的区别

3、String的两种实例化的区别 直接赋值的方式:创建的对象存放到字符串对象池里,加入池子中存在这个对象,就不会再创建新的。 new对象方式:每次都创建一个新的对象,不管是否存在,都会重新创建。
package page20;

public class Demo1 {
	public static void main(String[] args) {
		//实例化String的方式一
		String name1="张三";
		String name2="张三";//这里的name2是拿池子里面的
   			//实例化String的方式二 			String name3=new String("张三"); 			String name4=new String("张三");//name3,name4都是新建的
  	System.out.println("name1==name2:"+(name1==name2));//括号用于处理优先级问题
  	System.out.println("name1==name3:"+(name1==name3));
  	System.out.println("name3==name4:"+(name3==name4)); 		}
}
           
运行结果
J2SE的学习——String类系统性学习
本质上来说,这里相当于是地址的比较,创建相同的对象,取自一个池子里面的同一个,因此是一样的,这就是栈里面的name1,name2同时指向堆中的一个字符串,这个字符串就在字符串常量池中。
J2SE的学习——String类系统性学习

4、字符串的内容不可变性

字符串的特征:不能改变字符串的内容;

想要改变,只能通过指向一个新的内存内地址;

J2SE的学习——String类系统性学习
J2SE的学习——String类系统性学习
改变了,就是一个新的地址,此时张这个堆内存块就会被垃圾回收了,所以不是在张这个内存中增加个三,而是新建一个内存块,再把老的内存块回收掉!

5、String类的常用方法和基本使用

老样子,看Jdk文档

J2SE的学习——String类系统性学习
简单的两个实例
J2SE的学习——String类系统性学习
J2SE的学习——String类系统性学习
6、indexof:返回指定字符在字符串中第一次出现的索引
J2SE的学习——String类系统性学习
代码:
package page20;

public class Demo5 {
	public static void main(String[] args) {
		String st="xbwudbwcweib";//随便打一个字符串
		//这个索引是从零开始的
		System.out.println("d这个字符在字符串中第一次出现的位置是:"+st.indexOf('d'));
	}
}
           
运行效果
J2SE的学习——String类系统性学习
下面看一下这个
J2SE的学习——String类系统性学习
简单的看一下区别吧
package page20;

public class Demo6 {
	public static void main(String[] args) {
		String st="xbwudbwcweib";//随便打一个字符串
		//这个索引是从零开始的
		System.out.println("b这个字符在字符串中第一次出现的位置是:"+st.indexOf('b'));
		System.out.println("b这个字符在字符串中第一次出现的位置是,从索引4的位置开始找:"+st.indexOf('b',4));
	}
}
           
运行结果
J2SE的学习——String类系统性学习

7、substring:返回一个新的字符串,它是此字符串的子字符串

用Ctrl+F能够快速的找到

J2SE的学习——String类系统性学习
代码
package page20;

public class Demo7 {
	public static void main(String[] args) {
		String st="张三很帅!";
		System.out.println(st.substring(2));
	}
}
           
结果
J2SE的学习——String类系统性学习
下面这个是范围内进行输出:
J2SE的学习——String类系统性学习
7、字母转换大小写
J2SE的学习——String类系统性学习
J2SE的学习——String类系统性学习

一个是大写转化,一个是小写的转化,简单的写一下:

代码:

package page21;

public class Demo4 {
	public static void main(String[] args) {
		String st="I love English!";
		String upst=st.toUpperCase();
		System.out.println(upst);
		String lowerst=st.toLowerCase();
		System.out.println(lowerst);
	}
}
           
结果:
J2SE的学习——String类系统性学习
其他的可以自己简单的试一下,还蛮好玩的,很多细节的知识点,以后都能用上,特别是在开发时候,能够有效的减少代码的复杂度和代码的执行效率问题。page20、21