一、String 的 equals()到底比较的是什么?equals() 与 == 的区别?

当使用关系运算符==比较两个对象时,是比较两个对象使用的内存地址和内容是否相同,如果两个对象使用的是同一个内存地址,并且内容相同,则结果为true,否则结果为false

       当使用对象的equals( )方法比较两个对象时,是比较两个对象的内容是否相同。而与对象的内存地址无关,如果两个对象的内容相同,则结果为true,否则结果为false
 
例如:
  String str1 = new String("hello"); 
  String str2 = new String("hello");
  String str3 = str2;
图解:

 
代码:
 public class CompareObjectDemo {
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
String str3 = str2;
//用==比较
System.out.println("str1 == str2的比较结果为:\n\t" + (str1 == str2));
System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
//用equals比较
System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
System.out.println("str2.equals(str3)的比较结果为:\n\t" +str2.equals(str3));
}
}
结果:
 
注意:在Java中,如果将同一个字符串常量赋值给多个字符串变量来创建字符串对象,则这些字符串对象具有相同的地址,因为同一个字符串常量在内存中的地址是不变的,所以多个对象共用同一个内存地址
 
又如:
 
String str1 = "hello";
String str2 = "hello";
String str3 = str2;
图解:
 
代码:
 public class CompareObjectDemo {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 =str2; //用==比较
System.out.println("str1 == str2的比较结果为:\n\t" + (str1 == str2));
System.out.println("str2 == str3的比较结果为:\n\t" + (str2 == str3));
//用equals比较
System.out.println("str1.equals(str2)的比较结果为:\n\t" +str1.equals(str2));
System.out.println("str2.equals(str3)的比较结果为:\n\t" +str2.equals(str3));
}
}
结果为:
 
 
 
二、String、StringBuffer、StringBuilder 它们的不同之处
(1)效率: String < StringBuffer < StringBuilder .
为什么?有没有想过?
每次改变String 的值, 底层重新创建了一个新的String对象,如:String str = ""; Str +="xpw"; Str +="yuanmeng"; 前面对str 进行了两次叠加,也创建了两个String对象,并不是简单同一个String对象。所以,不断地改变、string的值,会不断地创建对象,这肯定要耗时;另外,创建对象,也需要占用一定的内存吧,而且StringBuffer和StringBuilder 每次改变String值,不会重新创建新的对象,可以采用append(str)改变str值。所以有时在程序调优时,有必要采用Stringbuffer 或者 StringBuilder进行替换。
那么,StringBuffer为什么效率上会比StringBuilder慢?读过源代码的同学,想必知道了吧,StringBuffer它是线性安全的,就是说它的底层相关方法有Synchronize修饰,在并发时,如果多个线程要访问共享变量,不能简单地同时访问,一旦有一个线程锁住当前对象,其它线程就必须等;而StringBuiler是非线性安全的,允许多个线程同时访问,所以在效率上,StringBuilder 》 StringBuffer。
 
(2)StringBuffer:线性安全
 
   StringBuider:非线性安全
注意:在并发时,要使用StringBuffer比较好,非并发,考虑到效率问题,尽量使用StringBuilder
 
三、String 与 其它  基本类型数据的转换
 
 /**
* String -> other type
*/
public static void testString2OtherType(){
String s1 = "121";
int parseInt = Integer.parseInt(s1);
System.out.println(parseInt); String s2 = "12.1";
double parseDouble = Double.parseDouble(s2);
System.out.println(parseDouble); String s3 = "12.1f";
float parseFloat = Float.parseFloat(s3);
System.out.println(parseFloat); String s4 = "false";
boolean parseBoolean = Boolean.parseBoolean(s4);
System.out.println(parseBoolean); //或者使用如下也可
Integer i = Integer.valueOf(s1);
System.out.println(i); Double d = Double.valueOf(s2);
System.out.println(d); //...
} /**
* other type --> String
*/
public static void otherType2String(){
int i = 38;
String s1 = String.valueOf(i);
System.out.println(s1); float f = 38.38f;
String s2 = String.valueOf(f);
System.out.println(s2); //...
}

四、[很好用] 字符串分割 split

     public static void main(String[] args) {
String src = "hello world,I love you";
StringDemo.testStringSplit(src);
} public static void testStringSplit(String src){ String[] strArray = src.split("\\W");//按照单词来划分,具体的正则表达式可以参考Pattern类,里面有详细介绍 for(String s : strArray){
System.out.println(s);
}
}

结果

hello
world
I
love
you

String的点点滴滴的更多相关文章

  1. Ⅳspring的点点滴滴--方法和事件

    承接上文 方法和事件 .net篇(环境为vs2012+Spring.Core.dll v1.31) public abstract class MethodDemo { protected abstr ...

  2. Ⅲ.spring的点点滴滴--赋值

    承接上文 对象的赋值(调用方式都一样不再阐述) .net篇(环境为vs2012+Spring.Core.dll v1.31) public class PropertyDemo{ public Sys ...

  3. Ⅱ.spring的点点滴滴--对象

    承接上文 对象的各种实例化 .net篇(环境为vs2012+Spring.Core.dll) 修改原来的PersonDao对象为 public class PersonDao : IPersonDao ...

  4. Ⅰ.Spring的点点滴滴--序章

    spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 .net篇(环境为vs2012+Spring.Core.dll) 新建一个控制台 using Spring.Context; ...

  5. XI.spring的点点滴滴--IObjectFactoryPostProcessor(工厂后处理器)

    承接上文 IObjectFactoryPostProcessor(工厂后处理器)) 前提是实现接口的对象注册给当前容器 直接继承的对象调用这个postProcessBeanFactory方法,参数为工 ...

  6. Ⅸ.spring的点点滴滴--IObjectFactory与IFactoryObject的杂谈

    承接上文 ObjectFactory与IFactoryObject的杂谈 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class parent { pu ...

  7. Ⅷ.spring的点点滴滴--抽象对象和子对象

    承接上文 抽象对象和子对象 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class parent { public string Name { get; ...

  8. Ⅵ.spring的点点滴滴--自定义类型转换器

    承接上文 自定义类型转换器 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class CustomeConverter : TypeConverter{ ...

  9. Ⅴ.spring的点点滴滴--引用其他对象或类型的成员

    承接上文 引用其他对象或类型的成员 .net篇(环境为vs2012+Spring.Core.dll v1.31) public class Person { public string Name { ...

随机推荐

  1. 基于jQuery的上下左右无缝滚动应用(单行或多行)

    $(function(){     var _wrap=$('ul.line');//定义滚动区域     var _interval=2000;//定义滚动间隙时间     var _moving; ...

  2. sqlite优化记录:建立索引加快查询速度

    凡是数据库中,索引的存在就是为了提高查询速度的,数据库的索引有点类似于书本上面的目录的概念,因为在英文中都是index,事实上也就是目录. 其算法应该叫做“倒排索引”,这个其实也类似于搜索引擎里面的基 ...

  3. Unity3d 调用C++的DLL

    原地址:http://www.cnblogs.com/alongu3d/archive/2013/04/20/3031904.html Unity 3D 调用DLL的方法 本文转载:渡蓝的博客园 ht ...

  4. MongoDB实战指南(二):索引与查询优化

    数据库保存记录的机制是建立在文件系统上的,索引也是以文件的形式存储在磁盘上,在数据库中用到最多的索引结构就是B树.尽管索引在数据库领域是不可缺少的,但是对一个表建立过多的索引会带来一些问题,索引的建立 ...

  5. Linux内核态抢占机制分析

    http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核( ...

  6. QString内部仍采用UTF-16存储数据且不会改变(一共10种不同情况下的编码)

    出处:https://blog.qt.io/cn/2012/05/16/source-code-must-be-utf-8-and-qstring-wants-it/ 但是注意,这只是QT运行(Run ...

  7. Java:List,ArrayList和LinkList的区别

    1.大学数据结构中ArrayList是实现了基于动态数组的数据结构,LinkList基于链表的数据结构 2.对于随机访问get和set,ArrayList优于LinkList,因为LinkedList ...

  8. 【HDOJ】1097 A hard puzzle

    题目和1061非常相似,几乎可以复用. #include <stdio.h> ][]; int main() { int a, b; int i, j; ; i<; ++i) { b ...

  9. TigerLeapMC V1.3 for Windows(支持DLNA)

    TigerLeapMC V1.3 2014-04-10: 1.更新tlplayer TigerLeapMC是基于tlplayer作为播放器的集成DLNA,(DMS,DMR,DMP)等,支持各种网络播放 ...

  10. Eclipse设置、问题解决方案

    Eclipse设置: 1.如何把eclipse关闭提示调出来? 可以这样打开这个提示:选择 Windows --Preferences,在左边树上选择“General” --“Startup and ...