黑马程序员:String介绍及String的常用方法介绍

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

String类

字符串是一个特殊的对象
String str = "abc";  //str是一个类类型变量,"abc"是一个对象
String str_object = new String("abc");
字符串一旦初始化就不可以被改变(被final修饰)
示例:
class StringOne
{
	public static void main(String[] args)
	{
		String str = "abc";
		System.out.println("abc对象内存地址:0x"+Integer.toHexString(str.hashCode()));
		str = "zzz";
		System.out.println("abc对象内存地址:0x"+Integer.toHexString(str.hashCode()));
		System.out.println(str); //输出结果为zzz,其实abc这个对象没变,变的是str引用的对象内存地址变成了zzz这个对象的地址
	}
}

String s1 = "abc";
String s2 = new String("abc");
s1和s2有何不同?
s1在内存中有一个对象
s2在内存中有两个对象
详细说明:

class StringOne
{
	//为了测试两个class中的字符串是否能引用而弄的show方法
	public static void show()
	{
		String s2 = new String("abc"); 
	}
}
class StringTwo
{
	public static void main(String[] args)
	{
		String s1 = "abc";
		String s2 = new String("xyz"); 
		String s3 = new String("abc"); 
		StringOne.show();
	}
}
通过javap -c StringOne 反编译:
Compiled from "StringOne.java"
class StringOne {
  StringOne();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        


  public static void show();
    Code:
       0: new           #2                  // class java/lang/String 创建一个对象
       3: dup           
       4: ldc           #3                  // String abc 引用StringTwo()Code 0
       6: invokespecial #4                  // Method java/lang/String."<init>":(Ljava/lang/String;)V String类型实例初始化
       9: astore_0      
      10: return        
}


通过javap -c StringTwo 反编译:
Compiled from "StringOne.java"
class StringTwo {
  StringTwo();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        


  public static void main(java.lang.String[]);
    Code:
       0: ldc           #2                  // String abc 此句将String abc常量值从常量池中推送至栈顶
       2: astore_1      
       3: new           #3                  // class java/lang/String 创建一个对象
       6: dup           
       7: ldc           #4                  // String xyz 此句将String xyz常量值从常量池中推送至栈顶
       9: invokespecial #5                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
      12: astore_2      
      13: new           #3                  // class java/lang/String 创建一个对象
      16: dup           
      17: ldc           #2                  // String abc 引用Code 0
      19: invokespecial #5                  // Method java/lang/String."<init>":(Ljava/lang/String;)V
      22: astore_3      
      23: invokestatic  #6                  // Method StringOne.show:()V 使用StringOne.show()方法 ()V表示 void show(),V表示无返回值
      26: return        
}

从上面可知:
1.创建了多少个对象要看环境是怎么样的,如同类中会发生引用对象,而不是创建对象(StringTwo中的#2)
2.初看两个class之间同字符串对象不会引用,但分析内存可知,两个类都加载在内存当中时,字符串对象放入常量池后,再使用就会引用,这里#索引地址不一样是因为javap对两个class的分别分析导致
3.字符串在编译时直接存入常量池中
4.new对象在编译时只做初始化动作,运行时才赋值
5.StringOne在编译时,创建了两个对象,一个是new创建并初始化(并未实例化),一个是abc这个字符串对象。运行时new对象实例化,引用abc对象,如果说内存中存在几个对象,那必然是存在两个对象。
6.与5不同一点在于,第一次abc字符串对象创建,第二次的字符串abc只是引用第一次创建的

java常量池技术   java中的常量池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,不同于使用new关键字创建的对象所在的堆空间。

示例:
class StringOne
{
	public static void main(String[] args)
	{
		String s1 = "abc";  //一个对象:abc
		String s2 = new String("abc"); //两个对象 第一个:new  第二个:abc
		System.out.println(s1==s2); //false
		System.out.println(s2.equals(s1));//true equals方法被String类覆盖了 关于String对象中equals方法返回说明:如果给定对象表示的 String 与此 String 相等,则返回 true;否则返回 false。
	}
}

String类适用于描述字符串事物
那么它就提供了多个方法对字符串进行操作
常见的操作:

一.获取
1.1 字符串中包含的字符数,即字符串长度
int length();  //这个是String类中的方法,不同于数组中的arr.length 这是数组的属性
1.2 根据位置获取位置上的某个字符
char charAt(int index)
1.3 根据字符获取该字符在字符串中的位置
int indexOf(int ch):返回的是ch字符在字符串中第一次出现的位置 int ch 用的是ASCII码值,所以传入int类型
int indexOf(int ch, int fromIndex):从fromIndex指定位置开始,返回ch字符在字符串中的位置
int indexOf(String str)
int indexOf(String str, int fromIndex) 同理,返回的是字符串在字符串中的位置
int lastIndexOf(int ch) 方法与上面一样,也支持字符串,返回指定字符在此字符串中最后一次出现处的索引




示例:
class StringMethodDemo
{
	static void method_get()
	{
		String str = "abcdefgabc";
		//打印字符串长度
		sop(str.length()); // 10
		//获取index为5的字符
		sop(str.charAt(50));  // f //若index超过length()-1,则运行时会出现StringIndexOutOfBoundsException异常(属于RuntimeException)
		//获取字符b的index
		sop(str.indexOf('b')); // 1  若返回-1,表示该字符不再字符串中存在
		//获取字符b的index,从fromindex=3开始
		sop(str.indexOf('b',3)); //8
		//获取字符串abc的index
		sop(str.indexOf("abc")); // 0
		//获取字符abc的index,从fromindex=2开始
		sop(str.indexOf("abc",2)); // 7
		//获取最后第一个a的index
		sop(str.lastIndexOf('a')); // 7
		//获取最后第一个a的index,fromindex=6开始(从后往前找,及从g开始gfedcba,这个a的index为0)
		sop(str.lastIndexOf('a',6)); // 0
	}
	public static void main(String[] args)
	{
		method_get();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

二.判断
2.1字符串中是否包含某一个子串
boolean contains(str); //也可以用indexOf(str),若返回的不是-1,那就包含
2.2字符串是否有内容
boolean isEmpty(); //原理:若str.length() == 0,则返回true
2.3字符串是否是以指定内容开头
boolean startsWith(str);
2.4字符串是否是以指定内容结尾
boolean endsWith(str);
2.5判断字符串内容是否相同,该方法覆盖了Object中的equals方法
boolean equals(str);
2.6判断内容是否内容,并忽略大小写(equals方法不忽略大小写)
boolean equalsIgnoreCase(); //比如用户验证时,根据情况比较字符串

示例:
class StringMethodDemo
{
	static void isMethod()
	{
		String str = "ArrayDemo.java";
		String str1 = "arraydemo.java";
		//判断字符串中是否包含某一个子串
		sop(str.contains("Demo")); //true
		sop(str.indexOf("Demo")); // 5 说明存在
		//判断字符串是否有内容
		sop(str.isEmpty()); //false
		sop(str.length()==0); //false
		//字符串是否是以Array开头
		sop(str.startsWith("Array")); //true
		//字符串是否是以.java结尾
		sop(str.endsWith(".java")); //true
		//字符串中的内容是否相等,不忽略大小写
		sop(str.equals(str1)); //false
		//字符串中的内容是否相等,忽略大小写
		sop(str.equalsIgnoreCase(str1)); //true
	}
	public static void main(String[] args)
	{
		isMethod();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

三.转换
3.1将字符数组转成字符串
构造函数: String(char[] value) 
String(char[] value, int offset, int count) //把数组中的一部分转化成字符串
静态方法: static String copyValueOf(char[] data) //只操作字符数组
static String copyValueOf(char[] data, int offset, int count) 
static String ValueOf(char[] data) //还可以操作基本数据类型,如int,float,char等等
static String ValueOf(char[] data, int offset, int count) 

3.2将字符串转成字符数组
char[] toCharArray()
3.3将字节数组转成字符串
String(byte[] value) 
String(byte[] value, int offset, int count)
3.4将字符串转成字节数组
byte[] getBytes()
byte[] getBytes(Charset charset) 
字符串和字节数组在转化过程中,是可以指定编码表的
Java 虚拟机的每个实例都有默认的 charset,它可能是也可能不是某个标准 charset。默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统使用的 charset 来确定。 
3.5将基本数据类型转化成字符串
static String valueOf(int)
static String valueOf(double)
...
static String valueOf(boolean)
static String valueOf(char)

示例:
class StringMethodDemo
{
	static void method_trans()
	{
		char[] ch = {'a','b','c','d','e','f'};
		String str = new String(ch); 
		String str1 = new String(ch,1,3);
		String str2 = "bcdxyz";
		char[] ch1 = str2.toCharArray();
		byte[] b = str2.getBytes();
		System.out.println("第一种方法(通过构造函数实现):"+str);
		System.out.println("第一种方法:"+str1);
		System.out.println("第二种方法(使用String静态方法):"+String.copyValueOf(ch));
		System.out.println("第二种方法:"+String.copyValueOf(ch,1,3));
		for (int x=0; x<ch1.length; x++)
			System.out.println("通过toCharArray()把字符串转化为字符数组:ch1["+x+"]="+ch1[x]);
		for (int x=0; x<b.length; x++)
			System.out.println("通过getBytes()把字符串转化为字节数组:b["+x+"]="+b[x]);
	}
	public static void main(String[] args)
	{
		method_trans();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

四.替换 String replace(oldchar,newchar); 支持字符替换,也支持字符串替换
示例:
class StringMethodDemo
{
	static void method_replace()
	{
		String str = "Hello java!";
		sop(str.replace('a','b')); //Hello jbvb! 如果需要被替换的字符串不存在,则返回原字符串
		sop(str.replace("java","world")); //Hello world! 
		sop(str); // Hello java! 原因:字符串一旦初始化之后不能改变,JVM当常量处理
	}
	public static void main(String[] args)
	{
		method_replace();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

五.切割 String[] split(regex);
示例:
class StringMethodDemo
{
	public static void method_split()
	{
		String s = "zhanshang,lisi,wangwu";
		String[] arr = s.split(",");
		for (int x=0; x<arr.length; x++)
		{
			sop(arr[x]);
		}
	}
	public static void main(String[] args)
	{
		method_split();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

六.子串:获取字符串中的一部分
String substring(begin);
String substring(begin,end); //返回的字符串包头不包尾


七.转换,去两端空格,比较
7.1将字符串全部转换成大写或者小写
String toUpperCase();
String toLowerCase();
7.2将字符串两端的空格去掉
String trim();
7.3对两个字符串进行自然顺序的比较
int compareTo(string);
String str1 = "acc";
String str2 = "aaa";
str1.compareTo(str2); //结果为 2 解析:两个字符串第一个字符相同,比第二个字符,不同,按ASCII编码相减c-a即99-97=2,所以结果为2,后面的不再比较
官方注解:
返回:如果参数字符串等于此字符串,则返回值 0;如果此字符串按字典顺序小于字符串参数,则返回一个小于 0 的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于 0 的值。

示例:
class StringMethodDemo
{
	public static void otherMethodShow()
	{
		String str1 = "   Hello Java!   ";
		String str2 = "acb";
		String str3 = "aaa";
		String str4 = "abcdef";
		sop(str1.toUpperCase()); //   HELLO JAVA! 
		sop(str1.toLowerCase());//   hello java!  
		sop(str1.trim());//Hello Java!
		sop(str2.compareTo(str3));//2
		sop(str4.substring(2));//cdef
		sop(str4.substring(2,4));//cd 包含头不包含尾
	}
	
	public static void main(String[] args)
	{
		otherMethodShow();
	}
	static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------详细请查看: http://edu.csdn.net
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值