---------------------- 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