精华内容
下载资源
问答
  • 循环外和循环定义变量的区别

    千次阅读 2020-08-10 17:48:38
    循环定义的话,for循环一直用的是同一块内存空间,效率比较高,但是变量的作用域就大了,耗内存 所以,其实内外都可以的,总之就是空间和时间的权衡,看实际情况了,局部变量的数据类型、大小什么的都有关 下面...

    一、代码展示

    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @Package: raymond
     * @ClassName: Test
     * @Author: tanp
     * @Description: ${description}
     * @Date: 2020/8/10 14:12
     */
    public class Test {
    
        public static void main(String[] args) {
            TestThread2 testThread = new TestThread2();
            testThread.start();
        }
    
        static class TestThread extends Thread {
            @Override
            public void run() {
                for(int i=0; i<10; i++){
                    Map<String,Object> map = new HashMap<>();
                    map.put(i+"",i);
                }
            }
        }
    
        static class TestThread2 extends Thread {
            Map<String,Object> map;
            @Override
            public void run() {
                for(int i=0; i<10; i++){
                    map = new HashMap<>();
                    map.put(i+"",i);
                }
            }
        }
    }
    

    二、问题

    从上面的代码可以看到,TestThread和TestThread2的区别在于map的定义是放在for循环外面还是里面,那么就有一个问题,在写代码的时候到底是要将变量定义在外面还是里面呢。

    三、JVM运行时数据区

    首先我们要知道JVM运行时数据区中有几大块,其中的两块分别为栈和堆

    JVM

    JVM栈是线程私有的,每个线程创建的同时都会创建JVM栈,JVM栈中存放的为当前线程中局部基本类型的变量(java中定义的八种基本类型:boolean、char、byte、short、int、long、float、double)、部分的返回结果以及Stack Frame,非基本类型的对象在JVM栈上仅存放一个指向堆上的地址

    堆(Heap

    它是JVM用来存储对象实例以及数组值的区域,可以认为Java中所有通过new创建的对象的内存都在此分配,Heap中的对象的内存需要等待GC进行回收。

    (1)       堆是JVM中所有线程共享的,因此在其上进行对象内存的分配均需要进行加锁,这也导致了new对象的开销是比较大的

    (2)       Sun Hotspot JVM为了提升对象内存分配的效率,对于所创建的线程都会分配一块独立的空间TLAB(Thread Local Allocation Buffer),其大小由JVM根据运行的情况计算而得,在TLAB上分配对象时不需要加锁,因此JVM在给线程的对象分配内存时会尽量的在TLAB上分配,在这种情况下JVM中分配对象内存的性能和C基本是一样高效的,但如果对象过大的话则仍然是直接使用堆空间分配

    (3)       TLAB仅作用于新生代的Eden Space,因此在编写Java程序时,通常多个小的对象比大的对象分配起来更加高效。

    具体的jvm知识可以查看我的这篇博客https://blog.csdn.net/bird_tp/article/details/88560468

    四、循环内和循环外定义变量的本质区别

    结合上面的堆、栈信息,我们可以明白变量的定义是放在栈里面的,变量的实例化对象是放在堆里面的,所以我们前面两个线程中定义map的本质区别在于

    线程TestThread在栈声明了10个栈内存地址,10个堆内存地址,而TestThread2只声明了1个栈内存地址,10个堆内存地址。TestThread2线程在循环实例化map时,只是通过一个栈内存地址移动引用指向了的10个堆内存地址。

    总结起来就是
    1、在循环外面的定义的变量,只在栈中声明了一次;
    2、在循环里面的定义的变量,循环多少次就在栈中声明了多少次;

    五、循环时具体如何定义变量

    放在循环内部定义,确实会多次申请栈帧的内存空间,但其实话说回来,这样对性能的影响其实可以忽略不计,没什么大的问题。因为栈内存的分配非常之快,仅次于寄存器,所以,可以忽略不计。

    总的来说,循环内的话,每次循环内部的局部变量在每次进for循环的时候都要重新定义一遍变量,也就是执行申请内存空间,变量压入堆栈的过程。
    循环外定义的话,for循环一直用的是同一块内存空间,效率比较高,但是变量的作用域就大了,耗内存
    所以,其实内外都可以的,总之就是空间和时间的权衡,看实际情况了,局部变量的数据类型、大小什么的都有关

    下面粘贴下jdk7的hashmap的get方法,我们可以看到Object k就是定义在循环里面的。

    public V get(Object key) {
            if (key == null)
                return getForNullKey();
            int hash = hash(key.hashCode());
            for (Entry<K,V> e = table[indexFor(hash, table.length)];
                 e != null;
                 e = e.next) {
                Object k;
                if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
                    return e.value;
            }
            return null;
        }

    六、总结

    在for循环外面和里面定义变量,对于内存,性能影响其实没有什么多大区别。看个人使用情况而言,对于我个人使用而言,还是习惯定义在外面

    展开全文
  • 在C++里面,我们通常会这样写for循环:for(int i = 0;...}  首先是在内层循环定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,

      在C++里面,我们通常会这样写for循环:

    for(int i = 0;i<10;i++)
    {
         cout << i;      
    }

      还有另外一种写法:

    int i = 0;
    for(; i<10 ;i++)
    {
          cout << i;     
    }

      首先是在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,不会反复分配变量。函数的定义是编译器的事情,运行的时候不存在什么定义,更没有什么开销。

       除非是类对象或者结构体对象, 在for循环里面与外面, 开销可能会不一样.基本数据类型, 那是一样的, 编译器肯定会优化这个东西。

      一般来说, 在进入函数时, 所有的栈变量都分配好空间了。所以那个for变量写在哪里都是一样的. 具体你可以看一下反汇编代码, 全部就展现在你眼前了。

      自己在编程的时候要注意不要让上一次的结果影响到下一次循环,比如上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误,却没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,如果是每次都重新定义,那就不存在这样的问题。

      最后总结:

      1、对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力的主流的编译器,完全不需要关心在循环外还是循环内定义循环变量。

      2、如果循环变量本身是复杂的对象,建议在循环外定义好,并且在for循环的赋值语句、判断语句中,都要避免重复创建对象。

    展开全文
  • 04选择结构循环结构函数定义使用Python数据分析挖掘与可视化本章学习目标理解条件表达式的值与True或False的等价关系熟练掌握选择结构熟练掌握循环结构理解带else的循环结构执行过程熟练掌握函数的定义使用熟练...
  • c++中利用定义简化for循环使用;

    千次阅读 2019-01-14 16:38:59
    话不多说,上方法 #define _for(i,a,b) for( int i=(a);...这种简洁的宏定义将极大的简化for在实例中的使用   _for(i, 0, 4) { printf("%d", i); } for 看起来更加简洁,而且其他使...

    话不多说,上方法

    #define _for(i,a,b) for( int i=(a); i<(b); ++i)
    #define _rep(i,a,b) for( int i=(a); i<=(b); ++i)

    这种简洁的宏定义将极大的简化for在实例中的使用

     

    _for(i, 0, 4) 
    {
    	printf("%d", i);
    }

    for 看起来更加简洁,而且其他使用方法跟一般的for很像.

    展开全文
  • 循环定义变量 tempReportInfo ``` public ArrayList<ReportInfo> getAllReportInfos() { ArrayList<ReportInfo> reportInfos = new ArrayList(); Cursor cursor = null; ReportInfo tempReportInfo = new ...
  • 关于变量在for循环内外定义的思考 在c#或java里面,我们通常会这样写for循环: for(int i = 0;i10;i++) { Console.WriteLine(i); } 前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高...

    关于变量在for循环内外定义的思考

    在c#或java里面,我们通常会这样写for循环:

    for(int i = 0;i<10;i++)
    {
         Console.WriteLine(i);      
    }

    前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些:

    1
    2
    3
    4
    5
    int  i = 0;
    for (; i<10 ;i++)
    {
           Console.WriteLine(i);     
    }

     因为我觉得最上面的那种方式,每次循环都会声明一个变量,说不定会影响效率,于是百度了一下,发现其他人也有这个疑惑,特意百度了一些资料,在此做个综合。

       首先是在内层循环中定义变量到底会不会存在重复分配的问题,这涉及到编译器的优化,不过主流编译器(如vs和gcc)这一块优化都比较好,不会反复分配变量。函数的定义是编译器的事情,运行的时候不存在什么定义,更没有什么开销。

     除非是类对象或者结构体对象, 在for循环里面与外面, 开销可能会不一样.基本数据类型, 那是一样的, 编译器肯定会优化这个东西。

      一般来说, 在进入函数时, 所有的栈变量都分配好空间了. 所以那个for变量写在哪里都是一样的. 具体你可以看一下反汇编代码, 全部就展现在你眼前了,我查看过C#的IL代码,发现两种写法的IL代码是一样的,说明没有区别。

          栈中的空间在编译这个代码的时候大小就确定下来了,运行这个方法时空间就已经分配好了,不要想当然的以为声明一次就要分配一次空间,那是c语言,java可以重用这些超出作用域的空间。只要用javap查看方法字节码,看看使用的局部变量表的大小和使用方式即知java这种基于虚拟机的语言,是跟单纯的C不同,C语言的原则是相信程序员能做好一切,因此它不会帮你做多少事情,需要考虑代码优化,内存占用等。

      不过,自己在编程的时候要注意不要让上一次的结果影响到下一次循环,比如上一次 a = 3, 当下一次循环在给a赋值的时候出了错误,而你捕获了错误,却没修正a的值,程序继续执行,那么这时候a=3还成立,可能就会有问题了,如果是每次都重新定义,那就不存在这样的问题。

    最后总结:

    1. 对于使用int等基本数据类型作为循环变量,只要你用的优化方面足够给力的主流的编译器,完全不需要关心在循环外还是循环内定义循环变量。
    2. 如果循环变量本身是复杂的对象,建议在循环外定义好,并且在for循环的赋值语句、判断语句中,都要避免重复创建对象。
         转载地址:http://www.cnblogs.com/DHclly/p/5540918.html
    展开全文
  • 循环 while循环 while循环 语法: while(循环条件){ 循环语句; } 循环的好处: 1、代码不冗余 2、结构简洁 3、代码复用 4、后期维护成本比较低 编写循环: 1、确定计数 2、每次让计数累增 3、仔细
  • 有关for循环的一些小问题。
  • C/C++中宏定义(#define)

    2020-08-31 09:40:23
    #define命令是C语言中的一个宏定义命令,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。接下拉通过本文给大家分享C/C++中宏定义(#define)知识,需要的朋友参考下
  • 在matlab的循环定义循环变量名可以使用下面的语句 for o=1:3 eval(['moudle',num2str(o),'=','num2str(o+1)',';']) end %最后得到的moudle1=2; moudle2=3; moudle3=4; %定义循环字符串 for o=1:3 d=strcat('...
  • 定义使用for循环

    千次阅读 2019-06-05 10:56:15
    typedef struct list_data { int value; } list_data_t; #define list_for_each(data) \ int i; \ for (i = 0; i < data.value; i++) { \ printf("hello world\n");...int main(int ...
  • for循环定义变量

    千次阅读 2017-01-01 15:32:18
    }我们很常做的一件事就是在for循环定义一个变量并初始化(如上面定义的i,初始化为1),这个变量有可能是为了做循环限制而定义的,而此时变量只做为for循环的局部变量循环结束后就不能再使用i这个变量。这是C99规定...
  • 问: // 方法 A: Widget w; for (int i = 0; i &lt; n; ++i) { w = 取决于 i 的某个值; } // 方法 B: ...Effective C++ 条款 26 有一段话大概是:当一个赋值成本低于一组构造+析构成本,定义...
  • 循环定义空矩阵可用于大量数据计算使用
  • RT code 运行环境:win7 dev c++ ``` # include ...乱七八糟的 好像是在for循环定义的变量i在printf里面不能使用 是这样吗? 我在for循环外面又定义了一次变量i 结果就可以在printf里面使用了.
  • JavaScript在循环定义函数的问题

    千次阅读 2018-03-12 20:23:52
    最近在工作中遇到一个让人头疼的问题,需要定义21个函数,函数的主体是一样的,功能也是一致的,仅仅是返回值不同。基本的结构是这样的var arr = ["a","b","c","d"]; var ...
  • { for (int i = 0; i ; i++) { if (arr[i] == elem) { cout 找到了!是序列中第" 个数\n"; break;...这个循环在编译的时候有显示下面的if语句中的i未定义 这个怎么解决。求教!!!
  • 关于变量在for循环内外定义的思考

    千次阅读 2019-10-05 06:15:07
    在c#或java里面,我们通常会这样写for循环: for(int i = 0;i<10;i++) { Console.WriteLine(i); } 前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些: int i = 0; for(; i&...
  • 但是,当在第一个循环定义了变量variable,在另一个循环里也定义了变量名为variable的变量时,在第二循环里输出variable,其值,不再是第一循环里的值,而是另一个循环定义的值。` 在这里插#!/usr/bin/python #...
  • bat for set 循环定义变量 无效 不显示 空 空值 解决办法
  • 首先你要确定for和while里面的各个字段分别表示什么含义: Python 中的循环语句有 2 种,...如果我们看一下正式的Python语法规范,我们可以看到(大约来说),一条while语句使用a test,而一条for语句使用exprlista...
  • 在学习python循环语句的时候,发现else竟然可以和循环语句使用,但是它却与if中else语句的运行完全不同,有时候你真的感觉掉进这个else陷阱里了,完全不知道该怎么用,那么现在咱们一起去看看吧 一、循环_else示例 ...
  • 定义数组,使用循环输入数据,使用循环打印数组数据
  • 第二批量定义方程组,用for循环,方程数组建立 第三,用vpa估计近似值。 第四,方程组输出结果为结构体。 syms x y ; for i=0:1:3 eq(i+1)=a*x^i+b*y^i-integral(@(x)x.^i,-1,1) end s=solve(eq,x,y,a,b) s.x vpa(s...
  • while循环,条件中定义变量和循环体变量一致时出现问题分析 问题:做底层文件copy实验时,为得到read write的返回值在,循环条件中直接定义了 while(int readnum=read(in,&amp;amp;amp;c,1)), 部分代码如下...
  • 变量的声明是在栈中进行的,而实例化则是在堆中,故栈中只有基础数据与实例的引用。...2、在里面的定义的变量,循环多少次就在栈中声明了多少次; 3、在内存或说资源节省方面,肯定是在外面定义较好,是摧荐的写法;
  • 定义循环缓存

    2012-05-08 22:50:50
    操作系统定义循环缓存(os)使用C语言来实现
  • 循环定义的变量为局部变量,只能在循环语句中使用 */ public class XunHuanBianLiangTest { public static void main(String args[]){ for (int i=0;i;i++){ System.out.println(i); } //System.ou
  • 写这篇文章的原因是我在问答平台看到的一个问题:C++内层循环定义变量和在外面定义比影响大吗?问题来自:http://ask.csdn.net/questions/176270 例如: for(int i=0;i;i++) { for(int j=0;j;j++); } 内...
  • shell数组的定义循环

    万次阅读 2016-12-11 20:32:14
    shell中数组的定义及遍历,先直接看示例: #!/bin/sh #定义方法一 数组定义为空格分割 arrayWen=(a b c d e f) #定义方法二 arrayXue[0]="m" arrayXue[1]="n" arrayXue[2]="o" arrayXue[3]="p" arrayXue[4]="q" ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,242,024
精华内容 496,809
关键字:

循环利用的定义