`
annan211
  • 浏览: 463014 次
  • 性别: 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));
		}
	}
}



分享到:
评论

相关推荐

    ASP.NET Session的七点认识

    - 对于值类型(如int、string等),Session存储的是变量的副本。这意味着当你在Session中修改值类型的数据,原变量不会受到影响。例如,将一个整数1存入Session,然后在代码中增加1,Session中的原始值不会改变。 ...

    HttpRequest的QueryString属性 的一点认识

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

    各大公司的C/C++面试题

    首先,我们要明确一点,面试不仅仅是检验你能否写出一段代码,更重要的是考察你对编程基础的理解和问题解决的能力。以strcpy函数为例,这个看似简单的字符串复制函数,其实隐藏着诸多细节和潜在的问题。 试题1:...

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

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

    JAVA期末复习考试含答案.docx

    文档中提到的选择题第一题考察的就是这一点。 - **正确选项**:`String args[]`。 - **解析**:`main` 方法的参数是一个字符串数组,用于接收命令行参数。因此正确形式为 `String[] args` 或 `String args[]`。 ##...

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

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

    java泛型详解

    理解泛型的关键在于认识到类型参数(通常用`T`表示,当然也可以是任何合法的标识符)的作用。类型参数充当了一个占位符的角色,用于在具体使用泛型类或接口时指定实际的类型。这一点与方法的形式参数类似——形式...

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

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

    SQL Server中调用C#类中的方法实例(使用.NET程序集)

    为了实现这一点,必须开启SQL Server的CLR集成功能,并设置数据库的TRUSTWORTHY属性为ON,这是因为SQL Server默认情况下不信任外部程序集。 在C#中创建一个能够被SQL Server调用的类库(DLL),需要在类中声明一个...

    高质量C++ C编码规范

    **9.6 示例:类STRING的拷贝构造函数与赋值函数** - 展示如何正确实现拷贝构造函数和赋值函数。 **9.7 偷懒的办法处理拷贝构造函数与赋值函数** - 在某些情况下,可以使用编译器自动生成的函数,但需要注意适用...

    c#学习笔记.txt

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

    VisualBasic学习案例

    总之,通过深入研究这个“VisualBasic学习案例”,你可以逐步构建起对VB.NET的全面认识,从简单的控制台应用到复杂的Windows Forms或WPF项目,都能游刃有余。实践是检验真理的唯一标准,所以动手编写代码、运行示例...

    SSD3 Multiple-Choice 整理

    本文将对这些题库内容进行整理,以帮助读者巩固和加深对Java基础知识的认识。 首先,要了解Java应用程序的入口方法。每一个Java程序都必须包含一个main方法,它是程序的启动点和运行的入口。这个方法的声明通常遵循...

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

    VC++6 编写静态链接库和调用静态链接库源码下载

    stringlib可能是一个包含字符串处理函数的静态库,你可以通过它学习如何定义和实现库函数,以及如何在其他项目中调用这些函数。这将帮助你提升VC++的编程技能,并对静态链接库的使用有更深入的认识。

    team7March2021

    【标题】"Team7 March 2021项目—— TypeScript技术深度探讨...在未来的项目中,团队应当充分认识到这一点,提前规划培训,确保每个成员都能有效地利用TypeScript来提高生产力和代码质量,避免再次出现无法交付的情况。

    java 验证哥德巴赫猜想

    虽然至今为止,对于所有已经检查过的数字,这一猜想都是成立的,但数学家们尚未找到一种通用的方法来证明这一点。 #### 素数与哥德巴赫猜想的关系 在探讨哥德巴赫猜想之前,我们需要先了解什么是素数。素数是指只能...

Global site tag (gtag.js) - Google Analytics