黑马程序员技术交流社区

标题: 正确比较字符串 [打印本页]

作者: zhangshuai    时间: 2015-5-24 21:02
标题: 正确比较字符串
比较两个字符串是否相等的时候,应该使用isEqualTostring :, 而不能仅仅比价字符的指针。
举个例子:
   if([thing1 isEqualToString: thing2])
{NSlog (@“The strings are the same!” );
}
不同于
if(thing1==thing2)



  {Nslog(@"They are the same Object!")
   }

这是因为== 运算符只判断thing1和thing2的指针数值。而不是他们所指的对象。由于thing1和thing2是不同在的字符串,所以第二种比较方式会认为他们椒不同的。
因此,如果你想检查两个对象(thing1和thing2)是否为同意实物,就应该使用运算符==。如果庶查看,是否相等,(两个字符串的内容是否相等)哪就使用isEqualTostring.


作者: aSmallStone    时间: 2015-5-24 21:50
坐等大牛。。。。
作者: 你们敬爱的人    时间: 2015-5-24 21:55
好吧.长知识了.
作者: wr6524798    时间: 2015-5-24 22:39
compare用得更广泛一些,不仅字符串可以 NSNumber也可以进行比较
作者: kansiliyundi    时间: 2015-5-24 22:47
这个是哪块的知识点啊,看来我还差很多啊
作者: woaidd99    时间: 2015-5-24 22:52
完全看不懂啊
作者: shao    时间: 2015-5-24 23:10
进来看看,学习学习。。。。。。。。。
作者: 蜡笔小炎    时间: 2015-5-25 01:14
前几天我学到这儿也总结了一下,写的更全一点,粘出来有兴趣的朋友看下
  1. /******************************************
  2. *      今天对 “== 和 isEqual方法” 进行学习.收获如下:
  3. *  1.  ==运算符:判断两个基本类型数值变量:值相等(不要求数据类型相同),返回真。
  4. *               判断两个指针类型的变量: 必须指针指向同一内存地址,才返回真。
  5. *               当使用==比较类型上没有继承关系的两个指针变量时,编译器会警告。
  6. *
  7. *  2.  isEqual: 判断NSString字符串时:只有字符序列完全相同,返回真。
  8. *                其他情况:与==运算符比较结果完全相同,因此实际应用中常常需要重写isEqual方法。
  9. *
  10. *  3.  @"hello" 与 [NSString stringWithFormat:@"hello"]的区别:
  11. *               系统会使用常量池来管理@"hello",并且常量池保证相同字符串只有一个,创建多个@"hello"的指针,将指向同一对象。
  12. *
  13. *

  14. Date: 2015/5/19
  15. *******************************************/

  16. #import <Foundation/Foundation.h>

  17. /**************************************************************************************/
  18. @interface LBXYUser : NSObject
  19. @property(nonatomic,copy) NSString* name;
  20. @property(nonatomic,copy) NSString* idstr;
  21. - (id)initWithName: (NSString*)name andIdstr:(NSString*)idstr;
  22. @end
  23. /*******************************************/
  24. @implementation LBXYUser

  25. @synthesize name = _name;
  26. @synthesize idstr = _idstr;
  27. - (id)initWithName:(NSString *)name andIdstr:(NSString *)idstr
  28. {
  29.     if (self = [super init])
  30.     {
  31.         _name = name;
  32.         _idstr = idstr;
  33.     }
  34.     return self;
  35. }
  36. - (BOOL)isEqual:(id)other
  37. {   //如果两个对象指针指向同一内存,返回真
  38.     if (self == other)
  39.     {
  40.         return YES;
  41.     }
  42.     //如果比较对象不为null,并且是同类实例
  43.     if (other != nil && [other isMemberOfClass:LBXYUser.class])
  44.     {
  45.         LBXYUser* p = (LBXYUser*)other;
  46.         return [self.idstr isEqual:p.idstr];    //以idstr属性判断是否相等
  47.     }
  48.     return NO;
  49. }

  50. @end
  51. /**************************************************************************************/




  52. int main(int argc, const char * argv[])
  53. {
  54.     @autoreleasepool
  55.     {
  56.         NSString* s1 = @"hello,李炎";//初始化两个常量池字符串
  57.         NSString* s2 = @"hello,李炎";
  58.         NSString* s3 = [NSString stringWithFormat:@"hello,李炎"];//初始化一个字符串对象
  59.         
  60.         NSLog(@"s1的地址:%p",s1);//常量池保证相同字符串只有一个,s1与s2指向同一块内存地址
  61.         NSLog(@"s2的地址:%p",s2);
  62.         NSLog(@"s3的地址:%p\n\n",s3);//s3是用方法创建的,并不在常量池中,与s1和s2指向的内存地址并不一样
  63.         NSLog(@"s1与s2是否相等:%d",(s1 == s2));
  64.         NSLog(@"s1与s3是否相等:%d\n\n",(s1 == s3));
  65.         
  66.         LBXYUser* p1 = [[LBXYUser alloc] initWithName:@"孙悟空" andIdstr:@"852963"];   //创建两个idstr相同的对象
  67.         LBXYUser* p2 = [[LBXYUser alloc] initWithName:@"孙行者" andIdstr:@"852963"];
  68.         LBXYUser* p3 = [[LBXYUser alloc] initWithName:@"孙午饭" andIdstr:@"123456"];   //创建与以上idstr不相同的一个对象
  69.         NSLog(@"p1和p2是否相等?%d",[p1 isEqual:p2]); //idstr相等,故isEqual方法返回1
  70.         NSLog(@"p2和p3是否相等?%d",[p2 isEqual:p3]); //idstr不相等,故isEqual方法返回0
  71.     }
  72.     return 0;
  73. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2