目录
for循环局部变量
代码:
三种for循环的效率比
for循环的工作原理
1:寄存器。2:本地方法区。3:方法区。4:栈。5:堆。
堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中
栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量)
Student sss = new Student();
sss: 就是局部变量
new Studetn(); 会在堆里面开辟一个空间(地址)
sss 是指向 new Studetn(); 在堆里面开辟的地址
我这次主要验证的是,将变量放到 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 {@Datastatic 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.String());}long b = System.currentTimeMillis();// nei : 445System.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(String());}long d = System.currentTimeMillis();//wai : 647System.out.println("wai : " + (d - c));}).start();}}
// forEachestudentLinkedList.forEach(student -> {int age = Age();System.out.println(age);});//增强型for (Student student : studentLinkedList) {int age = Age();System.out.println(age);}//for ifor (int i = 0; i < studentLinkedList.size(); i++) {Student student = (i);int age = Age();System.out.println(age);}
普通的for i 循环操作,在编译成 class 文件的时候会进行java 代码的优化,将变量放到了循环体里面
增强型 for 循环,最终使用的是 while 的循环操作
forEache 循环操作,使用的是1.8 的流操作
在这个老哥这里看到,在1万次循环之后,for i 循环消耗的时间显著增加,
1万之前,使用哪种遍历方式基本上差别不是很大,
将集合中某个对象的空间地址,指向变量 student3
执行完new 语句之后,student3 指向一个新的空间地址
也就是说,在执行得到 该句之前的时候
student3 = new Student();
student3 是集合中某个元素的 地址空间
在执行完该条语句之后
student3 又指向了新的 地址空间
他们前后指向不同的实例对象
所以在new 完之后,该对象的地址空间发生变化,不再是 list 集合中的某个对象的地址空间,
对 student3 操作的时候是对 new 之后的地址空间进行操作,和集合中任何一个元素的地址空间都没有关系。
************** 不管是什么变量的创建修改 都是对内存空间进行操作 **************
本文发布于:2024-01-29 07:01:41,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170648290813537.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |