String对象之间的比较
public class StringTest {
@Test
public void test01() {
int a = 50; // 基本数据类型比较的是值
int b = 50;
System.out.println(a == b);
}
@Test
public void test02() {
/**
* 01.首先在栈中开辟一个空间给a
* 02.去常量池中查询有没有“123”,如果没有创建一个
* 03.a指向常量池中“123”
*/
String a = "123";
/**
* 01.首先在栈中开辟一个空间给b
* 02.去常量池中查询有没有“123”,发现有!
* 03.b直接指向常量池中“123”
*/
String b = "123";
System.out.println(a == b);
}
@Test
public void test03() {
String a = "123";
/**
* 01.首先在栈中开辟一个空间给b
* 02.去常量池中查询有没有“123”,发现有!
* 03.不会在常量池中创建“123”,但是会在堆中创建“123”
* 04.只要是new,b就会指向堆中“123”
*/
String b = new String("123");
System.out.println(a == b);
}
@Test
public void test04() {
String a = "1" + "2"; // 在编译期间a="12"
String b = "12";
System.out.println(a == b); // true
}
@Test
public void test05() {
// a 和 b都是一个变量!!! 运行期间可以改变!
String a = "1";
String b = "2";
String c = a + b; // 在编译期间 a 和 b的值 不确定!
String d = "12";
System.out.println(c == d); // false
}
@Test
public void test06() {
// a 和 b都是一个常量!!! 运行期间不可以改变!
final String a = "1";
final String b = "2";
String c = a + b; // 在编译期间 a 和 b的值 不确定!
String d = "12";
System.out.println(c == d); // true
}
测试代码
public class StringTest {
/*
* equals 和 ==的区别
* 如果类中没有重写equals(),那么默认比较也是内存地址
* ==在基本数据类型中比较的是值!
* int a =10;
* int b=10;
* syso(a==b); true
* 在引用数据类型中比较的是地址!
*
* 为什么说 基本数据类型 ,对象和数组的引用 都存在栈中??
* 因为栈最大的优势: 存取的速度快!
*
* Student stu=new Student();
* stu: 对象的引用 栈中
* new Student(): 对象 堆
* new出来的数据都是存放在堆中!
*/
@Test
public void test01(){
String a ="abc";
String b =new String("abc");
System.out.println(a==b); //false
/*
* 01.首先会在栈中开辟一块空间给a
* 02.去常量池中查询有没有"abc"
* 03.因为没有"abc",所以在常量池中开辟一块空间给"abc"
* 04.栈中的a 指向了 常量池中 "abc"
* 05.会在栈中开辟一块空间给b
* 06.去常量池中查询有没有"abc",发现有了,就不会在常量池中创建
* 07.去堆中开辟一块空间存放"abc"
* 08.栈中的b 指向了 堆中 "abc"
* 09. 地址不一样 所以结果 false
*/
}
@Test
public void test02(){
String a ="abc";
String b ="abc";
System.out.println(a=="abc");//true
System.out.println(a==b); //true
}
@Test
public void test03(){
String a ="abc";
String b ="a"+"bc";
System.out.println(a==b); //true
}
@Test
public void test04(){
String a ="abc";
String b ="a";
String c ="bc";
System.out.println(a==(b+c)); //false
/*
* 01.a的值是"abc"
* 02.编译期间 b ="a" c ="bc" 这个值 随时都可能改变!!
* 03.在编译期间(b+c)不会被优化成“abc” 就是因为值不确定
*/
}
@Test
public void test05(){
String a ="abc";
final String b ="a";
final String c ="bc";
System.out.println(a==(b+c)); //true
/*
* 01.a的值是"abc"
* 02.编译期间 b ="a" c ="bc" 这个值不可能改变!!
* 03.在编译期间(b+c)被优化成“abc” 就是因为值确定 final修饰的不可变
*/
}
@Test
public void test06(){
String a =new String("abc"); //创建了几个对象?
}
}
参数传递
public class StringTest {
public static void main(String[] args) {
/*String str=new String("abc");
getString(str);
System.out.println(str); //String在作为参数传递时 传递的是值 abc*/
StringBuffer buffer=new StringBuffer("abc");
getString(buffer); //传递的是地址
System.out.println(buffer); //abchaha
}
//方法重载
private static void getString(String str) {
str=str+"haha";
}
private static void getString(StringBuffer str) {
str=str.append("haha");
}
}
String对象之间的比较的更多相关文章
- 关于InputStream 和String对象之间的相互转换
代码如下: package com.xin.stream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; im ...
- 到底创建了几个String对象?
到底创建了几个String对象? 标签: 堆栈使用 对象创建 分类: 开发技术 关键字: java 面试题 string 创建几个对象 作者:臧圩人(zangweiren) 网址:http://zan ...
- Java String对象的问题 String s="a"+"b"+"c"+"d"
1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的) 2,StringBuilde ...
- String 对象详解
原文地址:http://zangweiren.javaeye.com/blog/209895 作者:臧圩人(zangweiren) 网址:http://zangweiren.javaeye.com & ...
- Java String对象的经典问题
先来看一个样例,代码例如以下: public class Test { public static void main(String[] args) { Strin ...
- Java String对象的经典问题(转)
public class StringTest { public static void main(String[] args) { String strA = "abc"; St ...
- [JS]给String对象添加方法,使传入的字符串字符之间以空格分开输出
看到一个这样子的面试题: 给String对象添加一个方法,传入一个string类型的参数,然后将string的每一个字符间加空格返回,例如:addSpace("hello world&quo ...
- JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- 原生JS:String对象详解
@import url(http://i.cnblogs.com/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/c ...
随机推荐
- Unable to locate package错误解决办法
新装了VMWare Player,结果装上Ubuntu12.04后安装软件都提示:Unable to locate package错误,解决方法非常简单,终端输入以下命令即可: sudo apt-ge ...
- HTML5和CSS3:游戏的变革Flexbox
HTML5和CSS3给网络开发者提供了新的语法标签,本地动画工具,服务器端字体等等新增功能,这些并不是结束.开发者正苦于为网页设计挖出一条战壕 - 真正的页面排版工具,事实上,即便是最有前途的CSS3 ...
- App Store自动下载WiFi与蜂窝数据切换机制
写下这个给自己备忘,上次也有一次载了个跟头. 在iOS 7和8里面,除了设置--App Store里面自动更新,自动下载,以及使用蜂窝数据要关之外,别以为用了WiFi挂着程序,就万无一失了. 这种情况 ...
- Linux导航神器-----autojump
对于命令行用户来说,频繁的cd和tab应该是日常工作中最多使用的命令了.特别对于重度用户来说,如果可以省去这么多cd和tab,将更多的时间做有意义的事该多好.其实Linux的学习过程本身就行这样.你会 ...
- __PUBLIC__模板文件路径配置
__PUBLIC__ 默认指向 项目文件下的Public文件夹 注意: __PUBLIC__不是一个常量,只在模板中进行替换,__ROOT__是一个常量 项目文件路径 defined('__PUBLI ...
- python中函数的默认参数陷阱问题
其实也不能说是陷阱,只是一个不容易注意到的地方,尤其是有其他java/c++类编程语言经验的人员,这里涉及到python的一个特点,所以笔者说是陷阱只是一个噱头而已. def test(item, b ...
- storm接入metaq时类不兼容错误 无法初始化MonitorLog
在实际的项目中,需要storm从metaq中读取数据,一开始就有日志问题,查到是storm/lib中的log4j-over-slf4j和slf4j-api.jar包的不兼容导致的,这些日志包使用时必须 ...
- 多目标遗传算法 ------ NSGA-II (部分源码解析)README 算法的部分英文解释
This is the Readme file for NSGA-II code. About the Algorithm--------------------------------------- ...
- Java文件末尾追加字符串
Java进行文件输出时,有时候想直接向已有文件末尾追加字符,而不是从头开始写,可以采用以下三种方式实现: package test; import java.io.File; import java. ...
- 新的疑问(未解决):VC项目的配置,不是都能在Project -- Properties里设置解决的
现象:死活解决不了引入外部库的LPCWSTR参数传递问题.而用VS新建的项目,就没有这个问题. 我怀疑是当初.pro文件产生VC项目文件时候,做了一些设置,但是内容太长了,又很复杂,所以没法核对. 用 ...