对于在循环外创建对象比较好还是在循环内创建对象好问题,我认为应该具体情况具体分析:
1、如果循环内没有需要将对象添加到集合内等一些情况,则应该在循环外创建对象,这样可以节省内存,不用多次创建对象造成内存的过度使用。
String end = "";
for(int i = 0 ; i<readfiles.size(); i++){
End = end+readfiles.get(i);
}
2、如果循环内有将对象添加到集合内等情况,则需要在循环内创建对象。
for(int i = 0 ; i<readfiles.size(); i++){
file = readfiles.get(i);
FileVO filevo = new FileVO();
filevo.setId(ran.createID(20));
list.add(filevo);
}
为什么会有这两种情况呢?这是因为集合添加对象的时候是添加对象的引用,而不是对象的本身。在循环外创建对象,对象只创建了一次,循环时对对象的赋值,都是对同一个引用所代表的对象进行进行赋值,是修改不是新增。集合内添加的对象一直随着对象的改变而改变,结果就是集合里面所有的对象的都将是最后一次循环赋值的对象。
在集合外创建对象:
FileVO filevo = new FileVO();
List<FileVO> lists = new ArrayList<FileVO>();
for(int i = 0; i<4; i++){
filevo.setId(RandomID.createID(8)); //RandomID.createID(8)生成8位随机数
lists.add(filevo);
}
for(FileVO s : lists){
System.out.println(s.getId());
}
输出结果:
braRsJRr
braRsJRr
braRsJRr
braRsJRr
在集合内创建对象:
List<FileVO> lists = new ArrayList<FileVO>();
for(int i = 0; i<4; i++){
FileVO filevo = new FileVO();
filevo.setId(RandomID.createID(8)); //RandomID.createID(8)生成8位随机数
lists.add(filevo);
}
for(FileVO s : lists){
System.out.println(s.getId());
}
输出结果:
7h3kvp56
JxMv5LVz
elar0K7L
PFVa5zsM
3、 对于某些不变的对象(比如String)不适合情况二,因为即使在循环外创建对象也不会造成集合内的对象随着对象值改变而改变,这种时候在循环外创建对象就行。
关于【在
循环
体内定义对象还是在
循环
体
外
定义对象】这个问题网络上有很多文章写过,在
循环
体
外
定义对象的支持者更多,理由是在
循环
体内
创建对象
会有多个对象引用存在。但是我在实际测试之后认为两种写法是 没有区别 的。
测试环境
Java
版本:1.8.0_101
反编译工具:
Java
Decompiler
测试代码如下
在
循环
体内定义对象
package other.defineVarInLoop;
im...
有时候奇怪的发现往list添加数据的时候,一直被最后一个元素覆盖,首先 ,我们得明白原理:
在new 一个对象的时候,对象的ID是唯一确定的;将对象add入list中时,放入list中的其实是对象的引用 ;而每次
循环
只是简单 的set 对象的属性,set新的属性值,而add进list中的对象还是同一个对象id,也就是同一个对象;
所以每次add之后,list发现对象引用和之前元素一...
@ApiOperationSupport(order =3)
@ApiOperation(value = "", notes = "传入id")
@GetMapping("/getById")
public R<List<xxx>> getById(XXX xxx) {
List<XXX> xxxList= XXXSer...
我想创建u1,u2....u9,u10 十个对象,所以用for
循环
这样写,结果错误,请教高手要如何写 for(int i=0;i<=10;i++) { User u+i = new User(); }
方法1、 User u[] = new User[10];//创建实体数组
for(int i =0, n = u.length...
List<DriverTrack> driverTracks = driverService.selectDriverTrackByExample(example);
List<TrackVo> list = new ArrayList<TrackVo>();
TrackVo trackVo = new TrackVo();
if (driverTra...
背景:之前生产遇到一次问题就是系统卡顿,排查之后发现就是大量代码有for
循环
内频繁
创建对象
的现象
方式一:方法内创建
private void methodInnter(){
List<String> list = new ArrayList<>();
for (int i = 0; i<1000 ;i++) {
StringBuilder stringBuilder = new StringBuilder();
使用for
循环
时,不小心将本应在
循环
内创建的对象创建在了
循环
外
。因出现不同结果,对此进行了研究。
1.
循环
外
实例化对象(错误):
List<String> list = new ArrayList<>();
Rank rank = new Rank();
for(int i = 1; i < 2; i++){
rank.setRank(i);
list.add(rank);
2.
循环
内实例化对象: