在java中,不同的字符串赋值方法,其所在的地址可能不同也就导致,两个字符串的值看似相等可是在s1==s2操作时,其结果返回的却是false

例:

	String s1 = "Programming";
String s2 = new String("Programming");
String s5 = "Program" + "ming";
System.out.println(s1 == s2); //返回值为false
System.out.println(s1 == s5);//返回值为true

其原因就与java中内存分配的机制有关:而当一个字符串被定义时,会先到常量池中寻找,如果常量池中有这个字符串,则地址直接指向常量池中字符串,如常量池中不存在则将其放入到常量池中;

关于java的内存分配机制:

https://www.cnblogs.com/dingyingsi/p/3760730.html
http://blog.csdn.net/tutngfei1129287460/article/details/7383480

例:

//常量池中本来就不含有jva字符,所以new的jva会放入常量池,属于同一个对象,返回true  先new一个SringBuffer对象,此时单独开辟一个区域,然后调用append方法
//拼接字符串(相当于对字符串的拼接而不是new的对象了),将拼接完成的字符串放入常量池,此时new出来的对象就是需要放入常量池的,返回true
String s1 = new StringBuilder("j").append("va").toString();
System.out.println(s1.intern()==s1);//true //常量池中本身就有字符串java所以返回的并不是同一个字符串 s2.intern()返回常量池中的
//java s2为new的字符所以不相等返回false
String s2 = new StringBuilder("ja").append("va").toString();
System.out.println(s2.intern()==s2);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同和
String s3 = new StringBuilder("Programming").toString();
System.out.println(s3.intern()==s3);//false
public static void main(String[] args){
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
String s7 = new StringBuilder("Programming").toString();
String s8 = new StringBuilder("Program").append("ming").toString(); System.out.println(s1 == s2); //false s1被赋予字符串Programming后发现常量池中并没有这一字符串,就将其
//放入常量池
System.out.println(s1 == s5);//true //字符串的+操作其本质是创建了StringBuilder对象进行append操作,
//然后将拼接后的StringBuilder对象用toString方法处理成String对象,s5拼接完成后发现常量池中已经有字符串Programming
//所以s5直接取常量池中的字符串所以返回true
System.out.println(s1 == s6);//false 这个暂时没搞懂
System.out.println(s1 == s5.intern());//true
System.out.println(s1 == s6.intern());//true
System.out.println(s2 == s2.intern());//false 因为s2 new了一个字符串对象,在堆中单独开辟一块区域,并不是常量池
//中对象 所以返回false
System.out.println(s7.intern()==s7);//false //返回false因为new出来的对象单独开辟一块区域放在java堆中,与常量池中的不同
System.out.println(s8.intern()==s8);///false 这个单独执行时是true 放在这里一起执行是false,个人推测
//是因为常量池中已经存在字符串Programming,而s8是new出来的,他拼接完成之后,其地址与常量池中字符串的地址
//不同,返回false }

java中字符串的存储的更多相关文章

  1. 三张图彻底了解Java中字符串的不变性

    转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...

  2. Java中字符串string的数据类型

    Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...

  3. java中字符串的非空判断

    问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...

  4. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  5. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...

  6. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  7. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  8. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

  9. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

随机推荐

  1. mysql 库,表,数据操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  2. 剑指offer--16.数组中重复的数字

    时间限制:1秒 空间限制:32768K 热度指数:198342 本题知识点: 数组 题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复 ...

  3. CATransform3D 矩阵变换之立方体旋转实现细节 (转)

    原文地址 http://blog.csdn.net/ch_soft/article/details/7351896 第一部分.前几天做动画,使用到了CATransform3D ,由于没有学过计算机图形 ...

  4. java-08多态与异常处理

    1.运行以下代码: public class ParentChildTest { public static void main(String[] args) { Parent parent=new ...

  5. 使用case语句给字体改变颜色

    使用case语句给字体改变颜色 #!/bin/bash color(){ RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1; ...

  6. 如何在IJ中使用Jaxb2通过xml定义生成对应的Java Entity类的文件

    #0. 准备要转换的xml文件,在Project视界中,右击这个xml文件,在弹出的菜单上选择“Generate XSD schema from XML File...”, 按默认设置生成xsd文件. ...

  7. Angular5学习笔记 - 路由管理(五)

    一.添加路由管理引用 打开src/app/app.module.ts文件 import {RouterModule} from '@angular/router'; import {Routes} f ...

  8. scala 定时器

    假如我们要开发一个定时器,该定时器每秒钟执行一定的动作,我们如何把要执行的动作传给定时器?最直观的回答是:传一个实现动作的函数(function) object Helloworld { def on ...

  9. FLASH和EEROM使用【转】

    最近在看代码的时候,遇到了一个使用FLASH模拟EEPROM的情况,看到这个我当时是一脸蒙蔽啊,对于一个有时候连FLASH和EEPROM都分不清的人来说,怎么可能读懂用FLASH来模拟EEPROM呢? ...

  10. 【转】rails中的时区问题

    http://eric-gao.iteye.com/blog/1058197 解释4个时区设置的不同: config.active_record.default_timezoneconfig.time ...