转发对String 的理解

    技术2025-11-29  15

    最近发现对String使用有太多不恰当的地方,缘于自己对String的理解存在问题. 汗.........

     

    Java_String

    java 2010-01-12 21:08:24 阅读43 评论0   字号: 订阅

    --String a="zhangsan";   String b="zhangsan";   内存分析:   第一句:String a="zhangsan"; -----"zhangsan"是常量,所以会在data segment中的字符串缓冲池中开辟内存空间并将其放入,放入后直接将这块内存的地址给a   第二句:String b="zhangsan";------"zhangsan"是常量,所以首先回去data segment中的字符串缓冲池中找这个字符串,由于找到了,直接将这块内存地址给b   于是a==b//true,    a.equals(b)//true--String a=new String("zhangsan");   String a=new String("zhangsan");   内存分析   第一句:String a=new String("zhangsan"); -----"zhangsan"是常量,所以会在data segment中的字符串缓冲池中开辟内存空间并将其放入,但是使用了new关键字,在堆中开辟空间并将将该data segment的值拷贝到该堆内存中,并返回引用地址给a   第二句:String b=new String("zhangsan"); -----"zhangsan"是常量,所以首先回去data segment中的字符串缓冲池中找这个字符串,由于找到了,而且使用了new关键字,在堆中开辟空间并将将该data segment的值拷贝到该堆内存中,并返回引用地址给b   于是a==b//false,    a.equals(b)//true--String a = "ja"+"va";--不会在堆中创建内存空间,强调"ja"+"va"在编译的后就成为"java"了,所以不会在data segment中创建"ja" 和 "va"   String b="java"   String c=a+"good";--创建堆上空间将a的值拷贝到其中,在创建"good"内存空间将"good"的值拷贝到其中,在堆上创建第三个内存空间合并a和"good"返回内存地址   内存分析:a和b指向相同的data segment区域,指针一样,都不会在堆上创建内存空间,但是这种直接指向data segment的类型如果需要运算的话会在堆上创建临时空间,但是指针不会改变            --String a="a,b,c,";a.split(",")和String a="a,b,c, ";a.split(",")的区别 *非常智能第一个返回三个元素的数组,第二个返回四个元素的数组

    --String和StringBuffer的区别 *String代表的是不可变的字符序列  为不可变对象,一旦被创建,就不能修改它的值.  对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. *StringBuffer代表的是可变的字符序列  是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象  为什么能变呢?因为里面用char数组动态增加内存容量,所以可以用append方法动态改变字符串,且内存地址不变   String a="zhangsan"; s+="a"; 可以分析出这种开销是非常大的 --File类,并不是代表一个实际存在的文件 *它只是在内存中保存该文件的文件名字而已,不是一个实际的文件奥--public String final File.Separator静态属性存放间隔修饰符号。不区分任何的操作系统 *路径中/在使用的时候需要转义奥--java中的枚举 记住固定用法就行了,我觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。 public enum Color{  Red,  Blue } void main(String[] args){  Color color=Color.Red;  //枚举可以用在switch中 }

    最新回复(0)