看到你这个问题,我很纠结,String本身是一个java类,你创建她了,就会在堆内存中开辟一个空间,创建一个String类的实例对象,创建方式有2种,第一种种是通过new关键字来创建(String s = new String("HelloWorld")),第二种是通过反射的方式来创建,反射是用构造器(Constructor)来实例化一个对象的(newInstance(Object... initargs)方法),一般框架是用反射来实例化对象的,如SpringIOC。
需要注意的就是java中的类最终会被编译成字节码文件(二进制文件),由jvm的类加载器加载的。
String可以和Integer,Double等理解为是原始类型的包装类,包装类的好处是可以使用更多的方法,更符合面向对象的思想。
那么String为什么特殊呢?
因为String类在java中使用频率是最高的,几乎天天都要和String打交道,为了提高效率,当我们定义String s = "abc",String s2 = "bcd"的时候,会先在栈内存的常量池中存‘a’,'b','c'三个字符,当声明String s2 = “bcd”的时候,会在字符常量池中找有没有‘b’,'c','d',有就直接引用,没有就不创建,其实这种创建对象的方式也叫享元模式,int 的包装类Integer也使用了这种模式,不过Integer只会在常量池中存 -128~127之间的整数。
最后需要声明的是,String字符串类,她的底层是字符数组,就是字符串是由一个一个字符组合而来的。
希望对你有帮助!{:soso_e128:} |