java基础 JAVAString StringBuffer StringBuilder

package com.zemeng;


import java.util.Arrays;

import java.util.Date;


public class ArrayDemo {


public staticvoid main( String[] argv ){

/* 数组是长度不可改变,但是数组中的元素值可以改变;

 * 

 * String 字符串:

 * 

 *   String是java中一个不可变的类,所以它一旦被实例化就无法被修改。不可变类的实例一旦创建,内容无法再修改.

 * 不可变类有很多优势:

 * (1) 字符串常量池:

 * 字符串池是方法区中的一部分特殊存储。当一个字符串被创建的时候,首先会去这个字符串池中查找,如果找到,

 * 直接返回对该字符串的引用;  

 *      (也就是说,如果两个字符串的内容完全一样,那么他们的内存地址一定相等,且其实只有一份)

 * 

 * (2) 缓存Hashcode:

 * java中经常会用到字符串的哈希码。在HashMap中,字符串的不可变,保证了其hashcode永远相同;

 * 这样每次使用一个字符串的hashcode的时候,不用重新计算一次,更加高效;

 * 

 * (3) Set

 * 在Set中,默认方式就是通过字符串的hashcode来判断数据是否重复,而相同的string就必有相同的

 * hashcode,从而保证了Set中元素的唯一性;

 * 

 * (4) 线程的安全性;

 * 多线程操作之所以不安全,完全是因为多个子线程在同一时间内操作某个公共变量,且该变量在操作之后变量的值

 * 会发生改变;因为String一旦创建之后,就无法再修改其值,所以,String是线程安全的;

 * 

 * 

 * 

 * 

 * 

 * 

 * String类:

 * 

 * String类描述的文本字符串序列.

 * 创建String类对象的两种方式:

 * 1. String s = "1234";

 * 2. String s = new String();

 * 

 * 因为String类是对象类型,所以默认在new String()之后,初始化为""; 

 * */

String s = new String();

System.out.println( "hehe:"+s );

 

   /* 字符串常量池:

    *

    * */

String str1 = "jack";

String str2 = "jack";

String str3 = new String("jack");

String str4 = new String("jack");

System.out.println( str1 == str2 ); //true

System.out.println( str1 == str3 ); //false

System.out.println( str3 == str4 ); //false

/* 

*  由上面的字符串对象的内存地址比较 --> 得出字符串创建过程


     String str = "jack"这个语句会先检查字符串常量池是否存放这个"jack"这个字符串对象:

    如果常量池中存在, 则直接返回常量池中该字符串的内存地址值;

    如果不存在,那么会先在字符串常量池中创建这个字符串对象,然后返回地址值;

String str = new String("jack"); 这语句会创建两个对象,首先会先检查字符串常量池中是否存在jack这个字符串对象,

如果不存在就会创建,如果存在就返回内存地址值;

创建出来之后,new String这个语句就会在堆内存中开辟一个字符串对象。


注意: 

只有字符串常量才会被创建在 字符串常量池中; new 出来的String对象,还是存储在堆中的;

* */

/* 2.2 获取方法

*  字符串不具有属性,所以获取值时,都需要调用

*  (1) int  length();   获取字符串的长度

*  (2) char charAt( int index );  获取特定位置的字符( 注意下标越界 )

*  (3) int  indexOf( String str); 获取特定字符的位置

*  (4) int  lastIndexOf(intch);  获取最后一个字符的位置 

*  

*  */

String string  =new String("13rfshddhkfgfhfshdfdssffgf");

System.out.println( "字符串长度:"+string.length() );

for( inti=0; i<string.length();i++ ){

/* 获取字符串中指定位置的字符 */

System.out.print(string.charAt(i) );

}

System.out.println("");

/* 关于查找字符: indexOf,lastIndexOf 都只查找第一个遇到的该字符就停止,如果没有找到,返回-1 */

System.out.println("获取特定字符的位置:"+string.indexOf('d'));

System.out.println("在字符串中查找字符:(从后向前)"+string.lastIndexOf('d'));

/* 2.3 判断方法

* boolean isEmpty()  字符串长度是否为0;( 如果string==null,并不是为空;string.equals("")才是空 )

* boolean startsWith( subString );   判断是否以子串开头

* boolean endsWith( subString );     判断是否以子串结尾

* boolean contains( CharSequences ); 是否包含子串 ;

* boolean equals( Object abObject ); 判断两个字符串是否相等;

* boolean equalsIgnoreCase( String anotherString ); 忽略字符的大小写,判断两个字符串是否相等

* */

String temp = "";

System.out.println( "判断子串是否是空:"+temp.isEmpty() );

System.out.println( "判断是否以某子串开头:"+string.startsWith("13r") );

System.out.println("判断是否以某子串结尾:"+string.endsWith("ffgf"));

System.out.println("判断是否包含某子串:"+string.contains("ffggdsdf"));  

/* 因为String变量是引用类型的变量,所以 == 是判断两个字符串对象的地址, 如果要判断内容相等,要用equals(string) */

System.out.println( "判断两个字符串是否相等"+string.equals("afgfdddddef") );

System.out.println( "判断两个字符串是否相等(忽略大小写)"+string.equalsIgnoreCase(new String("abc")) );

/* 

* 2.4 转换方法

*

* String( char[] value ) 将字符数组转换为字符串

* String( char[] value, int offset,int count )  将字符数组的某个范围转换为字符串

* char[] toCharArray()     字符串转换为字符数组

* String( byte[] value )   byte数组 转 字符串

* String( byte )  

* byte[] getBytes()        字符串转byte数组

*  

* static String valueOf( char[] data );    字符数组转字符串

* static String valueOf( char[] data, int offset, int count ); 字符数组转字符串

* */

/* 字符数组 转 字符串 */

String str = new String( new char[]{'h','e','l','l','o'} );

System.out.println( str );

/* 字符串 转 字符数组 */

char[] chs =str.toCharArray();

System.out.println( Arrays.toString(chs) );

/* 字符串 转 byte[] */

byte[] bytes =str.getBytes();

System.out.println( Arrays.toString(bytes) );

/* byte[] 转 字符串 */

System.out.println( new String(bytes) );

System.out.println( new String( bytes, 2, 3 ) );

/* 2.5 其他方法

*  

* 注意: 

*     下面的方法涉及到字符串内容的替代,但是java中的字符串是常量,内容不会被替换;

*    能实现替换,截取等功能,是通过生成新的字符串并且返回来实现的;String对象中内容不改变;

*      

* String   subString( int beginIndex );   截取字符串

* String   subString( int beginIndex,int endIndex ); 截取字符串

* String   replace( char oldChar, char newChar )   替换

* String[] split( String regex );  切割 

* String   trim();  去除字符串首尾空格

* String toUpperCase()  字符串所有字母转大写

* String toLowerCase()  字符串所有字母转小写

**/

System.out.println( "截取子串到末尾:"+string.substring( 1 ) );

System.out.println( "截取子串:"+string.substring(3, 5) ); /* startIndex, endIndex 包头不包尾 */

System.out.println( "转换字母到大写:"+string.toUpperCase() );

System.out.println( "转换字母到小写:"+string.toLowerCase() );

 

System.out.println("字符串替换(先匹配字串,然后替换):"+string.replace("13r","    12345") );

System.out.println( "字符串切割:"+Arrays.toString(string.split("ddhk")) );

System.out.println( "去除首尾空格:"+string.trim() );

  }

}





//trim实现

String s = "  ddff  fff  fff  fff  ffff    ";

int start = 0;

int end   = s.length()-1;

for( int i=0; i<s.length(); i++ ){

if( s.charAt(i)  != ' ' ){

break;

}

start++;

}

for( int i=s.length()-1; i>0;  i-- ){

if( s.charAt(i) != ' ' ){

break;

}

end--;

}

System.out.println(start+"  "+end+"  \n"s.substring(start, end) );

//截取文件名字:

String s1 = "D:\\20120512\\day12\\Demo1.java";

String[] arr = s1.split("\\\\");

System.out.println( arr[arr.length-1] );


//将字符串对象中存储的字符反序:

char[] chs = s1.toCharArray();

int start1 = 0;

int end1   = chs.length-1;

while( start1 < end1 ){

char temp = chs[start1];

chs[start1] = chs[end1];

chs[end1] = temp;

 

start1++;

end1--;

}

System.out.println( new String(chs) );

//记录子串出现的次数

int count1 = 0;

int index = -1;

while( (index=s1.indexOf("12")) != -1 ){

s1 = s1.substring( index + "12".length() ); //去掉已经被查询过的子串;

count1++;

}

System.out.println( "count:"+count1 );


/* StringBuffer

 * 

 * StringBuffer: 由于String是不可变的,所以导致String对象泛滥,在频繁改变字符串对象的应用中,需要使用可变的字符串缓冲区类。

 * 

 * 特点:

 * (1) 默认缓冲区的容量是16

 *  (2) StringBuffer:  线程安全的所有的缓冲区 操作方法都是同步的; 效率底下;

 * 

 * 

 * 常用操作方法;

 * 

 * 1. 添加方法  append();

 * StringBuffer( "jack" );  //可以使用int, string, charSequence作为参数来初始化StringBuffer;

 * append();     在缓冲区的尾部添加新的文本对象;(支持基础数据,任意对象的追加,都会被转化为charSequence后追加)

 * insert();     在指定的下标位置添加新的文本对象;( 支持基础数据,任意对象的追加 )

 * 

 * */

StringBuffer sb = new StringBuffer("jack");

sb.append(true);

sb.append('a');

sb.append(97).append(34.0).append( new char[]{'o','o'} );

System.out.println( sb.toString() );

sb = new StringBuffer( "jack" );

sb.insert( 2, "java" );  //插入位置, 插入内容

System.out.println( sb.toString() );

  /*

   *2. 查看 

   * toString()  返回这个容器的字符串

   * indexOf( String str );  返回第一次出现的制定字符串在该字符序列中的索引;

   * lastIndexOf( String str );

   *    subString( int  start );  从开始的位置开始截取字符串;

   * */

/*

* 3.修改

*  replace( int start, int end, String str )   //替换子串

*   setCharAt( int index, char ch )  //替换字符

* */

/*

* 4.删除

*  delete( int start, int end )  //删除子串   delete(0, sb.length()) 清空缓冲区

*  deleteCharAt( int index )  //删除序列中的指定字符

* */

/*

* 5.反序

* reverse(); 把字符串反序输出

* */


//StringBuilder  ( 增 删  改  查 )

/*  |-- CharSequence ( 接口 )

 *     

 *       |--- String    

 *  

 *  |--- AbstractStringBuilder

 * 

 * |--- StringBuffer

 * 

 * |--- StringBuilder

 * 

 * 

 * 结构图上显示:   stringBuffer,StringBuilder属于同级关系, 且并不是继承自String类;

 * 

 * CharSequence接口的方法:

 * 1. int length();      字符序列的长度;

 * 2. char charAt( int index );  获取字符串指定位置的字符

 *  3. CharSequence subSequence( int start, int end );  截取字串

 *  4. String toString();  转换成字符串  

 *  

 *  

 *  

 *  

 * 基础概念:

 *  String: 此类代表字符串常量,它们的值在创建之后就无法再修改;只能通过生成新的字串来完成替换,截取等功能;

 * 

 *   StringBuffer: 是一个线程安全的可变字符序列,与String一样,在内存中保存的都是一个有序的字符串序列; 但是StringBuffer中字符内容可以变;

 *   

 *   StringBuilder: 与StringBuffer类相同,都是可变字符串系列, 不过StringBuilder是线程不安全的;

 *   

 *   

 *

 * 分析:

 * (1)   简单的说: String类型和 StringBuffer,StringBuilder类型的主要性能区别在于String是不可变的对象;

 * String类型每次进行改变的时候,其实都等同于生成了一个新的String对象,然后将指针指向新的String对象。所以频繁

 *      改变内容的字符串最好不要使用String, 每次出现字符串常量中不存在的字符串时,都会创建一份,且一直无法销毁;

 *  当然: 编译器也会将同一个表达式中的连续+链接的字符串常量优化成为一个字符串; 

 *   

 *   

 *  (2)   对StringBuilder类型进行修改时,就是对其对象本身进行改变,而不会产生新的对象,一般推荐使用StringBuilder;

 * 

 *  

 *  (3)  StringBuffer在程序中可将字符串缓冲区安全地用于多线程,而且在必要时可以对这些方法进行同步。在多线程情形,且该变量

 *      被多个子线程共享,且该Stringbuffer内容可能被修改的情况喜爱, 可以考虑使用StringBuffer对象来保存字符序列;

 *      

 *      

 *      

 *      

 *   

 *      

 * equal( charSequence ) 与 ==    

 * 

 * (1) String, StringBuffer, StringBuilder都是对象类型,所以==只能比较对象的地址;

 * 

 *  (2) equals( charSequence ) 默认也是比较地址;但是在String,StringBuffer,StringBuilder中被重写,比较的是字符序列;

 *  

 *

 * */



/* charSequence源码

 * 

 * package java.lang

 * public interface CharSequence {

 * 

 * 返回字符序列的长度:

 * int length();  

 * 

 * 返回指定索引的char值:

 * char charAt( int index );

 * 

 * 返回该序列的子序列

 * (startIndex, endIndex)  包头不包尾

 * CharSequence subSequence( int start, int end );

 * 

 * 返回一个包含该序列中字符的字符串,该字符串与序列的顺序相同

 * public String toString();

 * }

 *  

 *  

 *  

 *  

 *  

 *  StringBuilder源码

 *  

 *  package java.lang

 *  

 *  public final class StringBuilder extends AbstractStringBuilder

 *  implements  java.io.Serializable, CharSequence

 *  {

 *  

 *  static final long serialVersionUUID = 4383685877147921099L;

 *  

 * //四种初始化构造器

 *  

 *  不带任何参数的构造器:

 *  public StringBuilder() { super(16) }

 *  

 *  

 *  指定初始容量的构造器:  参数不能为负数,否则会抛出异常NegativeArraySizeException

 *  public StringBuilder( int capacity ){

 *  super(capacity);

 *  }

 *  

 *  

 *  参数为String对象的 构造器, 其初始容量为指定字符串的长度 + 16字节 ( 参数不能为null,否则抛出异常NULLPointerException )

 *  public StringBuilder( String str ){

 *  super( str.length() + 16 );

 *  append(str);

 *  }

 *  

 *  参数为charSequence的 构造器, 初始容量为 字符序列长度 + 16字节

 *  public StringBuilder( CharSequence seq ){

 *  

 *  this(seq.length() + 16);

 *  append(seq);

 *  }

 *  

 *  

 *  

 *  

 *  

 *  //各种类型数据的追加

 *  

 *  

 *  Object类型参数append, 会调用Object中的valueOf()获取对应的String值;

 *  public StringBuilder append( Object obj ){

 *  

 *  return append( String.valueOf(obj) );

 *  }

 *  

 *  

 *  String类型参数append, ( 如果参数为null, 那么追加"null"字符串 )

 *  public StringBuilder append( String str ){

 *  

 *  super.append( str );

 *  return this;

 *  }

 *  

 *  

 *  StringBuilder类型参数append  (如果参数为null,那么追加"null"字符串)

 *      public StringBuilder append( CharSequence s ){

 *      

 *      if( s == null ){

 *      s = "null";

 *      }

 *      

 *      if( s instanceof String ){

 *      return this.append( (String)s );

 *      }

 *      

 *      if( s instanceof StringBuffer ){

 *      return this.append( (StringBuffer)s );

 *      }

 *      

 *      if( s instanceof StringBuilder ){

 *      return this.append( (StringBuilder)s );

 *      }

 *      

 *      return this.append( s, 0, s.length );

 *      }

 *  

 *  

 *  public StringBuilder append( CharSequence s, int start, int end ){

 *  

 *  super.append( s, start, end );

 *  return this;

 *  }

 *  

 *  

 *  字符序列参数append:

 *  public StringBuilder append( char[] str ){

 *  

 *  super.append( str );

 *  return this;

 *  }

 *  

 *  字符序列参数,且指定起始位置 和长度

 *  public StringBuilder append( char[] str, int offset, int len ){

 *  

 *  super.append( str, offset, len );

 *  return this;

 *  }

 *  

 *  

 *  基础类型数据的添加 ---> 先封装成对应的对象数据类型,然后调用valueOf()方法获取到字符串

 *  public StringBuilder append( boolean b ) {

 *  super.append(b);

 *  return this; 

 *  }

 *  

 *  

 *  

 *  

 *  

 *  //删除子串序列  ( startIndex, endIndex ) 包头不包尾  ( 删除子串 )

 *  public StringBuilder delete( int start, int end ){

 *  super.delete( start, end );

 *  return this;

 *  }

 *  

 *  

//删除序列中指定位置上的字符 ( 删除字符 )

public StringBuilder deleteCharAt( int index ){

super.deleteCharAt( index );

return this;

}

 *  

 *  

 *  

 *  //使用给定的子串,替换序列中的子串; ( startIndex, endIndex )包头不包尾

 *  public StringBuilder replace( int start, int end , String str  ){

 *  

 *  super.replace( start, end, str );

 *  return this;

 *  }

 *  

 *  

 *  

 *  

 *  

 *  

 *  

 *  

 *  //插入

 * //1. 插入字符数组

 * public StringBuilder insert( int index, char[] str, int offset, int len ){

 * 

 * super.insert( index, str, offset, len );

 * } 

 * 

 * public StringBuilder insert( int offset, char[] str ){

 * 

 * super.insert( offset, str );

 * }

 * 

 *  

 *  //2. 插入对象

 *  public StringBuilder insert( int offset, Object obj ){

 *  return  insert( offset, String.valueOf(obj) );

 *  }

 *  

 *  //3. 字符串插入

 *  public StringBuilder insert( int offset, String str ){

 *  

 *  super.insert( offset, str );

 *  return this;

 *  }

 *  

 *  

 *   //4. 插入字符序列,  将整个序列插入

 *   public StringBuilder insert( int dstOffset, CharSequence s ){

 *   

 *   if( s==null ){

 *   s = "null";

 *   }

 *   

 *   if( s instanceof String ){

 *   return this.insert( dstOffset, (String)s );

 *   }

 *   

 *   return this.insert( dstOffset, s, 0, s.length ); 

 *   }

 *   

 *   

 *   //5. 将字符序列 的子序列插入此序列中

 *   public StringBuilder insert( int dstOffset, CharSequence s, int start, int end ){

 *   

 *   super.insert( dstOffset, s, start, end );

 *   return this;

 *   }

 *   

 *   

 *   //6. 插入基础数据, 转为封装类,然后通过valueOf(...),转化成字符串,然后insert

 *   public StringBuilder insert( int dstOffset, boolean b ){

 *   super.insert( dstOffset, b );

 *   return this;

 *   }

 *   ......

 *   

 *   

 *   

 *   

 *   

 *   

 *   查询某个子串在序列中的位置  indexOf, lastIndexOf

 *   public int indexOf( String str ){

 *   return indexOf(str, 0);

 *   }

 *   

 *   public int indexOf( String str, int fromIndex ){

 *   return String.indexOf( value, 0, count, str.toCharArray(), 0, str.length(), fromIndex );

 *   }

 *   

 *   public int lastIndexOf( String str ){

 *   

 *   return  lastIndexOf( str, count );

 *   }

 *   

 *   public int lastIndexOf( String str, int fromIndex ){

 *   

 *   return String.lastIndexOf( value, 0, count, str.toCharArray(), 0, str.length(), fromIndex );

 *   }

 *   

 *   

 *   

 *   

 * //reverse

 * public StringBuilder reverse(){

 * super.reverse();

 * return this;

 * }

 *   

 *   

 *  //返回字符串

 *  public String toString(){

 *  return new String( value, 0, count );

 *  } 

 *   

 *   

 *   

 *  }

 *  

 *  

 *  

 *  

 *  

 *  

 *  */


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值