A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 江峰渔火 中级黑马   /  2014-6-14 15:20  /  954 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

subString出现内存溢出,什么原理,怎么解决

4 个回复

倒序浏览
我也想知道
回复 使用道具 举报
有没有大神回答一下
回复 使用道具 举报

包含头不包含尾

本帖最后由 18353666072 于 2014-6-15 09:50 编辑

subString是子串,如果原生字符串很大,截取的字符串长度却很短,那么截取的子字符串中包含了原生字符串的所有内容,并占据了相应的内存空间,而仅仅通过偏移量和长度来决定子字符串的实际内容,这虽然提高了运算速度却浪费了大量的内存空间,所以说这个构造函数使用了以空间换取时间的策略,但是这有可能就会导致内存溢出。
  1. public Stirng substring(int beginIndex)
  2. public String substring(int beginIndex, int endIndex)
复制代码
回复 使用道具 举报
个人感觉就是,不断的切子串,造成内存装不下了造成的呗,不过一般不会反生这种情况吧,代码如下:
  1. /*
  2. subString出现内存溢出,什么原理,怎么解决

  3. 思路:
  4. 1,个人感觉就是不断的切子串,很多很多字符串对象,导致内存溢出的呗。
  5. 2,循环试试, 要保证字符串的不相同,往集合中不断添加
  6. */
  7. import java.util.ArrayList;
  8. class SubStringTest
  9. {
  10.         public static void main(String[] args)
  11.         {
  12.                 ArrayList<String> al = new ArrayList<String>();

  13.                 StringBuffer sb = new StringBuffer();

  14.                 int x = 0;
  15.                 while (x<6000)
  16.                 {
  17.                         sb.append(x++);//不断的添加字符,形成一个足够长的字符串
  18.                 }
  19.                 String s = sb.toString();
  20.                 //System.out.println(s);

  21.                 int y = 0;
  22.                 while (y<s.length())
  23.                 {
  24.                         al.add(s.substring(y++));//不断的切子串,存入集合中       
  25.                 }
  26.                 System.out.println("Hello World!");

  27.         }
  28. }
复制代码

不知道这个错误是不是楼主想要的,
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOfRange(Arrays.java:2694)
        at java.lang.String.<init>(String.java:203)
        at java.lang.String.substring(String.java:1877)
        at SubStringTest.main(SubStringTest.java:28)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马