Tag: 组合

以线程安全方式发布非线程安全对象字段

我遇到了Java并发问题。 是的,我看了几乎完全相同标题的问题,但他们似乎都在寻求微妙的不同之处。 是的,我在实践中阅读了Java Concurrency 。 是的,我可以看出为什么它是该主题的事实参考。 是的,我已经阅读了专门针对线程安全类中的发布字段的部分。 是的,我仍然会问一个关于Java的并发问题,不管我知道有人会简单地指出我那本书。 这让我很难过 – 我知道你可以通过确保具有易变性和/或同步访问的正确读/写命令,以线程安全的方式轻松发布可变原语字段,并且64位原语需要具有primefaces访问权限由于其读/写操作缺乏primefaces性。 我知道在需要在类的字段的特定“快照”上执行的代码块上使用锁。 我完全知道像AtomicLong 等好东西的原子包。 但是我仍然对将非线程安全对象作为线程安全类中的字段发布感到困惑。 从我所看到的,只要你在getter中返回对它的引用,你就可以在任何时候对调用者提供前所未有的对象内容访问权限。 此外,如果你给一个setter,你允许他们将对象引用设置为一个对象,他们可以在他们使用setter的对象之外控制它们。 无论如何我无法解决从非线程安全对象组成线程安全类而不使它们全部私有/受保护并在类中为所有非线程安全对象的所有方法创建线程安全包装器方法让该类的用户可能想要使用。 这听起来像是一个样板噩梦。 我的意思是,如果你将一个AtomicReference 返回给getter中的对象,他们可以使用.get()再次获得对它的非同步访问。 我考虑的另一种方法是让所有getter基于旧的获取非线程安全对象的新副本,这意味着修改将是无关紧要的,同样适用于setter。 但是Java有一个无可救药的复杂系统来克隆对象(浅拷贝与深拷贝和特定拷贝等),这有点让我无法做到这一点。 而且,这是非常低效的,它不会比使用像Clojure那样为不变性设计的语言更快。 事实上,考虑到这些语言允许多条不可变数据在幕后共享相同的数据,它可能会慢得多。 那么,如何以可行的方式编写已发布的非线程安全对象的线程安全类? 提前致谢。

Java GC:推广的顶级对象类(按大小)?

在每次年轻的GC活动结束后,请让我知道确定促进老一代年轻一代记忆构成的最佳方法是什么? 理想情况下,我想知道负责的class级名称,每个“年轻一代 – >老一代”推广块的80%的堆; 例如:我有600M年轻人,每个任期晋升6M; 我想知道哪些对象构成了这个6M。 谢谢。

如何遍历所有组合,例如48选择5

可能重复: 如何从java中的一组大小n迭代生成k个元素子集? 我想建立自己的扑克手评估员,但我遇到了特定部分的问题。 如果两名牌手获得两张牌,那么将会有48张牌。 在Texas Hold’em中,再发出5张可能的社区牌(这称为牌局)。 我想枚举/循环所有48个选择5个可能的棋盘组合,并计算玩家A获胜的时间和玩家B获胜的时间以及他们并列的时间。 我不确定如何系统地遍历每5张卡组合。 有没有人有任何想法? 这些卡表示为类卡的数组,但如果它使它更快,我也可以将它们表示为bitset。 我是用Java做的。 非常感谢

inheritance,组合和默认方法

通常承认通过inheritance扩展接口的实现不是最佳实践,并且该组合(例如,从头开始再次实现接口)更加可维护。 这是有效的,因为接口契约强制用户实现所有所需的function。 但是在java 8中,默认方法提供了一些可以“手动”覆盖的默认行为。 请考虑以下示例:我想设计一个用户数据库,该数据库必须具有List的function。 出于效率目的,我选择通过ArrayList来支持它。 public class UserDatabase extends ArrayList{} 这通常不被认为是一种很好的做法,如果实际上希望列表具有完整的function并遵循通常的“合成而不是inheritance”的座右铭,那么人们更愿意: public class UserDatabase implements List{ //implementation here, using an ArrayList type field, or decorator pattern, etc. } 但是,如果不注意,则不需要覆盖某些方法,例如spliterator(),因为它们是List接口的默认方法。 问题是,List的spliterator()方法执行得比ArrayList的spliterator()方法差得多,后者已针对ArrayList的特定结构进行了优化。 这迫使开发人员 请注意,ArrayList有自己的,更有效的spliterator()实现,并手动覆盖他自己的List实现的spliterator()方法或者 使用默认方法会失去大量性能。 所以问题是:在这种情况下,人们应该更喜欢构成而不是inheritance吗?

所有可能的n组合

我有n套。 每个集合都有不同数量的元素。 我想写一个算法,它给出了所有可能的组合。 例如:让我们说: S1={1,2}, S2={A,B,C}, S3={$,%,£,!} 组合看起来应该是这样的 C1={1,A,$} C2={1,A,%} ……等可能组合的数量将是2*3*4 = 24 请帮我用Java编写这个算法。 提前谢谢了

生成字符串的所有组合的算法

我在网上找到了一个链接,显示了生成字符串所有组合的算法: http : //www.mytechinterviews.com/combinations-of-a-string 算法复制如下。 void combine(String instr, StringBuffer outstr, int index) { for (int i = index; i < instr.length(); i++) { outstr.append(instr.charAt(i)); System.out.println(outstr); combine(instr, outstr, i + 1); outstr.deleteCharAt(outstr.length() – 1); } } combine("abc", new StringBuffer(), 0); 我不明白的是这条线: outstr.deleteCharAt(outstr.length() – 1); 如果我删除这一行,该程序显然不再起作用,但为什么首先需要它? 我理解递归的想法,我们改变一个初始字符并递归剩余的字符,但deleteChar行似乎在逻辑上不适合任何地方。 添加outstr.deleteCharAt行的原因是什么?

智能方式生成排列和String的组合

String database[] = {‘a’, ‘b’, ‘c’}; 我想基于给定的database生成以下字符串序列。 a b c aa ab ac ba bb bc ca cb cc aaa … 我只能想到一个非常“虚拟”的解决方案。 public class JavaApplication21 { /** * @param args the command line arguments */ public static void main(String[] args) { char[] database = {‘a’, ‘b’, ‘c’}; String query = “a”; StringBuilder query_sb = new […]

内部类是否在java中作为组合关系工作?

内部类总是在外部类中,如果我们删除外部类,那么内部类也将被销毁。 我不考虑内存释放,我只考虑这个概念。 这是关于构图的相同概念。 然后内部类必须是现实世界中对象的组合关系的例子。 简而言之,我想将内部类的概念与现实世界的面向对象联系起来。 我认为构造函数是组合的好例子,那么在Object Orientation中涉及内部类的基本需求是什么。 我对内心阶级有所了解,但有很多模糊性。 例如 大学是外课。 教师是内在阶级。 我确实理解面向对象,但我发现很难将内部阶级与现实世界联系起来。 你能给我一些指示吗?

给定一串整数,找出可以按连续顺序排列的所有可能的单词。

给定一串整数如何找出可以按连续顺序从中产生的所有可能的单词。 例如:11112 ans:AAAAB AKAB AAKB AAAL等 public static void main(String[] args) { String str=”11111124″; char strChar[]=str.toCharArray(); String target=””; for(int i=0;i<strChar.length;i++) { target=target+(char)Integer.parseInt(""+(16+strChar[i])); } System.out.println(target); } 我试图找到解决方案,但无法找到所有组合

在Java中实现选择表示法的好方法是什么?

…最好是用Java。 这是我有的: //x choose y public static double choose(int x, int y) { if (y x) return 0; if (y == 0 || y == x) return 1; double answer = 1; for (int i = x-y+1; i 1; j–) { answer = answer / j; } return answer; } 我想知道是否有更好的方法吗?