Integer和 String 也一样在栈中?

wonkju 2012-12-11 10:23:20
想问大家一个问题:
当我 每每: Integer integer01 = new Integer(1);的时候,这当然不会缓存,因为每 new 一次都会在堆中生成一个新的对象。

然后我想问的是,如果我 :Integer integer02 = Integer.valueOf(1);
的时候,是不是也想 String 一样,将 值保存在栈中池?
...全文
359 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
tyrone2025 2013-01-09
  • 打赏
  • 举报
回复
String,Integer等java类型作为参数进行修改都不能成功,我试了,他俩用new都不会生成堆对象
wonkju 2012-12-12
  • 打赏
  • 举报
回复
谢谢大家,给我启示很多···
wonkju 2012-12-12
  • 打赏
  • 举报
回复
引用 1 楼 ticmy 的回复:
栈 和 java栈 不是一个东西 堆 和 java堆 也不是一个东西 java栈中的内容是栈帧,栈帧中还有一个操作数栈 每个启动一个java线程就会关联一个java栈,每调用一个java方法就会将一个栈帧入栈 楼主你说的栈究竟是指哪一个?
又懂了多点东西,我没有想到有两个栈,我说的是我们平时的栈。 没把他们分了那么清晰···
snow-is-my-Love 2012-12-12
  • 打赏
  • 举报
回复
引用 3 楼 Super_Eagle 的回复:
IntegerCache是在vm启动的时候,就分配好了的吗?
应该是在jvm启动时 就分在了 永久代里面了
beiouwolf 2012-12-12
  • 打赏
  • 举报
回复

private static class IntegerCache {
	private IntegerCache(){}

	static final Integer cache[] = new Integer[-(-128) + 127 + 1];

	static {
	    for(int i = 0; i < cache.length; i++)
		cache[i] = new Integer(i - 128);
	}
    }
IntegerCache只是个静态类而已,预先定义了256个数字的数组
supereagle 2012-12-11
  • 打赏
  • 举报
回复
引用 2 楼 tiwerbao 的回复:
引用 楼主 king769147 的回复:Integer integer02 = Integer.valueOf(1); 的时候,是不是也想 String 一样,将 值保存在栈中池? Integer.valueOf(i)和new Integer(i)几乎是一样的,只是-128到127可以直接读取缓存,这样效率高一些。 具体可以参考Integer.valueOf的……
IntegerCache是在vm启动的时候,就分配好了的吗?
Jacky-止涯 2012-12-11
  • 打赏
  • 举报
回复
引用 楼主 king769147 的回复:
Integer integer02 = Integer.valueOf(1); 的时候,是不是也想 String 一样,将 值保存在栈中池?
Integer.valueOf(i)和new Integer(i)几乎是一样的,只是-128到127可以直接读取缓存,这样效率高一些。 具体可以参考Integer.valueOf的源码: (IntegerCache就是一个-128到127的Integer数组)

    public static Integer valueOf(int i) {
        assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
同理,Character等也是有这样的缓存机制。 至于你说的,new Integer(i)和new String("str"),原理是一样的,都会和常量池打交道的。先在常量池找一遍,找到了直接指向;没找到就在常量池创建一个。
龙四 2012-12-11
  • 打赏
  • 举报
回复
栈 和 java栈 不是一个东西 堆 和 java堆 也不是一个东西 java栈中的内容是栈帧,栈帧中还有一个操作数栈 每个启动一个java线程就会关联一个java栈,每调用一个java方法就会将一个栈帧入栈 楼主你说的栈究竟是指哪一个?

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧