Java里问个习惯问题关于循环怎样写变量速度快的问题
如果一个for循环里需要一个变量这个变量只在循环里用其他地方用不到,这个变量是应该写在循环外面每次光换值就可以还是写在循环内部每次都创建一个变量?如果这个变量是strin...
如果一个for循环里需要一个变量这个变量只在循环里用其他地方用不到 , 这个变量是应该写在循环外面每次光换值就可以 还是写在循环内部每次都创建一个变量 ?
如果这个变量是string的呢 , string是常量无法改变更换变量值会不会导致速度慢呀? 展开
如果这个变量是string的呢 , string是常量无法改变更换变量值会不会导致速度慢呀? 展开
3个回答
展开全部
首先我说一点,你完全不需要在这个上面纠结,根本没必要,就你说的这一点,你怎么写都行,就算按照最坏的写法,对程序运行的影响几乎可以忽略,我看阿里的编码规范写的很细,但不会写这一点,具体原因,我下面分析下,当然,也可能是错的,算是我个人的理解吧。
欢迎批评指正,因为我们都是爱好技术的人,没有对错的。
个人觉得最正确的办法是写在循环外面,原因无他,一点足以,那就是除非万不得已,不要把变量的定义放在循环里面,如果只是个简单的字符串还好,但如果是更大的对象,比如封装了很多东西的对象,你这样定义会让内存爆掉,出于习惯你也应该这么来做。
先分析这种最正确的写法:首先你定义的一个变量会在栈空间里,然后循环里面每次赋值的内容,如果是显示常量,也就是显示赋值的话,那这个值是存在常量内存块里面,然后此栈内存中的变量指向此常量区的常量值,后续的赋值也一样,不管你赋值多少次都不会影响内存,或者是对程序的运行造成什么影响;然后说非显示赋值,也就是每次给该变量赋值的都是一些变量或者表达式啥的,这些一般都会在堆内存里面定义一个新的对象,然后让栈内存中的变量指向该新对象,然后这个新的对象会在JVM的内存扫描时自动回收,和你把变量定义在哪里也没有关系。
然后分析把变量定义在循环内部:这种写法虽然稍微有点不好,但影响可以忽略了,当然如果你每次定义这个string类型对象的时候都是new出来的,那么我没辙了,你应该去重新学学java基础了,因为你只需要显示的定义一个变量,而根本就不需要定义出这个对象来,如果你非要这么定义一个空的对象,然后再给赋值,那肯定会对内存有影响的,这属于初学者就应该知道的最基本的东西,我这里就不多少了,言归正传,你每次在循环里面定义的变量也是放在栈内存里面的,然后指向你的string值,不管是常量里面的还是堆里面的新对象,然后你每次定义新的变量时,上一个都没用了,然后该线程会自动回收该变量,而且是立马回收,所以对栈内存几乎没影响,然后来说堆内存和常量区,不管你的变量在哪里定义,堆内存和常量区中的值或者对象都是不可避免的要出现,所以不考虑了。
OK,就说这么多吧,打字怪累的,希望你可以认真看完我写了这么多
欢迎批评指正,因为我们都是爱好技术的人,没有对错的。
个人觉得最正确的办法是写在循环外面,原因无他,一点足以,那就是除非万不得已,不要把变量的定义放在循环里面,如果只是个简单的字符串还好,但如果是更大的对象,比如封装了很多东西的对象,你这样定义会让内存爆掉,出于习惯你也应该这么来做。
先分析这种最正确的写法:首先你定义的一个变量会在栈空间里,然后循环里面每次赋值的内容,如果是显示常量,也就是显示赋值的话,那这个值是存在常量内存块里面,然后此栈内存中的变量指向此常量区的常量值,后续的赋值也一样,不管你赋值多少次都不会影响内存,或者是对程序的运行造成什么影响;然后说非显示赋值,也就是每次给该变量赋值的都是一些变量或者表达式啥的,这些一般都会在堆内存里面定义一个新的对象,然后让栈内存中的变量指向该新对象,然后这个新的对象会在JVM的内存扫描时自动回收,和你把变量定义在哪里也没有关系。
然后分析把变量定义在循环内部:这种写法虽然稍微有点不好,但影响可以忽略了,当然如果你每次定义这个string类型对象的时候都是new出来的,那么我没辙了,你应该去重新学学java基础了,因为你只需要显示的定义一个变量,而根本就不需要定义出这个对象来,如果你非要这么定义一个空的对象,然后再给赋值,那肯定会对内存有影响的,这属于初学者就应该知道的最基本的东西,我这里就不多少了,言归正传,你每次在循环里面定义的变量也是放在栈内存里面的,然后指向你的string值,不管是常量里面的还是堆里面的新对象,然后你每次定义新的变量时,上一个都没用了,然后该线程会自动回收该变量,而且是立马回收,所以对栈内存几乎没影响,然后来说堆内存和常量区,不管你的变量在哪里定义,堆内存和常量区中的值或者对象都是不可避免的要出现,所以不考虑了。
OK,就说这么多吧,打字怪累的,希望你可以认真看完我写了这么多
展开全部
直接在循环里面创建,速度差不了太多的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
肯定是定义在循环外快,至少不会比循环内慢。
追问
但是 string 的值无法修改,重新赋值后台其实也是重新创建了一个string
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询