`
李勋辉
  • 浏览: 13668 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(字符串)String 的不变模式

    博客分类:
  • java
阅读更多

String的不变模式:
对于基本数据类型String而言,它的实例可以在运行期间保持状态永远不会被改变
1.不变模式:
一个字符串对象创建后,他的值不会被改变
String str1="hello";//创建了一个对象  他的值永远不会改变
System.out.println(str1);
str1+=" world!";//两个字符串对象粘粘,系统其实创建了一个新的对象,把Str1的指向改了,指向新的对象;hello就                     //变成了垃圾;
System.out.println(str1);
//如果一直这样创建会影响系统的效率;要频繁的改变字符串对象的值就用StringBuffer来描述;
StringBuffer sb=new StringBuffer("[");
sb.append("hehe");

sb.append("]");//append();不会制造垃圾,真正在改sb的值;
System.out.println(sb);

二、对象池

 

Object obj = new Object();

obj是对象的引用,它位于栈中, new Object() 才是对象,它位于堆中。(对象入堆,变量入栈)

可以这样理解obj是拴在气球上的绳子,new Object() 是气球,我们通过对象的引用访问对象,就像我们那着绳子气球才不会跑掉。

创建String 的方式有两种:
 1, String str=new String("abc");
 2, String s="def";
 
虽然两种方法返回的都是String对象的一个引用,但是java虚拟机jvm对这两种对象的处理的方式不同,对于第一种
jvm会立即在heap中创建一个对象,然后返回这个对象的引用给客户;对于第二种,jvm会首先在String对象池中通过
String的equals方法查找是对象池中是否存放该String对象,如果有则会返回已有的对象的引用给客户而不是在heap
中创建一个新的对象,如果对象池中没有该String对象, jvm就会在heap中创建一个新的对象,将他的引用返回给客
户 ,同时将这个引用添加到String pool中、
  使用第一种方法创建的对象,jvm不会将String对象放进对象池中,除非调用String 的intern方法

 

package learn;

public class AutoBox {
public static void main(String[] args) {
	Integer integer=12;
	System.out.println(integer+13);
	
	Integer i1=13;
	Integer i2=13;
	Integer i3=137;
	Integer i4=137;
	System.out.println(i1==i2);
	test();
	
}
	public static void test(){
		String str=new String("abc");//jvm在堆上创建一个对象
		//jvm在String pool中找不到值为'abc‘的字符串,因此在堆上创建一个String对象,并将这个对象
		//存放到String pool中,此时堆上有两个String对象
		String s="abc";
		if(str==s){
			System.out.println("str==s");
		}else{
			System.out.println("not");
		}
		String s3="abc";
		//这个时候,jvm发现String pool中已经存在值为“abc"的字符串,因此直接返回s 的引用给 s3
		//也就是说s和s3指向同一个对象
		if(s==s3){
			System.out.println("s==s3");
		}else{
			System.out.println("s!=s3");
		}
	}
}

 

也就是说,对于一个字符串,任何操作返回的对象都是一个新的对象,而不是字符串的本身

 

 

 

 

 

分享到:
评论

相关推荐

    c语言数据结构字符串模式匹配算法.zip

    KMP字符串模式匹配通俗点说就是一种在一个字符串中定位另一个串的高效算法。简单匹配算法的时间复杂度为O(m*n);KMP匹配算法。可以证明它的时间复杂度为O(m+n).。 一.简单匹配算法 先来看一个简单匹配算法的函数: ...

    值字符串:一种结构,允许您封装字符串并将其解析为实现ParseToString模式的任何类型

    ValueString允许您将对象序列化为区域性不变的字符串,并将其解析为实现Parse / TryParse模式的任何类型。 当需要从文化中立的(不变的)字符串中初始化类型化的实例时使用该实例,该实例通常是从简单的配置文件或...

    javascript文档

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    JScript 语言参考

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    微软JavaScript手册

    concat 方法 (String) 返回一个包含给定的两个字符串连接的String 对象。 条件(三元)运算符 (?:) 根据条件执行两个表达式之一。 constructor 属性 指定创建对象的函数。 continue 语句 停止循环的当前迭代...

    Java的六大问题你都懂了吗

    通过上面的说明,我们很容易导出另一个结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用String来代表字符串的话会引起很大的内存开销。因为String对象建立之后不能再改变,所以对于每一...

    正则表达式

    当一个正则表达式成功地和目标字符串相匹配时,可以从目标串中抽出和括号中的子模式相匹配 的部分.例如,假定我们正在检索的模式是一个或多个字母后面跟随一位或多位数字,那么我们可以使用模式 / [a-z] + \ d+/.但是...

    A-Text-Editor-实验报告.doc

    j退到next[j]为0(即T的第一个字符"失配"),则此时需要将模式T继续享有 移动一个围子,即从主串的下一个字符S[i+1]起和模式T重新开始匹配。 五、源程序清单: #include<stdio.h> #include<math.h> #include<string....

    最新名企标准通用C++面试题,

    其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数 strcpy char *strcpy(char* strDest, const char* strSrc) { assert((strDest!=NULL) && (strSrc !=NULL));//2分 char *...

    局域网渗透

    -c is the flag string to insert for http hijack 要插入代码的HTTP响应包的特征字符串,默认为200 OK -I is read packet stream from pcap format file pcap_dump 从一个pcap数据包格式的文件里读取数据包,进行...

    javaSE代码实例

    第13章 字符串——优异的内存组织机制 243 13.1 String类的基础知识 243 13.1.1 对象的创建 243 13.1.2 巧用构造器 244 13.1.3 String类的重要方法 245 13.2 String对象的内存机制 248 13.2.1 一段令人...

    Guava 16.0 API (CHM格式)

    Strings: 一个非常非常有用的字符串工具类: 提供 splitting,joining, padding 等操作。  七. Primitives: 扩展 JDK 中未提供的对原生类型(如int、char等)的操作, 包括某些类型的无符号的变量。  八. ...

    OtoStudio软件培训教程.pptx

    STRING字符串变量; ARRAY数组类型; POINTER指针类型,这个会经常用到; STRUCT数据结构定义变量类型,这个会经常用到; OtoStudio软件培训教程全文共160页,当前为第7页。 1.6 变量的分类 全局变量,整个工程都...

    【05-面向对象(下)】

    Character之外,还可以通过传入一个字符串参数来构建包装类对象。 •如果希望获得包装类对象中包装的基本类型变量,则可以使用包装类提供的XxxValue()实例方法。 自动装箱与自动拆箱 •JDk还提供...

    C++MFC教程

    CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数: Add 增加CString RemoveAt 删除指定位置CString对象 RemoveAll 删除数组中所有CString对象 GetAt ...

    数据结构题

    33. 字符串的长度是指( )。 (A) 串中不同字符的个数 (B) 串中不同字母的个数 (C) 串中所含字符的个数 (D) 串中不同数字的个数 34. 队列是一种( )的线性表。 (A) 先进先出 (B) 先进后出 (C) 只能插入 (D) 只能...

    JAVA基础之java的移位运算

    字符串数组binary 代表了0到15 对应的二进制的值。在本例中,数组各元素的排列顺序显示了变量对应值的二进制代码。数组之所以这样构造是因为变量的值n对应的二进制代码可以被正确的存储在数组对应元素binary[n] 中。...

    数据结构(C++)有关练习题

    -------8 习题3 栈和队列------------------------------------------------------------------------------11 习题4 串----------------------------------------------------------------------------------...

    亮剑.NET深入体验与实战精要2

    1.3.9 字符串常见操作 21 1.3.10 几个常用的数学函数 27 1.4 .NET的面向对象之门 27 1.4.1 继承——“子承父业” 28 1.4.2 委托——“任务书” 35 1.4.3 事件——“年终分红” 42 1.4.4 反射——“解剖” 49 1.5 ...

Global site tag (gtag.js) - Google Analytics