String 引发的一些思考
2012-05-30 00:29
323 查看
简单的一条语句 String s="test"; 却蕴含着好多知识点在里面,借着这条语句对基础知识做个简单的总结:
1.String不是基本类型,(八种基本类型byte、int、char、long、float、double、boolean和short)是java类库提供的一种字符序列不可变长的类类型。既然属于类对象,那么就可以去new一个实例对象,那么和String s=new String("test");有什么区别呢?
2.String s="test"; 这是一种直接采用字符串直接量赋值的方式,test对象存放在字符串池中,此时创建的对象有两个或者一个,这个要看在字符串池中是否已经有了test这个对象。字符串池是具有相同字符序列的字符串只对应一个字符串实例对象。(这句话听起来有点拗口,在第三点解释)而String s=new String("test");是采用我们一般创建实例对象的方法创建的,一个new就创建了一个test对象,无论内容是否相同。所以不建议用new去创建一个String对象,这样即浪费内存,性能又低。采用字符串直接赋值的方式去创建String对象,只有当字符串池中没有该对象时才会去创建,否则直接返回该对象的引用值。
采用new构造器创建的字符串:
我们再来看看采用字符串直接量赋值的方式的运行结果
3.谈谈都有哪些方法创建的字符串是存放在字符串池中的: ①字符串直接量赋值; ②有限个字符串直接量进行“+”运算的结果(比如String s5="张三"+"李四",注意"+"号两边是字符串直接量,而不能含有变量);③String类的成员方法intern创建的字符串实例对象(感觉这个用的好像比较少)。也就是说 通过以上三种创建的字符串都存放在字符串池中,首先判断要创建的字符串是否在池中,如果已经存在的话,不会在创建一个,而是直接返回该字符串对象所在的引用值
(可以用"=="判断两个对象是否是指向同一引用 )否则,在池中创建一个新的字符串对象 。
通过上面的代码可以看到s4,s5,s6指向同一对象,他们的引用值都相同。如果通过new构造器创建,则他们各指向不同的对象,引用值就不同了,但各对象的内容(值)则是相同的。所以用"=="判断自然就返回false,用equals方法返回的是true;
4.”=="和"equals()"的区别: 当用new创建对象时Objet obj=new Object(),涉及了两块内存,对象本身占用一块内
存(堆内存),变量也占用一块内存
①:"=="可用于基本数据类型变量的比较,(也就是比较两个变量存放在内存中的值是否相等),也可用于类对象引用变量的比较(上面的例子都是引用变量的比较,比较的是这两个引用对象是否指向同一地址);equals()是用在两对象间的比较,比较的是对象的内容是否相同
②equals()方法是Object的方法,我们看到原始的equals()方法比较的是对象的引用值是否相等。因此String类对它进行了重写,目的是比较对象的内容是否相同。
当我们自己构造了一个类时,要比较实例对象是否相同(相同类且各成员域对应相等),一定要对equals()方法进行重写,注意重写时的参数是Object类型,而不要错写成自己构造类的类型了,否则就没有实现覆盖的效果。对于equals()方法的重写,参考《java核心技术 一卷》P161
5.在实际的应用中,可能用到更多的是StringBuffer这个类。StringBuffer是可变长的字符串缓冲区,用起来更加灵活,可以随意对字符串追加,增,删,改等操作。
1.String不是基本类型,(八种基本类型byte、int、char、long、float、double、boolean和short)是java类库提供的一种字符序列不可变长的类类型。既然属于类对象,那么就可以去new一个实例对象,那么和String s=new String("test");有什么区别呢?
2.String s="test"; 这是一种直接采用字符串直接量赋值的方式,test对象存放在字符串池中,此时创建的对象有两个或者一个,这个要看在字符串池中是否已经有了test这个对象。字符串池是具有相同字符序列的字符串只对应一个字符串实例对象。(这句话听起来有点拗口,在第三点解释)而String s=new String("test");是采用我们一般创建实例对象的方法创建的,一个new就创建了一个test对象,无论内容是否相同。所以不建议用new去创建一个String对象,这样即浪费内存,性能又低。采用字符串直接赋值的方式去创建String对象,只有当字符串池中没有该对象时才会去创建,否则直接返回该对象的引用值。
采用new构造器创建的字符串:
String s1=new String("张三"); String s2=new String("张三"); System.out.println(s1==s2); //false s1,s1分别指向两个不同的对象,即使对象的内容相同 System.out.println(s1.equals(s2)); //true
我们再来看看采用字符串直接量赋值的方式的运行结果
String s3="张三"; String s4="张三"; System.out.println(s3==s4); //true s3,s4指向同一对象,他们的对象引用值相同 System.out.println(s3.equals(s4)); //true
3.谈谈都有哪些方法创建的字符串是存放在字符串池中的: ①字符串直接量赋值; ②有限个字符串直接量进行“+”运算的结果(比如String s5="张三"+"李四",注意"+"号两边是字符串直接量,而不能含有变量);③String类的成员方法intern创建的字符串实例对象(感觉这个用的好像比较少)。也就是说 通过以上三种创建的字符串都存放在字符串池中,首先判断要创建的字符串是否在池中,如果已经存在的话,不会在创建一个,而是直接返回该字符串对象所在的引用值
(可以用"=="判断两个对象是否是指向同一引用 )否则,在池中创建一个新的字符串对象 。
String s4="张三"; String s5="张三"; String s6="张"+"三"; System.out.println(s4==s5); System.out.println(s4==s5); //true System.out.println(s4==s6); //true System.out.println(s4.equals(s5)); //true
通过上面的代码可以看到s4,s5,s6指向同一对象,他们的引用值都相同。如果通过new构造器创建,则他们各指向不同的对象,引用值就不同了,但各对象的内容(值)则是相同的。所以用"=="判断自然就返回false,用equals方法返回的是true;
4.”=="和"equals()"的区别: 当用new创建对象时Objet obj=new Object(),涉及了两块内存,对象本身占用一块内
存(堆内存),变量也占用一块内存
①:"=="可用于基本数据类型变量的比较,(也就是比较两个变量存放在内存中的值是否相等),也可用于类对象引用变量的比较(上面的例子都是引用变量的比较,比较的是这两个引用对象是否指向同一地址);equals()是用在两对象间的比较,比较的是对象的内容是否相同
String s7="张三"; String s8=new String("张三"); String s9="张三"; System.out.println(s7==s8); //false,我们看到s7和s8即使内容相同,但他们的引用值却是不同的 System.out.println(s7.equals(s8)); //true System.out.println(s7==s9); //true ,这就是我们上面讲的字符串池的知识点
②equals()方法是Object的方法,我们看到原始的equals()方法比较的是对象的引用值是否相等。因此String类对它进行了重写,目的是比较对象的内容是否相同。
object类中的equals()方法: public boolean equals(Object obj) { //调用equal的对象的地址和参数对象的地址是否相等 return (this == obj); }
当我们自己构造了一个类时,要比较实例对象是否相同(相同类且各成员域对应相等),一定要对equals()方法进行重写,注意重写时的参数是Object类型,而不要错写成自己构造类的类型了,否则就没有实现覆盖的效果。对于equals()方法的重写,参考《java核心技术 一卷》P161
5.在实际的应用中,可能用到更多的是StringBuffer这个类。StringBuffer是可变长的字符串缓冲区,用起来更加灵活,可以随意对字符串追加,增,删,改等操作。
相关文章推荐
- mysql并发操作引发的一些思考
- 关于“JAVA中为什么没有了多继承并出现了接口”这一问题引发的一些思考
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- 如何在PHP中保持SESSION以及由此引发的一些思考
- Sql Server之旅——终点站 nolock引发的三级事件的一些思考
- Topk引发的一些简单的思考
- 如何在PHP中保持SESSION以及由此引发的一些思考
- 开车误闯红灯的补救方法 (以及由此引发的一些思考)
- 从文档的编写问题引发的一些思考
- 一道小学五年级的数学题引发的一些思考
- 由url 引发的一些思考
- 浅谈Python由__dict__和dir()引发的一些思考
- 由阿里一道笔试题引发的思考/ String
- 由802.11 隐藏节点引发的一些思考
- 开车误闯红灯的补救方法 (以及由此引发的一些思考)
- Objective-C关于id引发的一些思考
- String.valueOf(l)方法引发的关于2String、String.valueOf、toString区别的思考
- 由QTP引发的一些思考
- 由循环次数设定引发的一些思考
- string的内存分配引发的思考