Java读书笔记三(字符串)

 

 1.介绍

本篇博客将对JAVA中的字符串类的基本知识进行介绍,主要字符串类的一些常用方法等内容。


 2.字符串对象的创建

1.有两种形式,但是在开发中经常习惯于String 变量名的形式来进行操作。

<span style="font-family:SimSun;font-size:18px;">package com.String;

public class Sample13_1 {
	public static void main(String args[])
	{
		//使用简单语法创建字符串对象
		String s1=" Java核心技术大全欢迎您!!";
		//使用构造器创建字符串对象
		String s2=new String("恭喜你分别用两种不同的语法创建了字符串!!");
		//创建空字符串对象
		String s3="";
		//字符串引用s4的值为null
		String s4=null;
		//打印内容
		System.out.println(s1+"#"+s2+"#"+s3+"#"+s4);
	}
}
</span>


2.String类的一些重要的方法

String作为一个对象的身份出现,肯定少不了一些操作字符串的方法,常用的方法汇总如下。

<span style="font-family:SimSun;font-size:18px;">package com.String;

public class Sample13_3 {
	public static void main(String args[]) {
		String s1 = "JavaSE6.0核心技术大全欢迎您!!";
		String s2 = new String("恭喜你分别用两种不同的语法创建了字符串!!");
		String s3;
		// 使用charAt方法获取字符串中某个字符
		System.out
				.println("=====================charAt=======================");
		char c = s1.charAt(4);
		System.out.println("从0开始数,字符串s1中第4个字符为:" + c);
		// 使用toCharArray方法将字符串转换为字符数组
		System.out
				.println("=====================toCharArray==================");
		char[] array = s1.toCharArray();
		System.out.print("将char数组倒着打印:");
		for (int i = array.length - 1; i >= 0; i--)
			System.out.print(array[i]);
		// 使用concat方法连接两个字符串
		System.out
				.println("\n=====================concat=======================");
		s3 = s1.concat(s2);
		System.out.println("将两个字符串连接后的结果为:" + s3);
		// 使用equals方法比较两个字符串的内容
		System.out
				.println("=====================equals=======================");
		s3 = "JavaSE6.0核心技术大全欢迎您!!";
		if (s1.equals(s3))
			System.out.println("恭喜你测试成功,s1与s3中的内容是完全相同的!!");
		// 使用equalsIgnoreCase方法在不区分大小写的情况下比较两个字符串的内容
		System.out
				.println("=================equalsIgnoreCase=================");
		s3 = "JAVASE6.0核心技术大全欢迎您!!";
		if (s1.equalsIgnoreCase(s3))
			System.out.println("s1与s3中的内容在不区分大小写的情况下是相同的!!");
		// 使用length方法获取字符串的长度
		System.out
				.println("======================length======================");
		int size = s1.length();
		System.out.println("s1中字符的个数为:" + size);
		// 使用replace方法替换字符串中某个字符
		System.out
				.println("======================replace=====================");
		s3 = s1.replace('a', 'X');
		System.out.println("将s1中所有的字母a换成字母X:" + s3);
		// 使用substring方法获取字符串的某个子串
		System.out
				.println("======================substring===================");
		s3 = s1.substring(10);
		System.out.println("从0开始数,s1中第10个字符往后字符串为:" + s3);
		s3 = s1.substring(2, 10);
		System.out.println("从0开始数,s1中第2个字符到第10个字符的字符串为:" + s3);
		// 使用toLowerCase方法将字符串的字符全换成小写
		System.out
				.println("======================toLowerCase=================");
		s3 = s1.toLowerCase();
		System.out.println("将s1中的字符全换成小写:" + s3);
		// 使用toUpperCase方法将字符串的字符全换成大写
		System.out
				.println("======================toUpperCase=================");
		s3 = s1.toUpperCase();
		System.out.println("将s1中的字符全换成大写:" + s3);
		// 使用trim方法去掉字符串头部和尾部的不可见字符
		System.out
				.println("======================trim========================");
		s3 = "          Java SE6.0        ";
		System.out.println("s3没有用过trim方法前:[" + s3 + "]");
		s3 = s3.trim();
		System.out.println("s3用过trim方法后:[" + s3 + "]");
	}
}
</span>


3.String对象的内存机制

String对象有“一次投入,终身回报”的好处,下面先来分析一段代码

<span style="font-family:SimSun;font-size:18px;">package com.String;

public class Sample13_4 {
	public static void main(String args[]) {
		// 使用简单语法创建字符串s1与s2
		String s1 = "JavaSE6.0";
		String s2 = "JavaSE6.0";
		// 使用构造器创建字符串s3
		String s3 = new String("JavaSE6.0");
		// 使用==比较字符串s1与s2
		if (s1 == s2) {
			System.out.println("字符串s1与字符串s2通过等于测试,结果返回true");
		} else {
			System.out.println("字符串s1与字符串s2没有通过等于测试,结果返回false");
		}
		// 使用==比较字符串s1与s3
		if (s1 == s3) {
			System.out.println("字符串s1与字符串s3通过等于测试,结果返回true");
		} else {
			System.out.println("字符串s1与字符串s3没有通过等于测试,结果返回false");
		}
		// 使用equals方法比较字符串s1与s3
		if (s1.equals(s3)) {
			System.out.println("字符串s1与字符串s3内容相同,结果返回true");
		} else {
			System.out.println("字符串s1与字符串s3内容不同,结果返回false");
		}
	}
}
</span>


如果允许上述实例的话,会出现意想不到的结果,下面来简单的分析下String的内存机制.

JVM在运行时,将内存分为两个部分,一个是堆;一个是栈;堆中放置的是对象;栈中放置的是对象的引用或局部变量。java在内存设计时,又在堆中开辟了一个很小的内存,称为字符串常量池,用来存放特定的字符串对象。

当使用String s1=“xxxx”创建时,会首先查看常量池中是否已经包含,如果有的话,直接将引用指向即可。



所以运行上述实例的时候,就不会惊讶了。通过这样设计在创建的时候就已经把字符串给比较了,以后比较中只需比较两个引用是否指向的是同一个对象即可。需要注意的是采用new创建的字符串对象,会直接在堆上创建出字符串对象,没有此效果。


 3.StringBuffer类

上面介绍了String类,但是也有不足之处,如果在用String类进行字符串拼接的话,内存消耗将会很大,因此为了弥补String的不足,StringBuffer出现了。通过StringBuffer在拼接字符串时,不会产生中间对象,因此当需要对字符串做大量连接时,应该使用StringBuffer类

StringBuffer类的常用方法如下

<span style="font-family:SimSun;font-size:18px;">package com.String;

public class Sample13_10 {
	public static void main(String[] args) {
		StringBuffer sb1 = new StringBuffer("Java6.0");
		System.out.println("操作之前对象sb1的内容为:" + sb1);
		// 对sb1进行一系列操作
		sb1.append("核心技术大全").insert(4, "SE").delete(9, 15).reverse();
		System.out.println("一系列操作之后对象sb1的内容为:" + sb1);
		// 创建内容与sb1相同的StringBuffer对象sb2
		StringBuffer sb2 = new StringBuffer(sb1.toString());
		// 使用StringBuffer的equals方法测试
		System.out.println("====使用StringBuffer的equals方法测试对象sb1与sb2的内容====");
		if (sb1.equals(sb2)) {
			System.out.println("对象sb1与sb2的内容相同!!!");
		} else {
			System.out.println("对象sb1与sb2的内容不相同!!!");
		}
		// 使用toString方法后使用equals方法测试
		System.out.println("====使用toString方法后使用equals方法测试对象sb1与sb2的内容====");
		String s1 = sb1.toString();
		String s2 = sb2.toString();
		if (s1.equals(s2)) {
			System.out.println("对象sb1与sb2的内容相同!!");
		} else {
			System.out.println("对象sb1与sb2的内容不相同!!");
		}
	}
}
</span>


 4.StringBuilder类

StringBuilder类与StringBuffer类用法类似,都可以来做大量字符串的拼接操作。


 5.StringBuilder与StringBuffer的区别

1.首先StringBuilder的执行效率要比StringBuffer类高一些,但是StringBuilder类的字符串编辑方法没有进行同步,在多线程时会产生问题。

2.StringBuffer在多线程时,不会产生问题,因为对字符串的编辑进行了同步



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值