for循环与内存

目录

for循环局部变量

 代码:

三种for循环的效率比

for循环的工作原理


 

1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。

 

堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中

栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量)

 

Student sss = new Student();

sss: 就是局部变量

new Studetn();  会在堆里面开辟一个空间(地址)

sss 是指向 new Studetn(); 在堆里面开辟的地址

 

for循环局部变量

我这次主要验证的是,将变量放到 for 循环里面 和 放到 for 循环外面 的区别,都知道java 有自动的垃圾回收机制,c++则需要手动的进行垃圾的回收 (回收得是堆内存中的空间)

栈内存存放的变量生命周期一旦结束就会被释放

栈内存的更新速度很快,堆内存的更新需要根据垃圾回收机制不定时的进行回收。

按道理来讲,变量放到外面,减少了栈内存的消耗,但是变量定义到外面,消耗的时间反而增加了。

//wai : 647
// nei : 445

具体在循环的时候内存是怎么分配的暂时还不是很清楚,现在只要明白一定就可以了,java 在进行for 循环的时候,如果不是全局变量,定义到 for 循环里面就可以了,没有必要非得定义到外面。

 代码:


import lombok.Data;
import org.junit.Test;

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

/**
 * Create by yang_zzu on 2020/7/14 on 8:56
 */
public class For {

    @Data
    static class Student {
        String name;
        int age;
        String phone;
    }

    public static void main(String[] args) {

        List<Student> students_1 = new ArrayList<>();
        Student student_1;
        for (int i = 1; i < 100000; i++) {
            student_1 = new Student();
            student_1.name = "yang_" + i;
            student_1.age = i;
            student_1.phone = "xxxxx" + i;
            students_1.add(student_1);
        }

        new Thread(() ->{
            try {
                //该线程睡 3 秒
                Thread.sleep(3000);

                long a = System.currentTimeMillis();

                for (Student student : students_1) {
                    Student sss = student;
                    System.out.println(sss.toString());
                }

                long b = System.currentTimeMillis();

                // nei : 445
                System.out.println("nei : " + (b - a));

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        ).start();

        new Thread(() -> {

            long c = System.currentTimeMillis();

            Student sss_1;
            for (Student student : students_1) {
                sss_1 = student;
                System.out.println(sss_1.toString());
            }

            long d = System.currentTimeMillis();
            //wai : 647
            System.out.println("wai : " + (d - c));

        }).start();

    }


}

 

 

三种for循环的效率比

        // forEache
        studentLinkedList.forEach(student -> {
            int age = student.getAge();
            System.out.println(age);
        });
        //增强型
        for (Student student : studentLinkedList) {
            int age = student.getAge();
            System.out.println(age);
        }
        //for i
        for (int i = 0; i < studentLinkedList.size(); i++) {
            Student student = studentLinkedList.get(i);
            int age = student.getAge();
            System.out.println(age);
        }

普通的for i 循环操作,在编译成 class 文件的时候会进行java 代码的优化,将变量放到了循环体里面 

 增强型 for 循环,最终使用的是 while 的循环操作

 

forEache 循环操作,使用的是1.8 的流操作

 

在这个老哥这里看到,在1万次循环之后,for i 循环消耗的时间显著增加,

1万之前,使用哪种遍历方式基本上差别不是很大,

 

for循环的工作原理

将集合中某个对象的空间地址,指向变量 student3

 执行完new 语句之后,student3 指向一个新的空间地址

也就是说,在执行得到 该句之前的时候

student3 = new Student();

student3 是集合中某个元素的 地址空间

在执行完该条语句之后

student3 又指向了新的 地址空间

他们前后指向不同的实例对象

所以在new 完之后,该对象的地址空间发生变化,不再是 list 集合中的某个对象的地址空间,

对 student3 操作的时候是对 new 之后的地址空间进行操作,和集合中任何一个元素的地址空间都没有关系。

************** 不管是什么变量的创建修改 都是对内存空间进行操作 **************

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值