最近碰到一个特别棘手的问题,一个医疗的项目,胎心监护的,需要从后台获取特别多的数据,进行折线图的绘制。硬件厂家提供了一个方案,他们提供的数据接口需要在for循环中创建对象,一般来讲,在for循环中创建对象,如果是数量比较水就不需要计较了,关键是这次需要创建几万个,这样就出问题了,没有办法在循环几万次,创建几万个对象,这是非常不靠谱的,也是非常耗费资源的,那怎么优化呢?
比如下面一个常见的person类,我们需要集成cloneable,让我们在创建对象 到时候使用克隆方式,以便节约资源及时间
public class Person implements Cloneable {
String name;
int age;
static Person person = new Person();
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static Person getPerson() {
try {
return (Person) person.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
return null;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
使用方式
public class Test {
private static final String TAG = "Test";
public static void main(String args[]){
List<Person> list1=new ArrayList<>();
List<Person> list2=new ArrayList<>();
//测试分别用for循环方式创建对象,与使用clone创建对象的两种方式所花费的时间长短
long start1=System.currentTimeMillis();
for (int i = 0; i <3000000 ; i++) {
Person person=new Person("张三"+i,i);
list1.add(person);
}
System.out.println("采用for循环花费时间---"+(System.currentTimeMillis()-start1)+"-----打印一个对象数据"+list1.get(10000).toString());
long start2=System.currentTimeMillis();
for (int i = 0; i <3000000 ; i++) {
Person person=Person.getPerson();
list2.add(person);
}
System.out.println("采用clone循环花费时间---"+(System.currentTimeMillis()-start2)+"-----打印一个对象数据"+list1.get(10000).toString());
}
}
输出结果
采用for循环花费时间---2515-----打印一个对象数据Person{name='张三10000', age=10000}
采用clone循环花费时间---86-----打印一个对象数据Person{name='张三10000', age=10000}
经过测试之后发现,经过clone方式来复用对象,能够大量的节约时间,至于clone模式更多原理,请大家自行搜索相关资料学习。