1.String类简介
String类是整个开发过程中至关重要的类型,字符串严格来说不算基本数据类型,Java为方便开发者编写程序,利用jvm支持制造了一种可以简单使用的进行直接赋值的处理。
例子:String对象实例化
public class Str{
public static void main (String args []){
String p="斗罗大陆"; //直接赋值
System.out.println (p);
}
}
String之所以可以保存字符串,是因为定义了数组,字符串每一个字符都保存在了数组之中。
2.字符串常量
程序开发之中,整数默认int型,小数默认double型,不提供字符串这样的基本数据类型。
所谓直接赋值是将一个匿名对象设置为具体对象。
字符串可以直接调用equals方法,程序中只存在String匿名对象,无String数据类型。
Equals()方法可以回避空值。匿名对象不会为空,进行字符串比较要把匿名对象写在前面。
例子:
public class Str{
public static void main (String args []){
String a=null;
String b=new String("123");
System.out.println (b.equals(a));
}
}
输出结果:false
如果System.out.println (a.equals(b)),造成空指向异常。
D:\java>javac Str.java
D:\java>java Str
Exception in thread “main” java.lang.NullPointerException
at Str.main(Str.java:5)
3.String对象常量池
对象池目的是实现数据共享处理。以String为例实现数据重用,即数据共享。
常量池分两种:
·静态常量池:程序在加载的时候会自动将此程序中保存的字符串、普通常量、类和方法的信息等全部进行分配;
·运行时常量池:当一个程序加载之后,里面可能有一些变量,这个时候提供的池。
例子:静态常量池
public class Str{
public static void main (String args []){
String a="123456";
String b="12"+"34"+"56";
System.out.println (b);
System.out.println (a==b);
}
}
输出:
123456
ture
本程序所给出的全部都是常量数据(字符串的常量都是匿名对象),所有最终在程序加载过程中自动加载对象常量池。
例子:运行时常量池
public class Str{
public static void main (String args []){
String a="123456";
String x="56";
String b="12"+"34"+x;
System.out.println (b);
System.out.println (a==b);
}
}
输出结果:
123456
False
这个时候为false,是因为程序加载过程中不确定b的内容,因为字符串追加过程中认为b是一个变量,变量内容可以修改,所有它不认为其结果为最终结果。
4.String类对象两种实例化方式比较
String实例化对象提供两种方式:
(1)直接复制对象实例化 ,String p=“屁崽是傻蛋”;
这种模式可以实现数据共享,最大特征是直接保存数据。
例子:
public class Str{
public static void main (String args []){
String a="123";
String b="123";
System.out.println (b==a);//地址判断
}
}
输出结果:ture
这两个对象指向的堆内存是相同的一个 ,实现数据共享。
在java程序底层里面提供有一个专门的字符串池(字符串数组)
在直接赋值方法中,如果定义新的字符串内容,会开辟内存空间,如果发现定义内容已存在,不会开辟新的空间,直接指向已有空间数据。
(2)构造方法实例化:String b=new String(“屁崽是傻蛋”)。
例子:
public class Str{
public static void main (String args []){
String a=new String("123");
String b=new String("123");
System.out.println ("equals:"+b.equals(a));
System.out.println ("==:"+b==a);
}
}
输出结果:
equals:true
= =:false
new一个对象会开辟一块空间,如果new了两个对象,而这两个对象具有相同的内容,则这两个对象虽然存在于不同的栈中,但是指向同一个堆,另一个对象所指向的堆空间将成为垃圾空间。
例子:更换一种形式
public class Str{
public static void main (String args []){
String a="123";
String b=new String("123");
System.out.println (a==b);
}
}
输出结果:false
构造方法实例化开辟的是专用空间。有时候也可以是实现手工入池。
public String intern();
例子:观察手工入池
public class Str{
public static void main (String args []){
String a="123";
String b=new String("123").intern();
System.out.println (a==b);
}
}
输出结果:ture
构造方法实现了池指向。
5.字符串比较
若要判断两个int型变量是否相等,那么肯定有相等运算符。进行“=”比较。
String类也可以进行判断,但是不准确。
例子:实现字符串相等判断
public class Str{
public static void main (String args []){
String a=new String("123");
String b=new String("123");
System.out.println (a==b);
}
}
输出结果:false
使用String提供的方法:public boolean equals(String str)
例子:
public class Str{
public static void main (String args []){
String a=new String("123");
String b=new String("123");
System.out.println (a.equals(b));
}
}
输出结果:true
6.字符串修改分析
在String类之中包含的是一个数组,数组最大缺点在于长度不可改变,在进行一个字符串定义以后,会自动开辟内存空间,内存空间开辟以后不可改变。
例子:字符串不可修改
public class Str{
public static void main (String args []){
String str="www.";
str+="mldn.";
str=str+"cn";
System.out.println (a);
}
}
输出结果:
www.mldn.cn
内存分析:
在整个处理过程中,字符串常量内容并没有发生改变,在变的只是String类的引用,并产生大量垃圾。
例子:观察程序
public class Str{
public static void main (String args []){
String a="123";
for(int x=0;x<100;x++){
a+=x;
}
System.out.println (a);
}
}
如果本程序出现在代码中,会产生一百的堆内存垃圾,String类指向会发生100次改变。