首先说下问题:

这次在做项目的是出现了一个new对象在循环里面与外面造成的不同影响。

大家可以看到这个new的对象放在不同的位置产生的效果是不一样的。

经过多方查询与验证可以得出结论:

* EasyUITree tree=new EasyUITree();
*放外边是同一块内存空间,你的list中看似有了很多tree,其实都是同一个tree对象,tree的内容是你最后一次修改的内容,所以最终树的的节点都是一样的
而你放在里面的时候,每次都开辟了一个新的内存空间,也就是新的对象tree,所以list存的都是一个个独立的tree对象,内容自然不一样
*/

所以:在循环体外,始终都是这一个对象,循环放入的都是最新的值。

在循环体内,创建的是不同的对象,每次放入的对应这不同值的对象。

下面是具体的jvm的一些解释:

事实上在Java的GC机制中如果一个对象有着具体的引用,那么是不会被GC自动回收的。
也就是说:

Object obj = new Object();//写在100个循环内等于你有100个引用对应了100个对象
所以100个对象在一段时间内都是会占用内存,直到内存不足GC主动回收

obj = new Object();//写在100个循环内等于你使用1个引用分别100次调用了100个对象
所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收
(在你的循环还未结束时,可能已经进行了多次GC回收,这点很重要)

也就是说第二种方法能更好的管理内存。

p.s.
Java高性能编程就是通过程序员对代码的掌控更切合计算机的识别与效率,
如果题主觉得安全更重要(但我没想到会有什么安全问题)那也可以按照你的方法,
毕竟时代在进步,编程也没必要按部就班,能实现功能、保证效率就好。

链接:https://www.zhihu.com/question/31751468/answer/88626975

 
用内存角度来解释的话,在JVM的方法栈和堆内存这两个内存中,当运行Object obj = new Object();时,在方法栈的栈顶中放入Object obj,然后在堆中生成一个Object对象,最后方法栈中的obj指向Object对象,这时完成一次循环的内存动作。接着第二次循环, new Object();又产生一个新的Object对象,然后方法栈中的obj指向新的Object对象,第一次循环的Object对象没有被任务变量引用,成为了垃圾,等JVM垃圾回收器回收。其它循环以此类推了。
在这里我提一下题外话,JVM有个优秀的算法是,JVM的方法栈,一个方法的调用产生一个栈帧,这个栈帧在方法调用时计算出你有几个局部变量,这个计算会过滤作用域的,如你的循环后面再建立一个局部变量,那JVM认为只有一个局部变量,因为你的Object obj = new Object();在大括号内,出了大括号就没有了,所以只需要一个位置来存放局部变量即可,也就是说运行到大括号时用这个位置来执行代码,出了大括号后下一个局部变量就可以接着使用这个栈的这个位置来执行下面的代码了。

java中new一个对象放在循环体里面与外面的区别的更多相关文章

  1. jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么

    https://zhuanlan.zhihu.com/p/257863129?utm_source=ZHShareTargetIDMore 番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注   ...

  2. java中super()和this()、super和this的区别

    1.super()和this()区别: super():调用父类无形参的构造方法: super(形参):调用父类中某个带形参的构造方法: this(形参):调用本类中另一种形式的构造方法: 注意:放在 ...

  3. <Java中的继承和组合之间的联系和区别>

    //Java中的继承和组合之间的联系和区别 //本例是继承 class Animal { private void beat() { System.out.println("心胀跳动...& ...

  4. Java中 a+=b 和 a=a+b 有什么区别?

    今天舍友突然问我"在java中 a+=b 和a=a+b 有什么区别",说这是一道面试题.当时就不假思索的回答:"一样啊",然后他说有位面试者也回答说一样,所以被 ...

  5. Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  6. Java基础知识强化之多线程笔记05:Java中继承thread类 与 实现Runnable接口的区别

    1. Java中线程的创建有两种方式:  (1)通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中. (2)通过实现Runnable接口,实例化Thread类. 2. ...

  7. [转] Java中继承thread类与实现Runnable接口的区别

    Java中线程的创建有两种方式: 1.  通过继承Thread类,重写Thread的run()方法,将线程运行的逻辑放在其中 2.  通过实现Runnable接口,实例化Thread类 在实际应用中, ...

  8. Java中String直接赋字符串和new String的区别

    解析Java中的String对象的数据类型 1. String是一个对象.  因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ...

  9. 【转】Java中super和this的几种用法与区别

    1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位.   class Base {   Base() {   System.out.println("Base&qu ...

随机推荐

  1. JAVA中 "\" 和 "/" 的区别

    1.在java中路径一般用”/” 2.linux.unix中的路径一般用”/” 3.windows中的路径一般用”\” 所以在java中写windows路径一般用”/”,或用“\”将”\”转义一下(& ...

  2. 78[LeetCode] Subsets

    Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The solut ...

  3. kaldi - Online Audio Server(服务器客户端建立方法-旧版在线解码)

    目录 一.服务器客户端识别系统建立方法 1. Command line to start the server(服务器端启动方式): 2. Command line to start the clie ...

  4. BluetoothSocket详解

    一. BluetoothSocket简介 1. 简介 客户端与服务端 : BluetoothSocket 和 BluetoothServerSocket 类似于Java中的套接字的 Socket 和 ...

  5. Martin Fowler关于IOC和DI的文章(原版)

    Inversion of Control Containers and the Dependency Injection pattern In the Java community there's b ...

  6. web前端之路 - 开篇

    一 web发展历程 了解事物的历史有助于我们渐进式的从发展的思路清楚了解事物的来龙去脉. 这里有一篇网文写得比较清晰和完整:https://www.tianmaying.com/tutorial/we ...

  7. win7 x64+iis7.5 配置错误:CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\7cb4f3

    解决方法: 1. 将windows/temp属性-安全-高级 添加IIS_USERS用户,同时编辑权限为完全控制(写入和编辑)即可. 注意: 要确保权限添加上了,win7下有可能系统为安全,会自动取消 ...

  8. 【.NET】- async await 异步编程

    为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中, ...

  9. COM 自动化控制Excel应用程序

    class Program { static void Main(string[] args) { var dt = new System.Data.DataTable(); dt.Columns.A ...

  10. memcached安装与启动

    windows 安装1.4.4版本 https://pan.baidu.com/s/1xX1NThLqeq2zNMaqONFgkQ 解压,“以管理员身份” 运行cmd,切换到memcached根目录, ...