• 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("
    =====================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在多线程时,不会产生问题,由于对字符串的编辑进行了同步



  • 相关阅读:
    【Networking】(转)一个非常好的epoll+线程池服务器Demo
    【算法】Logistic regression (逻辑回归) 概述
    【Linux】/dev/null 2>&1 详解
    单点登录与联合登录
    web项目报outmemory错误解决方案
    hadoop学习之HDFS
    ELK日志分析系统
    基于cookie共享的SSO中的遇到的问题
    oracle的隐式游标
    mysql截取字符串与reverse函数
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5079476.html
Copyright © 2020-2023  润新知