String类的基本特点
Java中所有的字符串要求使用 “” 进行定义,可以利用 ”+“ 实现字符串的连接处理。
介绍
字符串严格意义上不算是一个基本的数据类型,没有任何一门语言会提供字符串这种数据类型,而Java里面为了方便开发者进行项目的编写,利用JVM的支持制造了一种可以简单使用的String类,而且可以像基本数据类型那样进行直接赋值处理。
字符串是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象。
*A部分:赋值* public class StringDemo { public static void main(String args[]){ String str = "www.mldn.cn" ; // 直接赋值 System.out.println(str) ; } }以上代码是直接赋值:String类里面之所以可以保存字符串的原因是因为其中定义了一个数组(即:String里面所有的字符串中的每一个字符的数据都是保存在这个数组中)
所谓的字符型就是对数组的一种特殊包装应用;既然包装的是数组,所以字符串里边的内容无法改变。
public class StringDemo { public static void main(String args[]){ String str = new String("www.mldn.cn") ; //构造方法赋值 System.out.println(str) ; } }B部分:字符串比较
判断两个int 型变量是否相等,使用”==“来完成,这个是由程序直接提供的相等的运算符。
String类中的方法: -public boolean equals(String str);
总结:
”==“进行的是数值的比较,如果用于对象的比较上比较的是两个内存的地址数值;
equals();是类所提供的一个比较方法,可以直接进行字符串内容的判断;
对象判断小技巧:某些数据是用户输入,要求这些数据为一个指定内容的情况下建议将字符串常量写在前面。 (因为:这样做的话,equals()方法里面提供有一个可以回避null的判断,调用equals()方法的时候永远不可能出现”NullPointException“,)。
C部分:字符串常量是String类的匿名对象
在程序开发中,任何一个整数都是int型,任意的小数默认都是double;
对于字符串,程序不会提供有字符串这样的基本数据类型,可以提供的只是String类,所以任何 ‘’ ‘’ 定义的字符串常量实际上描述的都是一个String类的匿名对象。
String对象的直接赋值就是:将一个匿名类对象设置一个具体引用名字。
总结:程序中没有字符串常量这种基本类型,有的只是String类的匿名对象
D: String 类两种实例化方法的区别
第一种:直接赋值 (这样情况下只会开辟一块堆内存空间)
String str1=“chaochao”; String str2=“chaochao”;
这两个对象所指向的堆内存是同一个;
因为Java程序的底层里面提供有一个专门的字符串池(字符串数组);
直接赋值时,字符串可以实现数据的自动保存,这样再有相同数据定义时可以减少对象的产生,提升操作性能;
执行下面三条语句:
String strA = "mldn"; String strB = "mldn.java"; String strC = "mldn"; //String类池如下第二种:分析构造方法实例化(这样情况下,会开辟两块堆内存空间)
构造方法进行对象实例化是进行对象定义的时候的一种常用的做法,String类提供有构造方法实例化的做法。
String str = new String(“mldn”);
内存图如下:
开辟两块内存空间:匿名对象开辟一块;new关键字会开辟另一块;但是只会使用一块,字符串常量产生所定义的匿名空间将成为垃圾空间。
总结:
String strA = “mldn”; String strB = new String (“mldn”);
还有一个重要区别:使用构造方法实例化String对象时不会自动出现保存到字符串的处理(看下面代码)
public class StringDemo { public static void main(String args[]) { String strA = "mldn" ; String strB = new String("mldn") ; System.out.println(strA == strB) ; // false } } //可以发现构造方法实例化对象实际上是属于一种自己专用的内存空间。手工入池:public String intern();
public class StringDemo { public static void main(String args[]) { String strA = "mldn" ; String strB = new String("mldn") ; System.out.println(strA.equals(strB)) ; // true } } //使用了intern()方法,即便是构造出来的String类对象的内容也可以实现对象池的统一管理。面试题:请解释String类两种对象实例化方式区别。
直接赋值:只会产生一个实例化对象,且可以自动保存到对象池之中,以实现该字符串实例的重用; 构造方法:会产生两个实例化对象,且不会自动入池,但是可以用intern()方法手工入池处理。
E:String对象(常量)池
对象池的只要目的是实现数据的共享处理。以String对象池为例,就是为了重用。重用实际上是共享的设计。
在Java中对象(常量)实际上可以分为两种;
静态常量池:指的是程序(*.class)在加载的时候会将次程序之中保存的字符串,普通的常量,类和方法的信息等,全部进行分配;
运行时常量池:当一个程序(*.class)加载之后,里面可能有一些变量,这个时候提供的常量池。
public class StringDemo { public static void main(String args[]) { String strA = "www.mldn.cn" ; String strB = "www." + "mldn" + ".cn" ; System.out.println(strA == strB) ; // true } } //本程序中所给的内容都是常量数据(字符串的常量都是匿名对象); public class StringDemo { public static void main(String args[]) { String info = "mldn"; String strA = "www.mldn.cn" ; String strB = "www." + info + ".cn" ; System.out.println(strA == strB) ; // false } } //本程序中是因为在加载的时候并不确定info是什么内容; 因为在进行字符串连接的时候info采用的是一个变量,变量的内容是可以修改的,所以不认为最终的strB的结果就是一个所需要的最终结果。F:字符串内容不可修改
在String类之中包含的是一个数组,数组的最大缺点是长度不可以改变;当设置了一个字符串后,会自动的进行一个数组空间的开辟,开辟的内容长度是固定的。
public class StringDemo { public static void main(String args[]) { String str = "www." ; str += "mldn." ; str = str + "cn" ; System.out.println(str) ; } }内存处理如下:
以上操作:字符串常量的内容没有发生任何改变,改变的只是一个String对象的引用;这种这样的改变会带来大量的垃圾空间。
public class StringDemo { public static void main(String args[]) { String str = "www." ; for (int x = 0 ; x < 1000 ; x ++) { str += x ; } System.out.println(str) ; } } //此程序将会产生1000多个垃圾空间,且String对象的指向要修改1000次,这样的程序的性能非常差!G:Java中的主方法
public : 描述的是一种访问权限,主方法是一切的开始点,开始点一定是公共的;
static:程序的执行是通过类名称完成的,表示此方法是类直接调用的;
void:主方法是一切的起点,起点一旦开始就没有返回的可能;
main:是一个系统定义好的方法名称;
String args【】:字符串的数组,可以实现启动参数的接收;
public class StringDemo { public static void main(String args[]) { for (String arg : args) { System.out.println(arg) ; } } } //程序运行的时候可以设置参数,每一个参数之间使用空格分割; 如果参数本身就有空格,使用“”包装