草庐IT

java - 总是使用 get 和 set 方法来访问类自己的成员字段是否属于反模式?

这个问题在这里已经有了答案:Usinggetterswithinclassmethods(6个答案)关闭9年前。在Java类中,使用getter和setter访问成员字段被认为是好习惯还是坏习惯?例如哪个更好:publicOrder{privateAgreementagreement;publicAgreementgetAgreement(){returnagreement;}publicvoidprocess(){//shouldIuse:getAgreement().doSomething();//Or:agreement.doSomething();}}一般来说,由于KISS原则

java - 如何根据条目集过滤 map 条目

我正在使用googleguava12并有一张map:MaproomPrice;我有一套:Setpolicy;如何根据policy过滤roomPricemap中的条目并返回过滤后的map?filteredMap需要拥有来自policy的所有值。如果roomPricemap没有政策条目,我想改为输入默认值。 最佳答案 因为你有一组键,你应该使用Maps.filterkeys(),Guava还提供了一组非常好的谓词,您可以开箱即用。在您的情况下,类似于Predicates.in()应该可以。所以基本上你最终会得到:MapfilteredM

Java - 使对象集合友好

如果一个对象拥有唯一的主键,它需要实现哪些接口(interface)才能对集合友好,尤其是在高效排序、可散列等方面...?如果主键是一个字符串,这些接口(interface)如何最好地实现?谢谢! 最佳答案 您必须覆盖Object.equals()和Object.hashCode(),并且还要实现Comparable接口(interface)。这将使您的类在进行任何类型的排序或散列时完全“兼容”,包括使用Collections.sort()、任何Map类或任何Set类。如果该类被放入某种集合中的可能性很小,那么它绝对应该实现所有这三

java - String get/set 是线程安全的吗?

假设我有以下内容,publicclassFoo{privateStringbar;publicStringgetBar(){returnbar;}publicvoidsetBar(Stringbar){this.bar=bar;}}由于String类的不可变特性,这些方法是否自动线程安全,或者是否需要某种锁定机制? 最佳答案 不,这不是线程安全的。Foo是可变的,所以如果你想确保不同的线程看到相同的值bar–即一致性–或者:制作barvolatile,或制作方法synchronized,或使用AtomicReference.bar的

java - 在重新添加之前立即从 HashSet 中删除元素的可能原因是什么?

我偶然发现了一些大致遵循以下几行的代码,但我终究无法理解为什么作者试图从bars中删除bar在添加之前:importjava.util.Set;importjava.util.HashSet;classFoo{privatefinalSetbars=newHashSet();publicvoidaddBar(finalObjectbar){bars.remove(bar);//WHY????bars.add(bar);}publicObject[]getBars(){returnbars.toArray(newObject[0]);}}我能想到的是,它是在预期(或遗留)一个对插入顺序敏

JAVA 从多个 (UDP) 中设置/选择特定 NIC

我正在尝试在JAVA中发送带有数据报的UDP,我的机器有多个具有不同IP的NIC。如何设置要从哪个NIC发送数据包??(假设我的机器上有不止一个??)编辑我我没有使用Socket,我使用的是DatagramSocket并尝试像这样进行绑定(bind):/*binding*/DatagramSocketds=newDatagramSocket(1111);NetworkInterfacenif=NetworkInterface.getByIndex(nicIndex);EnumerationnifAddresses=nif.getInetAddresses();ds.bind(newIn

java - 如何从 Set<Integer> 创建 IntStream?

我目前这样做:Setintegers=...//sourcedfromelsewhereincodeIntStreamintStream=integers.stream().mapToInt(value->value);必须将值映射到值以转换Stream似乎是多余的至IntStream.有没有办法在没有冗余的情况下做到这一点mapToInt(...)部分? 最佳答案 不,你必须使用.mapToInt(value->value)或者(对我来说更好看).mapToInt(Integer::intValue).作为Stream是通用类,它

java - 为 Set<Integer> 的类似 BitSet 的实现有效地计算 hashCode

我想知道如何有效地计算hashCode对于BitSet类似Set的实现.BitSet#hashCode显然计算速度很快,相当愚蠢(*)并且与Set#hashCode()不兼容.快速兼容的实现可能是这样的inthashCode(){intresult=0;for(inti=0;i如果有一个有效的实现intweightedBitCount(longword){//naiveimplementationintresult=0;for(inti=0;i如果大多数位未设置,可以通过测试word==0来改进简单的实现或使用Long.highestOneBit或类似的东西,但这些技巧在其他情况下没有

java - Java中,在Map中使用Set作为key有什么注意事项?

我不确定关于在map中使用动态对象(例如集合)作为键的主流观点是什么。我知道典型的Map实现(例如HashMap)使用哈希码来决定将条目放入哪个桶中,并且如果该哈希码以某种方式发生变化(可能是因为Set的内容应该发生变化),那么这可能会导致桶被错误计算,从而弄乱HashMap(与Set最初插入HashMap的方式相比)。但是,如果我确保Set的内容完全不变,这是否是一个可行的选择?即便如此,由于Set固有的易变性(即使采取预防措施确保它们不被修改),这种方法是否通常被认为容易出错?看起来Java允许将函数参数指定为最终参数;这也许是可以采取的一个小预防措施?人们甚至在商业/开源实践中做

java - 如何获取集合的第n个元素

更具体地说:如何获得LinkedHashSet的第n个元素(它有一个可预测的迭代顺序)?我想检索插入到此Set中的第n个元素(尚未存在)。使用List是否更好:Listlist=newArrayList(mySet);Tvalue=list.get(x);//x或toArray(T[]a)方法:T[]array=mySet.toArray(newT[mySet.size()]);Tvalue=array[y];//y除了(可能是轻微的)性能差异外,还有什么需要注意的吗?有明显的赢家吗?编辑1注意:为什么我想要最后插入的元素并不重要,重要的是我想要它。LinkedHashSet之所以被特