`
annan211
  • 浏览: 446306 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

String 类的一点认识

 
阅读更多

  String 是Java中相当强大的类,虽不属于基本类型,但是非常重要。
  关于Stirng 其他的不做过多介绍,这里简要说明几个小点。
 
  


package String;

public class StringDemo {
	public static void main(String[] args) {
		String str1 = "abc";
		String str2 = "abc";
		String str3 = new String("abc");
		System.out.println(str1==str2);              //true
		System.out.println(str1==str3);              //false
		System.out.println(str1==str3.intern());	 //true
	}
}




以上代码 表明,即使str3 新开辟了空间,其仍指向 和str1一样的实体,也就是说 str3创建新对象的时候,仍然使用的是 常量池当中的值。 intern 方法 作用是 首先进入常量池查看有无该常量,没有的话就创建并且把值放入常量池。


String 类当中 存在一个以空间换时间的方法 substring(index,index2)

使用不当会造成 内存溢出
代码 如下


package String;

import java.util.ArrayList;
import java.util.List;

/**
 * 其中导致内存溢出 是由其源码决定的,源码使用了 牺牲空间换取时间的做法
 *
 *  public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }
    这段源码指出 ,即使只截取一小段,也会把原始字符串全部返回,肯定会撑爆。
 * @author Administrator
 *
 */
public class HugeStr {

	public static void main(String[] args) {
		List<String> hander = new ArrayList<String>();
		for(int i=0;i<1000;i++){
//			HugeStrD h = new HugeStrD();// 这个方法会导致 内存溢出
			InvohandleHugeStrD h = new InvohandleHugeStrD();//这个不会内存溢出
			hander.add(h.getSubString(1, 5));
		}

	}

	static class HugeStrD{
		private String str = new String (new char[10000000]);//很长的String
		public String getSubString(int begin,int end){
			return str.substring(begin, end);
		}
	}

	static class InvohandleHugeStrD{
		private String str = new String (new char[10000000]);//很长的String
		public String getSubString(int begin,int end){
			return new String(str.substring(begin, end));
		}
	}
}



分享到:
评论

相关推荐

    HttpRequest的QueryString属性 的一点认识

    如: 当然我们一般都是按照提示来把framework版本设置2.0来解决。为什么可以这么解决了,还有没有其它的解决方法了。 先让我们看看QueryString的源代码吧: 代码如下: public NameValueCollection QueryString { get...

    Java 语言基础 —— 非常符合中国人习惯的Java基础教程手册

     abstract 说明一个类为抽象类,抽象类是指不能直接实例化对象的类。  final 说明一个类为最终类,即改类不能再有子类。  public 说明类为公共类,该类可以被当前包以外的类和对象使用。  private 说明类为...

    二十三种设计模式【PDF版】

    以下类比可以帮助说明这一点。 小说家和剧本作家很少从头开始设计剧情。他们总是沿袭一些业已存在的模式,像“悲剧性英雄”模式(《麦克白》、《哈姆雷特》 等)或“浪漫小说”模式(存在着无数浪漫小说)。同样地,面向...

    PHP使用header方式实现文件下载功能

    认识到一点很重要,即必须在任何实际的输出被发送之前调用 header() 函数(在 PHP 4 以及更高的版本中,您可以使用输出缓存来解决此问题): &lt;html&gt; &lt;?php // 结果出错 // 在调用 header() 之前已存在输出...

    c#学习笔记.txt

    string 类的实例表示 Unicode 字符串。尽管 string 是引用类型,但相等运算符(== 和 !=)被定义为比较 string 对象(而不是引用)的“值”(7.9.7 字符串相等运算符)。这使得对字符串相等性的测试更为直观。字符串...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    十天学会系列教程会清晰的写出各种方法,让大家能少一点坎坷。在ASP里面,大家几乎都是使用VB,数据库嘛,也无非是SQL和ACCESS。在ASP.NET里面,数据库还是这两个但是常用的语言多了一个C#,也是微软推荐的语言,为...

    C#微软培训资料

    第四章 数 据 类 型 .28 4.1 值 类 型 .28 4.2 引 用 类 型 .33 4.3 装箱和拆箱 .39 4.4 小 结 .42 第五章 变量和常量 .44 5.1 变 量 .44 5.2 常 量 .46 5.3 小 结 .47 第六章 类 型 转 换 .48 ...

    C++MFC教程

    对于已经掌握了VC的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择...

    asp.net知识库

    我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] NET FrameWork的Collections支持 .NET的反射在软件设计上的应用 关于跨程序集...

    c#多线程抓取网页内容

    但细心的用户会发现,在带宽一定的情况下,并不是线程越多,速度越快,而是在某一点达到峰值。爬虫作为特殊的下载工具,不具备多线程的能力何以有效率可谈?爬虫在信息时代的目的,难道不是快速获取信息吗?所以,...

    C#中的委托和事件学习(续)

    如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    这些都预示着我们进入了一个新的互联网阶段web 2.0,它是相对web 1.0的新的一类互联网应用的总称,是一次从核心内容到外部应用的革命[10]。这个阶段发展迅速,互联网应用趋于多样化,其中变化最大的是由web 1.0网站...

    从模式讲到设计模式再到面向对象设计模式

    亚历山大看到了这一点,他知道结构不能与要解决的问题分离,因此,在寻找和描述设计质量一致性的探求中,亚历山大认识到,必须观察为了解决同样问题而设计的不同结构。  亚历山大发现,通过这样的方式——观察解决...

    打冰雹游戏源程序

    Dim Y As String Y = MsgBox(" 从窗口顶部落下多个圆球表示冰雹,用户用鼠标指引箭头表示的枪瞄准其中一个圆球,单击鼠标射击。如果打中圆球加分,没打中减分.若累计有五个圆球一直未被击中落到地面(用水平线表示...

Global site tag (gtag.js) - Google Analytics