【java基础】字符串比较
2017-09-06 22:22
239 查看
字符串比较
java的数据类型可分为:基本数据类型和引用数据类型两种。引用数据类型类似于c++中的指针(有两块内存空间,堆内存保存的是对象的真正属性数据,栈内存保存的是一块堆内存空间的地址);基本数据类型在栈内存中分配地址。String表示字符串类型,* String是一个类,也就是它属于引用型数据类型 *,但是它可以像基本数据类型那样方便的操作
字符串的两种实例化方法:
1. String s = "hello"; 2. String s = new String("hello");
字符串内容比较的两种方法:
使用 == 进行比较使用 equals() 方法进行比较
代码示例:
public class StringCompare { public static void main(String[] args) { String s1 = "hello"; String s2 = "hello"; String s3 = new String("hello"); String s4 = new String("hello"); System.out.println(s1 == s2); // true System.out.println(s3 == s4); // false System.out.println(s1 == s3); // false System.out.println(s1.equals(s2)); // true System.out.println(s3.equals(s4)); // true System.out.println(s1.equals(s3)); // true } }
出现这样结果的原因:
- “==”判断的是两个字符串对象是否相等,判断的是两个字符串的堆内存地址,并没有判断两个对象的内容是否相等
- equals() 判断的是两个字符串的内容是否相等
- 不难理解,使用equals()判断时,s1、s2、s3、s4四者的值都为“hello”,因此三个比较结果都为true;但是使用“==”判断时为何s1与s2的比较结果为true,其他两者的比较结果为false?
String类型两种实例化方式之间的区别。
直接赋值:s1与s2的比较结果为true,这是因为字符串s1、s2的栈内存中存储的堆内存地址完全相同。也就是说采用直接赋值的方式实例化字符串s1、s2时只开辟了一块堆内存空间,它俩都指向同一堆内存空间。
在String类进行设计时,使用了一种称为共享设计模式的概念,每一个运行的JVM底层存在一个字符串的对象池,如果用户使用了直接赋值的方式,会将字符串的内容放入内容池中,以使得其他继续使用直接赋值方式的String对象使用。
使用构造方法进行赋值:
使用构造方法进行赋值时,会先在堆内存中开辟一块空间保存字符串“hello”,然后new关键字又会在内存中开辟一块新的空间,将“hello”存进去,栈内存S3中存储新开辟的堆内存地址,第一块开辟的保存字符串常量的堆内存空间将称为垃圾等待被回收。
String对象为何可以直接赋值?
String.class中的注释如下:/** * <p> * Strings are constant; their values cannot be changed after they * are created. String buffers support mutable strings. * Because String objects are immutable they can be shared. For example: * <p><blockquote><pre> * String str = "abc"; * </pre></blockquote><p> * is equivalent to: * <p><blockquote><pre> * char data[] = {'a', 'b', 'c'}; * String str = new String(data); * </pre></blockquote><p> * Here are some more examples of how strings can be used: * <p><blockquote><pre> * System.out.println("abc"); * String cde = "cde"; * System.out.println("abc" + cde); * String c = "abc".substring(2,3); * String d = cde.substring(1, 2); * </pre></blockquote> * <p> */
也就是说,当我们直接赋值时:
String str = "abc";
系统会默认做以下操作:
char data[] = {'a', 'b', 'c'}; String str = new String(data);
String.class中关于该构造函数的内容如下:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; public String(char value[]) { this.value = Arrays.copyOf(value, value.length); } }
示例
public class FilterConditionTest { public static void main(String[] args) { String str = "hello world!! "; String[] result = str.split("!"); for(int i = 0; i<result.length; i++) { System.out.println(i + ": " + result[i]); } String s = ""; System.out.println(result[1].equals(s)); // true System.out.println(result[1] == s); // false } }
输出结果如下:
0: hello world 1: 2: true false
result[1] = “”,result[2] = ” ”
这里为何使用“==”进行比较时,比较结果为false呢?这是因为result属于数组类型,数组属于引用数据类型,应用数据类型的属性数据是放在堆内存中的,而此处直接赋值的内容是放在共享池中,所以比较结果会不相同。
总结
关于String类型的初始化,尽量使用直接赋值的方式初始化直接赋值方式只开辟一块堆内存空间,字符串内容可自动入池,方便下次使用;采用构造函数初始化,会开辟两块内存空间,一块将称为垃圾,且不能自动入池;
关于String类型字符串内容的比较,不管采用哪种方式初始化,建议选用equals()方法进行比较,免去不必要的麻烦。
相关文章推荐
- java基础 字符串 “==” 和 “equals” 比较
- Python【基础:数据类型和变量 字符串和编码 list和tuple 条件判断 循环 dict和set】注意事项(与java,c比较)
- Java基础(11):字符串—深入理解String对象和比较符==和equals的不同
- Java基础整理篇1-比较字符串是否有重复
- java语言基础入门——字符串两种建立方式的比较
- 【Java学习笔记】基础知识学习8【字符串比较】
- 【java基础知识】字符串的比较
- java基础—自定义一个比较器,按照字符串的长度升序的方法来比较字符串进行储存(java集合三)
- Java之美[从菜鸟到高手演变]之数据结构基础、线性表、栈和队列、数组和字符串
- mysql 字符串比较 :STRCMP(str1, str2) 和java字符串比较: str1.compareTo(str2) 及软件版本比较
- java基础之字符串
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- JAVA基础:字符串
- Java中打印出来完全相同的两个字符串,用equals方法比较返回的却是false的原因
- 首页所有文章资讯Web架构基础技术书籍教程我要投稿更多频道 » 为什么Java要把字符串设计成不可变的
- JAVA的一个字符串的基础面试题
- java 基础知识六 字符串1
- Java 判断字符串是否为空的三种方法性能比较
- JAVA中字符串比较equals()和equalsIgnoreCase()的区别
- java基础(5)--方法,字符串