关于去除字符串中的空格的

关于字符串的问题!!!急!!!
[问题点数:20分,结帖人a]
关于字符串的问题!!!急!!!
[问题点数:20分,结帖人a]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年 总版技术专家分年内排行榜第一
2013年 总版技术专家分年内排行榜第七2011年 总版技术专家分年内排行榜第五2009年 总版技术专家分年内排行榜第九
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
匿名用户不能发表回复!|没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!百度题库旨在为考生提供高效的智能备考服务,全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效服务,助您不断前行!
京ICP证号&&
京网文[3号&&
Copyright (C) 2018 BaiduiOS中字符串的用法,看这里就够了(详细) - 简书
iOS中字符串的用法,看这里就够了(详细)
这篇文章主要详细介绍iOS中字符串的各种用法,如果发现不够完善可以提交意见,主要是方便对字符串的使用的理解
内容比较多但是详细,如果觉得以后用得着的地方可以先收藏着;
NSString的基本概念 (NSString是不可变字符串)
什么是NSString?
一个NSString代表一个字符串(文字内容)
一般称NSString为字符串类
NSString的创建方式 (两种)
- (void)touchesBegan:(NSSet&UITouch *& *)touches withEvent:(UIEvent *)event
[self create1];
[self create2];
/** 第一种创建方式 */
//常量区中的字符串只要内容一致, 不会重复创建
- (void)create1
NSString *str1 = @"lion";
NSString *str2 = @"lion";
//输出地址不一样
NSLog(@"\n %p \n %p",&str1,&str2);
/** 第二种创建方式 */
//堆区中得字符串哪怕内容一致, 也会重复创建
- (void)create2
//stringWithFormat 可以进行拼接
NSString *str1 = [NSString stringWithFormat:@"lion"];
NSString *str2 = [NSString stringWithFormat:@"lion"];
//输出地址相同
NSLog(@"\n %p \n %p",str1,str2);
NSString的读写
// 用来保存错误信息
NSError *error =
// 读取文件内容
NSString *str = [NSString stringWithContentsOfFile:@"/Users/LJH/Desktop/Lion.txt" encoding:NSUTF8StringEncoding error:&error];
// 如果有错误信息
if (error) {
NSLog(@"读取失败, 错误原因是:%@", [error localizedDescription]);
} else { // 如果没有错误信息
NSLog(@"读取成功, 文件内容是:\n%@", str);
// writeToFile 写入
NSString *str = @"Lion";
BOOL flag = [str writeToFile:@"/Users/LJH/Desktop/Lion.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (flag == 1)
NSLog(@"写入成功");
//注意: 重复写入同一个文件会覆盖上一个文件
字符串的比较
NSString的大小写属性
全部字符转为大写字母
- (NSString *)uppercaseS
全部字符转为小写字母
- (NSString *)lowercaseString
首字母变大写,其他字母都变小写
- (NSString *)capitalizedString
NSString的比较
- (BOOL)isEqualToString:(NSString *)aS
两个字符串的内容相同就返回YES, 否则返回NO
NSString *str1 = @"lion";
NSString *str2 = [NSString stringWithFormat:@"lion"];
if ([str1 isEqualToString:str2]) {
NSLog(@"字符串内容一样");
if (str1 == str2) {
NSLog(@"字符串地址一样");
- (NSComparisonResult)compare:(NSString *)
这个方法可以用来比较两个字符串内容的大小
比较方法: 逐个字符地进行比较ASCII值,返回NSComparisonResult作为比较结果
NSComparisonResult是一个枚举,有3个值:
如果左侧 & 右侧,返回NSOrderedDescending,
如果左侧 & 右侧,返回NSOrderedAscending,
如果左侧 == 右侧返回NSOrderedSame
NSString *str1 = @"abc";
NSString *str2 = @"abd";
switch ([str1 compare:str2]) {
case NSOrderedAscending:
NSLog(@"后面一个字符串大于前面一个");
case NSOrderedDescending:
NSLog(@"后面一个字符串小于前面一个");
case NSOrderedSame:
NSLog(@"两个字符串一样");
输出结果: 后面一个字符串大于前面一个
- (NSComparisonResult) caseInsensitiveCompare:(NSString *)
忽略大小写进行比较,返回值与compare:一致
字符串搜索
- (BOOL)hasPrefix:(NSString *)aS
是否以aString开头
- (BOOL)hasSuffix:(NSString *)aS
是否以aString结尾
- (NSRange)rangeOfString:(NSString *)aS
用来检查字符串内容中是否包含了aString
如果包含, 就返回aString的范围
如果不包含, NSRange的location为NSNotFound, length为0
NSRange基本概念
NSRange是Foundation框架中比较常用的结构体, 它的定义如下:
typedef struct _NSRange {
// NSUInteger的定义
typedef unsigned int NSUI
NSRange用来表示事物的一个范围,通常是字符串里的字符范围或者数组里的元素范围
NSRange有2个成员
NSUInteger location : 表示该范围的起始位置
NSUInteger length : 表示该范围内的长度
比如@“I Miss You Lion”中的@“Lion”可以用location为11,length为4的范围来表示
NSRange的创建
有3种方式创建一个NSRange变量
range.location = 11;
range.length = 4;
NSRange range = {11, 4};
NSRange range = {.location = 11,.length = 4};
方式3 : 使用NSMakeRange函数
NSRange range = NSMakeRange(11, 4);
字符串的截取
- (NSString *)substringFromIndex:(NSUInteger)
从指定位置from开始(包括指定位置的字符)到尾部
- (void)subFrom
//字符从0开始算
NSString *str = @"&head&会跳舞的狮子&/head&";
str = [str substringFromIndex:6];
NSLog(@"str = %@", str);
//打印结果 str = 会跳舞的狮子&/head&
- (NSString *)substringToIndex:(NSUInteger)
从字符串的开头一直截取到指定的位置to,但不包括该位置的字符
- (void)subTo
NSString *str = @"&head&会跳舞的狮子&/head&";
str = [str substringToIndex:12];
NSLog(@"str = %@", str);
//打印结果 str = &head&会跳舞的狮子
- (NSString *)substringWithRange:(NSRange)
按照所给出的NSRange从字符串中截取子串
- (void)subWithRange
NSString *str = @"&head&会跳舞的狮子&/head&";
range.location = 6;
range.length = 6;
range.location = [str rangeOfString:@"&"].location + 1;
range.length = [str rangeOfString:@"&/"].location - range.
NSString *result = [str substringWithRange:range];
NSLog(@"result = %@", result);
//打印结果
会跳舞的狮子
字符串的替换
- (NSString *)stringByReplacingOccurrencesOfString:(NSString *)target withString:(NSString *)
用replacement替换target
- (void)Replacing
NSString *str = @"http:**www.baidu.com*lion.png";
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"];
NSLog(@"newStr = %@", newStr);
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)
- (void)Trimming
NSString *str =
http://baidu.com/lion.png
//去除首尾的空格
NSString *newStr = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"str =|%@|", str);
NSLog(@"newStr =|%@|", newStr);
http://baidu.com/lion.png
newStr =|http://baidu.com/lion.png|
字符串与路径
NSString 与 路径
- (BOOL)isAbsoluteP
是否为绝对路径
- (void)isAbsolutePath
// 其实就是判断是否以/开头
NSString *str = @"/Users/LJH/Desktop/Lion.txt";
NSString *str = @"Users/LJH/Desktop/Lion.txt";
if ([str isAbsolutePath]) {
NSLog(@"是绝对路径");
NSLog(@"不是绝对路径");
- (NSString *)lastPathC
获得最后一个目录
- (void)lastPathComponent
// 截取最后一个/后面的内容
NSString *str = @"/Users/LJH/Desktop/Lion.txt";
NSString *component = [str lastPathComponent];
NSLog(@"component = %@", component);
- (NSString *)stringByDeletingLastPathC
删除最后一个目录
- (void)stringByDeletingLastPathComponent
// 其实就是上次最后一个/和之后的内容
NSString *str = @"/Users/LJH/Desktop/Lion.txt";
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"newStr = %@", newStr);
//打印结果:newStr = /Users/LJH/Desktop
- (NSString *)stringByAppendingPathComponent:(NSString *)在路径的后面拼接一个目录 (也可以使用stringByAppendingString:或者stringByAppendingFormat:拼接字符串内容)
- (void)stringByAppendingPathComponent
// 其实就是在最后面加上/和要拼接得内容
// 注意会判断后面有没有/有就不添加了, 没有就添加, 并且如果有多个会替换为1个
NSString *str = @"/Users/NJ-Lee/Desktop";
NSString *str = @"/Users/LJH/Desktop/";
NSString *newStr = [str stringByAppendingPathComponent:@"Lion"];
NSLog(@"newStr = %@", newStr);
//打印结果:newStr = /Users/LJH/Desktop/Lion
NSString 与 文件拓展名
- (void)pathExtension
- (NSString *)pathE
获得拓展名
// 其实就是从最后面开始截取.之后的内容
NSString *str = @"Lion.txt";
NSString *str = @"abc.Lion.txt";
NSString *extension = [str pathExtension];
NSLog(@"extension = %@", extension);
//打印结果:extension = txt
- (NSString *)stringByDeletingPathE
删除尾部的拓展名
- (void)stringByDeletingPathExtension
// 其实就是上次从最后面开始.之后的内容
NSString *str = @"love.Lion.txt";
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"newStr = %@", newStr);
//打印结果 newStr = love.Lion
- (NSString *)stringByAppendingPathExtension:(NSString *)
在尾部添加一个拓展名
- (void)stringByAppendingPathExtension
// 其实就是在最后面拼接上.和指定的内容
NSString *str = @"Lion";
NSString *newStr = [str stringByAppendingPathExtension:@"png"];
NSLog(@"newStr = %@", newStr);
//打印结果:
newStr = Lion.png
字符串与基本数据类型的转换
- (NSUInteger)
返回字符串的长度(有多少个文字)
- (unichar)characterAtIndex:(NSUInteger)
返回index位置对应的字符
转为基本数据类型
- (double)doubleV
- (float)floatV
- (int)intV
NSString *str1 = @"22";
NSString *str2 = @"22";
int res = str1.intValue + str2.intV
NSLog(@"res = %i", res);
NSString *str1 = @"22";
NSString *str2 = @"22.2";
double res = str1.doubleValue + str2.doubleV
NSLog(@"res = %f", res);
转为C语言中的字符串
- (char *)UTF8S
NSString *str = @"love";
const char *cStr = [str UTF8String];
NSLog(@"cStr = %s", cStr);
char *cStr = "love";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);
将一个字符串分隔成多个字符串
// 将一个字符串分隔成多个字符串
//- (NSArray *)componentsSeparatedByString:(NSString *)separator
- (void)componentsSeparatedByString
// 假如有一个字符串
NSString *list = @"java,oc,c,swift";
// 可以用上面的函数得到一个字符串数组:
NSArray *listItems = [list componentsSeparatedByString:@","];
// 这个数组就是把原来的字符串用","分割得到的多个字符串:
//所以如果用这个方法就可以将字符串分隔多个字符串,然后存放到数组里面,在数组中取出想要的字符串
NSLog(@"%@",listItems);
//打印结果见下:
11:09:22.337 NSString的基本使用[] (
NSMutableString的用法 (NSMutableString是可变字符串)
NSMutableString的基本概念
NSMutableString 类 继承NSString类,那么NSString ?供的方法在NSMutableString中基本都可以使用,NSMutableString好比一个字符串链表,它可以任意的动态在字符串中添加字符 串 删除字符串 指定位置插入字符串,使用它来操作字符串会更加灵活。
NSMutableString和NSString的区别
NSString是不可变的, 里面的文字内容是不能进行修改的 + NSMutableString是可变的, 里面的文字内容可以随时更改
NSMutableString能使用NSString的所有方法
字符串中的可变和不可变
不可变:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
- (void)str
// 改变了指针的指向, 并没有修改字符串
NSString *str = @"lion";
str = @"Lion";
// 生成了一个新的字符串, 并没有修改字符串
NSString *newStr = [str substringFromIndex:1];
NSLog(@"str = %@", str);
NSLog(@"newStr = %@", newStr);
可变:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
- (void)strM
//可变的不能赋值给不可变的
//只有不可变的才能赋值给可变的
NSString *str =
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
// 修改原有字符串, 没有生成新的字符串
[strM appendString:@"Lion"];
NSLog(@"strM = %@", strM);
[strM appendString:@" love you "];
NSLog(@"strM = %@", strM);
str = strM;
NSLog(@"str = %@",str);
NSMutableString常用方法
- (void)appendString:(NSString *)aS
拼接aString到最后面
- (void)appendFormat:(NSString *)format, ...;
拼接一段格式化字符串到最后面
- (void)appendStrM
NSMutableString *strM = [NSMutableString string];
NSLog(@"strM = %@", strM);
[strM appendString:@"Lion"];
NSLog(@"strM = %@", strM);
- (void)deleteCharactersInRange:(NSRange)
删除range范围内的字符串
- (void)deleteCharactersInRange
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com"];
// 一般情况下利用rangeOfString和deleteCharactersInRange配合删除指定内容
NSRange range = [strM rangeOfString:@"http://"];
[strM deleteCharactersInRange:range];
NSLog(@"strM = %@", strM);
//打印内容: strM = www.baidu.com
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)
在loc这个位置中插入aString
- (void)insertString
NSMutableString *strM = [NSMutableString stringWithString:@"www.baidu.com"];
[strM insertString:@"http://" atIndex:0];
NSLog(@"strM = %@", strM);
//打印内容: strM = http://www.baidu.com
- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)aS
使用aString替换range范围内的字符串
- (void)replaceOccurrencesOfString
NSMutableString *strM = [NSMutableString stringWithString:@"http://www.baidu.com/lion.png"];
NSRange range = [strM rangeOfString:@"lion"];
[strM replaceOccurrencesOfString:@"lion" withString:@"super Man" options:0 range:range];
NSLog(@"strM = %@", strM);
//打印内容:strM = http://www.baidu.com/super Man.png
在iOS8以后,还可以用下面的方法来判断是否包含某字符串:containsString
当你的才华跟不上你的野心时,就需要静下心来认真学习。
框架: 就是系统(苹果)或者第三方(其他的一些高手)事先写好了一些很牛X功能的类.把这些类交给我们使用.这些类的集合我们叫做框架. 框架中有很多很多功能相似的类. 函数库 Foundation框架:
是1个包 这里面有很多类、函数、定义了一些数据类型. 这个框架中的类都是...
//将NSData转化为NSString NSString* str = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; //将NSString 转化为NSData (NSStr...
大纲 26.Protocol-协议 27.delegate-代理 28.Foundation框架介绍 29.NSString和NSMutableString 30.NSArray和NSMutableArray 31.NSDictionary和NSMutableDiction...
//将NSData转化为NSString
NSString* str = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]; //将NSString 转化为NSData (NS...
OC中的类分为可变和不可变。下表列出了Foundation框架中主要的可变类和不可变类: 种类 不可变类 可变类 数组 NSArray NSMutableArray 数据 NSData NSMutableData 词典 NSDictionary NSMutableDicti...
上面一篇文章Android Espresso UI自动测试的搭建 讲了如何搭建环境,下面说一些语法和使用方法。 找到View 使用ViewMatcher.class 里面的方法可以找到你想要的View,如你想找有Hello文字的View,你可以这样使用 相似的你也可以使用V...
中国最北-漠河旅行攻略,你绝对值得拥有,且这辈子得去2次。 不知道你有没有那种莫名的执念,不知道为什么,却一直想去做的执念。漠河就是我这十几年来一直都有的执念。中最北——漠河,一辈子必须去两次的地方。 说来也巧,去漠河的那几天我正好在某些问题的去留之间犹豫不决,且到了必须该...
苦难面前,每个人都会告诉你一切都会过去的。可是你并不知道这一切到什么时候才会结束,以什么样的方式结束。然后大部分的时间里,你依然会焦虑,会惶恐,会难过以及不知所措。所以,人这一生啊,大部分时候都是在借由着外来的一点点微光,苦苦的独撑过程。
想当年来到大学,我接触到了许多新的事物,而这些新玩意大都是当代先进科技的产物,它们被纷纷发明和创造出来,用以娱乐大众,并积累财富。
做为一名大学生,如果腰里没有一部像样的手机,这显然与身份不大相符。事实告诉我们,对一部分同学来说,纵然家里穷得叮铛响,买一部手...
接上面的文章: 7 - YAML TestNG的支持YAML作为指定的套件文件的另一种方法。例如,下面的XML文件: 这里是TestNG的自己的一套文件,YAML的对应的版本。 您可能会发现YAML文件格式更容易阅读和维护。 YAML文件也Eclipse插件的插件认可。您可...通过String s1=new String("abc")和String s2="abc",则s1==s2为true。
"abc"+"def"则会创建三个字符串对象,第三个是"abcdef"。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。
StringBuffer是线程安全的,它比String快。
StringBuilder是线程安全的,它比String快
1、三者执行速度:StringBuilder & StringBuffer & String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;
对于A: s1利用new 操作后,为该对象在堆(Heap)区分配了一块内存;
s2是字符串常量,存放在内存的”文字常量区“
;虽然两个对象的值相同,但由于两者位于不同的地址,不是相同的对象,因此 s1==s2 为false。 A错
A 错误 由于s1是new出的新对象,存储在heap中,s2指向的对象 存储在String
Pool中,他们肯定不是同一个对象,只是存储的字符串值相同。
B 正确 由于通过new String(&abc&)和&abc&都会创建一个字符串对象。&abc&+&def&会创建三个字符串对象,第一个是&abc&,第二个是&def&,第三个则是&abcdef&,也就是说在Java中对字符串的一切操作都会产生一个新的字符串。
C正确 D错误 String 字符串常量,StringBuffer
字符串变量(线程安全),StringBuilder 字符串变量(非线程安全); 在大部分情况下
StringBuffer要快于String,StringBuilder比 StringBuffer 要快。
本题目答案为BC
String与StringBuffer的比较:
(1)String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象;
所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;
(4)StringBuffer是线程安全的
综上所述:在单线程下,StringBulder性能&StringBuffer性能&String性能;但是从线程安全考虑,StringBuffer是线程安全的;
示例代码如下:
import java.util.ArrayL
import java.util.I
import java.util.L
* 该程序对String、StringBuffer、StringBuilder三个类进行比较
* String与StringBuffer的比较
String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
* StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象;
所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
* StringBilder 与 StringBuffer的比较 StringBuffer是线程安全的;
* StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;
* 所以,在单线程操作中,StringBuilder比StringBuffer效率更高~
综上所述,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,我们应该优先使用StringBuilder类;当然,如果要保证线程安全,
* 自然非StringBuffer莫属了。
* @author cxj123
public class StringBuilderTester {
private static final String base = & base string.
private static final int count = 2000000;
public static void stringTest() {
long begin,
begin = System.currentTimeMillis();
String test = new String(base);
for (int i = 0; i & count / 100; i++) {
test = test + & add &;
end = System.currentTimeMillis();
System.out.println((end - begin)
+ & millis has elapsed when used String. &);
public static void stringBufferTest() {
long begin,
begin = System.currentTimeMillis();
StringBuffer test = new StringBuffer(base);
for (int i = 0; i & i++) {
test = test.append(& add &);
end = System.currentTimeMillis();
System.out.println((end - begin)
+ & millis has elapsed when used StringBuffer.
public static void stringBuilderTest() {
long begin,
begin = System.currentTimeMillis();
StringBuilder test = new StringBuilder(base);
for (int i = 0; i & i++) {
test = test.append(& add &);
end = System.currentTimeMillis();
System.out.println((end - begin)
+ & millis has elapsed when used StringBuilder.
public static String
appendItemsToStringBuiler(List&String& list) {
StringBuilder b = new StringBuilder();
for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(& &);
return b.toString();
public static void addToStringBuilder() {
List&String& list = new
ArrayList&String&();
list.add(& I &);
list.add(& play &);
list.add(& Bourgeois &);
list.add(& guitars &);
list.add(& and &);
list.add(& Huber &);
list.add(& banjos &);
System.out.println(StringBuilderTester.appendItemsToStringBuiler(list));
public static String
appendItemsToStirngBuffer(List&String& list) {
StringBuffer b = new StringBuffer();
for (Iterator i = list.iterator(); i.hasNext();) {
b.append(i.next()).append(& &);
return b.toString();
public static void addToStringBuffer() {
List&String& list = new
ArrayList&String&();
list.add(& I &);
list.add(& play &);
list.add(& Bourgeois &);
list.add(& guitars &);
list.add(& and &);
list.add(& Huber &);
list.add(& banjos &);
System.out.println(StringBuilderTester.appendItemsToStirngBuffer(list));
public static void main(String[] args) {
stringTest();
stringBufferTest();
stringBuilderTest();
addToStringBuffer();
addToStringBuilder();
1. Java中对字符串的操作,都会产生一个新的字符串
2. StringBuffer是线程安全的,StringBuffer的速度比String要快
3. StringBuilder是线程不安全的,但是StringBuilder的速度比StringBuffer的速度要快
我觉的没有一个是对的A中==比较的是地址,所以A不正确,B中也不对,因为字符串还有字符串常量池
C是线程不安全D中也不正确因为要看对字符串进行什么操作
1、三者执行速度:StringBuilder & StringBuffer & String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;
对于A: s1利用new 操作后,为该对象在堆(Heap)区分配了一块内存; s2是字符串常量,存放在内存的”文字常量区“ ;虽然两个对象的值相同,但由于两者位于不同的地址,不是相同的对象,因此 s1==s2 为false。 A错
执行速度比较:
StringBuilder&StringBuffer&String
线程安全比较:
StringBuffer线程安全,String可理解为常量,线程安全!StringBuilder线程不安全
对String操作字符串时,实际上在不断创建新对象,原来的对象会被回收!
有个疑问,javac 在编译时优化不是会把常量如&abc&+&def&合并为&abcdef&吗?我的理解是只有一个字符串对象
String str = new String(“abc”),“abc”在内存中的分配是堆,字符串常量区。
String(&abc&)时,其实会先在字符串常量区生成一个abc的对象,然后new
String()时会在堆中分配空间,
然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区。
&abc&+&def&则会创建三个字符串对象,第三个是&abcdef&。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。
StringBuffer是线程安全的,它比String快。 1、三者执行速度:StringBuilder &
StringBuffer & String ;
StringBuilder:线程非安全的;
StringBuffer:线程安全的;
Java中String是静态常量,不能改变的。
&abc&+&def&则会创建三个字符串对象,第三个是&abcdef&。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。
StringBuffer是线程安全的,它比String快。 1、三者执行速度:StringBuilder & StringBuffer & String ;
2、StringBuilder:线程非安全的;
3、StringBuffer:线程安全的;
4、用String操作字符串时,实际上是在不断地创建新对象,而原来的对象会作为垃圾被回收;
(1)String创建字符串是不可变的,任何对String的改变都会引发新的String对象的生成;
(2)StringBuffer是可变的,任何对它所指代的字符串的改变都不会产生新的对象;
所以,当改变字符串的内容时,StringBuffer能获得更好的性能;
(3)StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高;
这种题目就是逗,字符串就字符串,还和JAVA实现机制绑定一起干个屁呢?这就像人们分不清C++和VC一样。
没有一个是对的
这是什么情况?
这道题你会答吗?花几分钟告诉大家答案吧!
扫描二维码,关注牛客网
下载牛客APP,随时随地刷题
京ICP备号-4
扫一扫,把题目装进口袋

我要回帖

更多关于 js去掉字符串中的空格 的文章

 

随机推荐