String类特点分析
String是整个系统中至关重要的组成类,所有的字符串要求使用“”进行定义,使用+进行连接;
String类简介
字符串严格意义上来讲不能算是一个基本数据类型,**没有任何语言提供字符串基本类型,**Java利用JVM的支持制造了一种可以简单使用的String类,可以直接进行幅值处理;
String可以保存字符串主要原因是其中定义了一个数组,也就是所有的字符串中的每一个字符都是保存在一个数组中;
源代码目录:jdk/lib/src.zip
从jdk1.9开始String类使用Byte类型,jdk1.8以后保存的是字符数组;
除了使用直接赋值的形式对对象进行实例化之外也可以按照传统的方式利用构造方法进行对象实例化处理
String str = new String("test!");
字符串比较
String类实际上也牵扯到一个相等的判断问题,但对于String类相等的判断问题也可以使用“”,只不过判断的不准确;
要想实现准确的字符串判断,那么可以使用String类中所提供的:
public boolean equals(String str);
Q:String比较中“”与“equals()”的区别?
A:“==”进行的数值比较,如果用于对象的比较比较的是两个内存的地址数值;而“equals”可以直接进行字符串内容的判断;
字符串常量
字符串常量是String类得匿名对象,对于字符串而言,语言不会提供字符串这种基本类型,任何使用双引号定义的字符串常量,实际上描述的都是一个String类的匿名对象;
所谓的String类对象的直接赋值直接描述的是将一个匿名对象设置一个具体引用的名字;
程序中没有字符串常量基本类型,有的只是String类的匿名对象;
equals可以提供一个可以回避null的判断,所以如果将字符串常量写在前面,那么额调用equals方法时不会出现“NullPointerException”,因为字符串是一个匿名对象,匿名对象一定是开辟好堆内存空间的对象;
String类对象两种实例化方式
1 直接赋值的对象实例化模式
- 将字符串赋值给String类的对象就可以实现对象的实例化处理,在这种情况下,只会开辟出一块堆内存空间;
- 利用直接赋值实例化String的形式还可以实现同一个字符串对象数据的共享操作,因为在JVM程序底层提供一个专门的字符串池(字符串数组),在采用直接赋值的处理过程中,对于字符串而言可以实现池数据的自动保存,再有相同对象定义时可以减少数据产生;
2 构造方法实例化
String str = new String("test");
- 匿名对象一定是开辟好堆内存空间的对象;
- 会开辟两块栈内存空间,之后使用一块,另外一块由于字符串常量所定义的匿名对象将成为垃圾空间;
String str = "test";
String strb = new String("test");
- 在使用构造方法实例化String类对象时不会自动出现保存到字符串池的处理;
- 构造方法实例化的对象实际上是属于一种自己专用的内存空间,在String类中提供手工入池处理的情况,方法为:public String intern();
String strb = new String("test").intern();
- 使用了intern方法,所以畸变是构造出来的String类对象的内容也可以实现对象池的统一管理;
Q:解释String类两种对象实例化对象的区别?
A:
- 直接赋值:只会产生一个实例化对象,且可以自动保存到对象池之中,以实现对象的重用操作;
- 构造方法:会产生两个实例化操作,不会自动入池,无法实现对象重用,可以使用intern()方法手工入池处理;
String对象常量池
对象池主要是为了实现数据的共享处理,以String对象池为例,里面的内容主要是为了重用,而重用属于共享设计,但在Java中对象(常量)池可以分为两种:
- 静态常量池:指的是程序(*.class)在加载的时候会自动将此程序中国保存的字符串、普通的常量、类方法等全部进行分配;
- 运行时常量池:当一个程序(*.class)加载之后,里面可能有一些变量;
字符串修改分析
String类长度不可改变,内容不可改变;
在整个处理过程中字符串常量没有发生任何改变,改变的只是一个String类对象的引用,这种改变将可能带来大量的垃圾空间;
String类不要进行内容(运行时常量池)的频繁修改
主方法组成分析
主方法组成是非常复杂的,
public static void main(String args[])
- public:描述的是一种访问权限,主方法是一切开始点,开始点一定是公共的;
- static:程序的执行是通过类名称完成的,表示此方法是由类直接调用的;
- void:一切的起点,一旦开始就没有返回的可能;
- main:一个系统定义好的方法名称;
- String args[]:字符串数组,可以实现程序启动参数的接收,但若参数本身有空格,则必须使用双引号包装;