首页 / JAVA / Java-性能与内存列表
Java-性能与内存列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java-性能与内存列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2715字,纯文字阅读大概需要4分钟。
内容图文
![Java-性能与内存列表](/upload/InfoBanner/zyjiaocheng/946/17dc235caa1e4be39974224f1c910f66.jpg)
有什么会更好?
假设我们有一个特定的类mainClass,它具有List< BigClass>与List< Foo> foos ….
Foo本身具有List< Boo>
如果目标是能够获得foos所有元素的所有Boo.
那么保留另一个List< Boo>会更好吗?如果用户要在foos中插入新的Foo,请在BigClass中插入相应的Boo元素?
还是每当用户要求此列表时从“ BigClass”内部生成此Boo列表总会更好?
这里的主要问题是,您是否必须在这里选择性能还是内存?
PS.
抱歉,您的标题很宽泛,不知道该如何命名:/
解决方法:
如果您需要同时获取所有Boos并同时对Boos进行分组(即,属于某个Foo的Boos),那么我想说的最好是返回BigClass中包含的所有Boos的视图,无论它们是哪个Foo属于.
为此,您可以使用Google Guava Iterables或Java 8 Stream.flatMap(),具体取决于您的Java版本.
使用Google Guava:
class BigClass {
List<Foo> foos = new LinkedList<Foo>();
public Iterable<Boo> allBoos() {
return Iterables.concat(this.foos);
}
}
class Boo {
final int a;
Boo(int a) {
this.a = a;
}
@Override
public String toString() {
return String.valueOf(this.a);
}
}
class Foo
implements Iterable<Boo> {
List<Boo> boos = new LinkedList<Boo>();
@Override
public Iterator<Boo> iterator() {
return this.boos.iterator();
}
}
public class Sample {
public static void main(String[] args) {
Boo b1 = new Boo(1);
Boo b3 = new Boo(3);
Boo b5 = new Boo(5);
Boo b2 = new Boo(2);
Boo b4 = new Boo(4);
Boo b6 = new Boo(6);
Foo odd = new Foo();
odd.boos.addAll(Arrays.asList(b1, b3, b5));
Foo even = new Foo();
even.boos.addAll(Arrays.asList(b2, b4, b6));
BigClass b = new BigClass();
b.foos.add(odd);
b.foos.add(even);
System.out.println(b.allBoos()); // [1, 3, 5, 2, 4, 6]
}
}
这种方法的最好之处在于,Guava返回的Iterable是惰性的,这意味着不会创建新集合或列表,也不会填充任何元素.相反,返回的Iterable是一个视图,该视图的Iterator消耗第一个Iterable中的元素,并且在耗尽后“跳转”到下一个Iterable并使用其元素,然后“跳转”到下一个Iterable,依此类推,直到最后一个元素最后一个Iterable中的消耗.
使用Java 8:
class BigClass {
List<Foo> foos = new LinkedList<Foo>();
public Iterable<Boo> allBoos() {
Stream<Boo> s = this.foos.stream().flatMap(
f -> f.getBoos().stream());
return s::iterator;
}
}
class Boo {
final int a;
Boo(int a) {
this.a = a;
}
@Override
public String toString() {
return String.valueOf(this.a);
}
}
class Foo {
List<Boo> boos = new LinkedList<Boo>();
public List<Boo> getBoos() {
return this.boos;
}
}
public class Sample {
public static void main(String[] args) {
Boo b1 = new Boo(1);
Boo b3 = new Boo(3);
Boo b5 = new Boo(5);
Boo b2 = new Boo(2);
Boo b4 = new Boo(4);
Boo b6 = new Boo(6);
Foo odd = new Foo();
odd.boos.addAll(Arrays.asList(b1, b3, b5));
Foo even = new Foo();
even.boos.addAll(Arrays.asList(b2, b4, b6));
BigClass b = new BigClass();
b.foos.add(odd);
b.foos.add(even);
List<Boo> list = new ArrayList<>();
b.allBoos().forEach(boo -> list.add(boo));
System.out.println(list); // [1, 3, 5, 2, 4, 6]
}
}
关于懒惰的相同考虑也适用于此.
内容总结
以上是互联网集市为您收集整理的Java-性能与内存列表全部内容,希望文章能够帮你解决Java-性能与内存列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。