String、StringBuffer、StringBuilder
2015-09-11 11:54
525 查看
一、String类
1、String是final类,不可被继承;
2、String底层是通过char数组来实现(通过查看源码得知);另外字符串的相关修改操作都会生成一个新的String对象;
注:String对象的任何改变都不会影响到原对象,相关的任何change操作都会生成新的String对象(具体可以参看源码)
3、字符串常量通常存在常量池中,如:
String str1 = "hello world";
String str2 = "hello world";
这两个语句如果使用equals方法会返回true,使用==也会返回true;但如果是下面的:
String str3 = new String("Hello world");
String str4 = new String("hello world");
如果使用equals方法判断3和4,会相等,但使用==会返回false,这是因为==比较的是其值,引用不同,所以返回false;
但3和4创建过程:1和2都会放入到常量池中,对应同一个地址,引用放在栈中以供使用(仅仅一份);而3和4是通过
new来创建的,先去检查常量池中有没有相同的,如果有就拷贝一份并在堆中生成一个String对象存放;如果没有就直接在
堆中生成一个String对象, 相关的引用放在栈中以供使用
二、StringBuffer类(线程安全,不可继承)
1、StringBuffer相比String类来效率会高很多,是因为String进行相关change操作会生成很多的临时变量string对象,占用内存
而StringBuffer仅仅生成一个对象,占用内存较少;其中方法都是synchronized,是线程安全的;
2、推荐使用StringBuffer类
三、StringBuilder类(线程不安全,不可被继承)
1、StringBuilder类和StringBuffer基本一致,但StringBuilder不是线程安全的,效率稍微高点;
2、StringBuilder类和StringBuffer类仍然都是底层为char数组,默认初始化大小为16;
四、相关
1、在字符串相加操作或者改动较少的情况下,建议采用String str = ‘hello"这种形式,当字符串相加较多的情况下,就使用
StringBuilder,如果使用了多线程,就使用StringBuffer
2、相关面试:
代码输出结果:
String str1 = "hello"; Sring str2 = "hell" + "o"; System.out.println((a==b));
结果:true。原因:str2在编译器就优化成hello并放入到常量池中,所以str1和str2指向同一个对象
String str1 = "hello";
String str2 = "hell";
String str3 = str2 + "o";
System.out.println(str1 == str3);
结果是false。原因:str3中使用了引用,生成的对象保存在堆中(运行时生成),而str1保存在常量池中,所以返回false;
如果是equals则返回true;
String str1 = "hello"; final String str2 = "hell"; String str3 = str2 + "o"; System.out.println(str1 == str3);
结果:true;原因:被final修饰的变量,会在常量池中保存一个副本,不用通过连接就可以访问,final变量在编译期间就会
被直接替换为真实的值。
1、String是final类,不可被继承;
2、String底层是通过char数组来实现(通过查看源码得知);另外字符串的相关修改操作都会生成一个新的String对象;
注:String对象的任何改变都不会影响到原对象,相关的任何change操作都会生成新的String对象(具体可以参看源码)
3、字符串常量通常存在常量池中,如:
String str1 = "hello world";
String str2 = "hello world";
这两个语句如果使用equals方法会返回true,使用==也会返回true;但如果是下面的:
String str3 = new String("Hello world");
String str4 = new String("hello world");
如果使用equals方法判断3和4,会相等,但使用==会返回false,这是因为==比较的是其值,引用不同,所以返回false;
但3和4创建过程:1和2都会放入到常量池中,对应同一个地址,引用放在栈中以供使用(仅仅一份);而3和4是通过
new来创建的,先去检查常量池中有没有相同的,如果有就拷贝一份并在堆中生成一个String对象存放;如果没有就直接在
堆中生成一个String对象, 相关的引用放在栈中以供使用
二、StringBuffer类(线程安全,不可继承)
1、StringBuffer相比String类来效率会高很多,是因为String进行相关change操作会生成很多的临时变量string对象,占用内存
而StringBuffer仅仅生成一个对象,占用内存较少;其中方法都是synchronized,是线程安全的;
2、推荐使用StringBuffer类
三、StringBuilder类(线程不安全,不可被继承)
1、StringBuilder类和StringBuffer基本一致,但StringBuilder不是线程安全的,效率稍微高点;
2、StringBuilder类和StringBuffer类仍然都是底层为char数组,默认初始化大小为16;
四、相关
1、在字符串相加操作或者改动较少的情况下,建议采用String str = ‘hello"这种形式,当字符串相加较多的情况下,就使用
StringBuilder,如果使用了多线程,就使用StringBuffer
2、相关面试:
代码输出结果:
String str1 = "hello"; Sring str2 = "hell" + "o"; System.out.println((a==b));
结果:true。原因:str2在编译器就优化成hello并放入到常量池中,所以str1和str2指向同一个对象
String str1 = "hello";
String str2 = "hell";
String str3 = str2 + "o";
System.out.println(str1 == str3);
结果是false。原因:str3中使用了引用,生成的对象保存在堆中(运行时生成),而str1保存在常量池中,所以返回false;
如果是equals则返回true;
String str1 = "hello"; final String str2 = "hell"; String str3 = str2 + "o"; System.out.println(str1 == str3);
结果:true;原因:被final修饰的变量,会在常量池中保存一个副本,不用通过连接就可以访问,final变量在编译期间就会
被直接替换为真实的值。
相关文章推荐
- easyui常用控件及样式收藏
- UITextView垂直方向上光标和文字显示文字的问题
- Android UI系列--对话框(一)(AlertDialog,TimePickerDialog,DatePickerDialog,ProgressDialog)
- UIColor+Hex
- css3之 media query 使用(转)
- UIView 坐标转换
- burpsuite+sqlmap跨登录验证SQL注入
- Druid数据源配置
- [MySQL FAQ]系列 — 线上环境到底要不要开启query cache
- EasyUI DataGrid undefined处理
- JUint4 简单测试代码
- 22个值得收藏的android开源代码-UI篇
- Android 应用程序窗体显示状态操作(requestWindowFeature()的应用)
- 利Android AQuery中ajax访问SSH搭建的后台Java Web服务器
- UIday1401:可视化编程xib
- iOS小技巧:用runtime 解决UIButton 重复点击问题
- 关于区别docuemnt.write()和document.getELementById().innerHTML=""
- UINavigationController视图控制器切换(二)
- 如何解决UITextView文字上面一段空白,不是垂直置顶
- [LeetCode] Unique Paths II