(转自我的renren)
JAVA字符串比较问题,从开始学就没弄怎么懂,偏偏今天心血来潮,总想搞明白,于是查阅大量书籍,google大量资料,结果总结出来:仍然是X疼。。
堆栈,字符串常量,内存分析,鼓捣了几个小时,总不能完全明白,所以奉劝大家,在学习的过程中千万不要钻牛角尖,留着那个牛角去钻哥德巴赫猜想去吧~~
言归正传:
先看点简单的比较:
- String str1 =
"abc"
;
- String str2 = "abc"
;
- String str3 = new String ("abc");
- String str4 = new String ("abc");
- System.out.println(str1==str2); //true
- System.out.println(str3==str4); //false
- System.out.println(str1==str3); //false
str1
和str2:编译器首先处理str1时,在栈中创建一个值为str1的引用,然后查找字符串常量中是否有“abc”这个常量,没有则在字符串常量中创建;
当执行str2时,由于常 量池中已有“abc”字符串,所以将str2直接指向字符串常量“abc”,这样,str1和str2就是指向同一个对象。
str3和str4:new出来的东西是放在堆里的,每new一个对象,就要在堆里重新创建一个对象。所以str3和str4分别指向堆里的不同对象,是在运行时才确定的。
str1和str3:str1是在程序编译器确定的,“abc”确定在字符串常量中。而str3是在程序运行时候才能确定,是在堆中动态创建的。str1和str3一个指向字符串常量区,一个指向堆,显然是不相等的。
----------------------------------------------休息一会,可能不回来了------------------------------------------------------------
如果上面的么有问题,那么继续往下面看吧~
- String str1 = "abc";
- String str2 = "def";
- String str3 = str1+str2;
- String str4 = "abc"+"def"
- String str5 = "abcdef"
- System.out.println(str4==str5); //true
- System.out.println(str3==str4); //false
- System.out.println(str3==str5); //false
如果这些你都一眼看出来的话,那就笑吧,尽情鄙视我的智商吧。看半天没看出来的咱们接着往下看
str4和str5: 仍然是字符串常量,str4在编译器就被确定了,它在编译期将abc和def两个字符串连接成abcdef后放在字符串常量区。
str3和str4:这两个让我很郁闷。。。解释起来有点费劲,str4不用说了。看str3,这个家伙是字符串常量中的两个对象相+,这不能在编译期确定,所以只能在运行时确定。在运行时在堆中重新创建一个对象,str3指向的是堆中的对象。因此,所以,so……
还是不明白是吧?如果你一遍就真正明白了,那你可以笑了,尽情鄙视我的IQ吧!
--------------------------------------------没有广告,可能也没有片子了--------------------------------------------
如果将“==”换成“equals”,那么结果就不用我说了吧。。equals方法只关心内容是否想到。
另外在API中还有个intern
()方法,这个还有点门道
--------------------------------------------暂停,停止,中止,或者是终止--------------------------------------------
(其实还没有完。。。。。后面还有个final)
分享到:
相关推荐
### Java李兴华学习笔记之Java常用类库 #### 一、课程介绍及知识点概览 根据提供的资料,“Java李兴华学习笔记之Java常用类库”这份文档来源于北京MLDN软件实训中心的教学资料,主要涵盖了Java编程语言中常用类库...
010301_【第3章:Java基础程序设计】_Java数据类型笔记.pdf 010302_【第3章:Java基础程序设计】_运算符、表达式与语句笔记.pdf 010303_【第3章:Java基础程序设计】_判断与循环语句笔记.pdf 010401_【第4章:数组与...
### Java学习笔记知识点详解 #### 一、Java环境配置与基本概念 - **系统变量path**: 在设置Java开发环境时,需要配置系统变量`path`,这样计算机才能找到执行Java命令所需的程序。例如,当我们输入`javac`或`java`...
Java 8是Java语言发展的一个重要里程碑,引入了许多创新性的特性和改进,...黑马程序员的Java8新特性详解笔记和源码提供了深入学习这些概念的资源,结合实际的代码示例,将有助于你更好地理解和掌握Java 8的核心特性。
### JAVA培训笔记知识点详解 #### 一、Java基础知识概述 **1.1 Java程序结构** - **源程序组成**: 在一个Java源程序中可以包含多个Java类。 - **公共类限制**: 只能有一个`public`的Java类,并且源文件名必须与该...
### JAVA学习笔记:Socket通信详解 #### 一、Socket通信概念与原理 Socket通信是Java网络编程中的核心概念,它提供了在不同计算机之间进行数据交换的能力。Socket可以被视为两个程序间进行通信的端点,一个Socket...
Java 基础类详解 Java 基础类是 Java 中非常重要的一个概念,它是 Java 语言的基础组件,包括了 Java 的基本数据类型、字符串、日期和时间、数学运算等。这些基础类是 Java 程序的基础构成部分,对于 Java 程序员来...
### Java学习笔记知识点详解 #### 一、类变量与成员变量的区别 - **类变量**:也称为静态变量,使用`static`关键字声明。在整个类的生命周期中只有一个副本,无论创建多少个对象,该变量的副本都只有一份。例如,...
10. **泛型**:泛型是Java SE 5引入的新特性,用于增强类型安全,减少类型转换的麻烦,笔记会详解泛型类、泛型方法和通配符等。 11. **JavaFX和Swing**:作为GUI编程的工具,JavaFX和Swing可以创建桌面应用程序,...
### Java 学习笔记知识点详解 #### 一、`java.lang`包 `java.lang`是Java的基础包之一,包含了构成Java语言核心API的基本类,如`String`、`Object`、`Integer`等,以及异常类和其他常用类。这部分内容主要涉及: - ...
11. **Java内存管理**:解析Java内存模型,包括堆内存、栈内存、方法区和垃圾回收机制。 12. **设计模式**:讲解常用的23种设计模式,如单例、工厂、装饰器、代理、观察者等,以及它们在实际开发中的应用。 13. **...
### Java核心API知识点详解 #### 一、集合框架 **1.1 什么是集合** 集合是Java编程语言中用于存储和操作多个元素的一种容器。它提供了动态管理元素的能力,允许在运行时添加或删除元素。 **1.2 集合与数组** - ...
### Java入门笔记9_Socket详解 #### 一、引言 在计算机网络中,客户端/服务器(Client/Server)模式是常见的通信方式之一。在这种模式下,客户端向服务器发送请求,服务器响应请求并返回数据。Java作为一种广泛使用...
### Java学习速成笔记 #### 一、概览与学习目标 本篇“Java学习速成笔记”旨在帮助读者在短期内快速掌握Java编程的核心概念和技术要点,并能够在学习后的七天内具备基本的工作能力。该笔记内容详实,既适合零基础...
### Java+JDK+6 学习笔记知识点详解 #### 一、Java 概述 - **起源与发展:** - Java 最初是由 Sun Microsystems 的 Green Project 开发出来的编程语言,最初是为了创建一个名为 Star7 的应用程序。 - 1995 年 5 ...