小编Bha*_*kar的帖子

Java不可变集合

Java 1.6 Collection Framework文档:

不支持任何修改操作(例如add,removeclear)的集合称为不可修改.[...]另外保证Collection对象中的任何更改都不可见的集合称为不可变.

第二个标准让我感到困惑.鉴于第一个集合是不可修改的,并假设原始集合引用已被丢弃,第二行中引用的更改是什么?它是指集合中保存的元素的变化,即元素的状态?

第二个问题:
对于一个不可变的集合,如何提供额外的guarentees指定?如果一个线程更新了集合中元素的状态,那么在不可变集合的线程中,状态中的那些更新是不可见的,这对于不变性是否足够?

对于一个不可变的集合,如何提供额外的guarentees指定?

java collections immutability

108
推荐指数
5
解决办法
17万
查看次数

Java - 接口实现中的方法名称冲突

如果我有两个接口,两者的用途完全不同,但是使用相同的方法签名,我如何在不强制编写一个为两个接口服务的单个方法并在方法中编写一些复杂逻辑的情况下创建一个类.检查正在进行调用的对象类型并调用正确代码的实现?

在C#中,这被称为显式接口实现所克服.Java中有没有相同的方法?

java interface multiple-inheritance composition

87
推荐指数
3
解决办法
4万
查看次数

等价方法的传递性

equals(object)方法的契约指定了要遵循的4个属性:自反,对称,传递和一致.虽然我理解不遵循Reflexive,Symmetric和Consistent的危险,并且肯定会同意其传递的好处,但我想知道如果违反Transitive属性会带来什么伤害?

具体来说,哪个Java库(或各种第三方库)需要依赖equals才能传递才能正常工作?根据我的理解,如果其他3个属性得到很好的实现,Collections框架将会起作用.

java

32
推荐指数
2
解决办法
6254
查看次数

Java Web Service的C#客户端 - 数据互操作性问题

我有Java Web服务,一个Web方法的参数是自定义Java类型

public class KeyList {
public Integer key;
public Integer[] nums ;
public Integer result;
}
Run Code Online (Sandbox Code Playgroud)

Web服务更新Result值并将KeyList对象返回给客户端.

我有一个这个Web服务的C#客户端(通过添加服务引用并指向wsdl url在Visual Studio中生成).当我在C#中收到keyList对象时,第一部分(整数键)出现为0.如果我在KeyList类型中更改Java自定义类型以使用int键(而不是Integer Key),那么它对C#工作正常客户.

我想看看两种情况(使用int和Integer)wsdl是否完全不同,但事实证明唯一的区别是minOccurs属性.

使用Integer键时

<xs:element name="key" type="xs:int" minOccurs="0" /> 
Run Code Online (Sandbox Code Playgroud)

当使用int键时

<xs:element name="key" type="xs:int" /> 
Run Code Online (Sandbox Code Playgroud)

C#客户端在服务的返回值中没有正确接收更新的Integer的原因是什么?不用说,它适用于Java客户端.


编辑:VS为KeyList生成的C#类:

public class keyList:INotifyPropertyChanged {

private int keyField;
private bool keyFieldSpecified;

private int?[] numsField;
private PropertyChangedEventHandler PropertyChanged;
private int resultField;
private bool resultFieldSpecified;

public event PropertyChangedEventHandler PropertyChanged;

public keyList();
protected void RaisePropertyChanged(string propertyName);

[XmlElement(Form=XmlSchemaForm.Unqualified, Order=0)]
public int key { get; set; }
[XmlElement("nums", Form=XmlSchemaForm.Unqualified, IsNullable=true, …
Run Code Online (Sandbox Code Playgroud)

c# java web-services

9
推荐指数
1
解决办法
2056
查看次数

通配符号的主要用途或目的是什么?延伸T'

关于集合中使用的通用通配符,我有一些(反直觉的)观察.通配符表示法的目的List<? extends T>是允许将List(子类型为T)分配给List的引用?T'.它的目的不是要特别允许将T的子类型的元素添加到List('of of T')中,即使在a中也是如此List<T>.

    List<Number> list = new ArrayList<Integer>(); // invalid , List<Integer> is not assignable to List<Number>

    List<Number> list = new ArrayList<Number>() ; // OK

    list.add(new Integer(1)); // valid , '? extends Number' not needed!

    List<? extends Number> list1 = new ArrayList<Integer>();  // Valid , because of notation '? extends Number' 
Run Code Online (Sandbox Code Playgroud)

我的观察是否正确?

java generics

7
推荐指数
1
解决办法
698
查看次数

Java内存模型:编译器重新排列代码行

众所周知,只要重新排序对代码语义没有区别,Java语言允许编译器重新排列编译代码行.但是,编译器只需要打扰从当前线程看到的sematics .如果此重新排序影响多线程情况下的语义,则通常会导致并发问题(内存可见性)

我的问题:

  1. 通过将这个freedm允许编译器实现了什么?编译器是否真的可以通过重新排列代码来生成更高效的代码?我还没有看到一个实际案例.我觉得有时可以带来的好处远远超过这可能带来的并发风险.

  2. 程序员有没有办法告诉编译器不要重新排列这样的行?我知道使用同步原语有效地处理重新排列的副作用,但我问是否有任何直接的方法(编译器选项)来关闭它?

java memory memory-model

7
推荐指数
1
解决办法
637
查看次数

Java - 调用在线程上启动方法:它如何路由到Runnable接口的run()?

好的,我知道创建新线程并在Java中运行它的两种标准方法:

  1. Runnable在类中实现,定义run()方法,并将类的实例传递给新的Thread.当start()上线实例方法被调用时,类实例的run方法被调用.

  2. 让类派生自Thread,因此它可以覆盖该方法run(),然后在start()调用新实例的方法时,将调用路由到重写方法.

在这两种方法中,基本上Thread都会创建一个新对象并调用其start方法.但是,在第二种方法中,调用被路由到用户定义run()方法的机制非常清楚(这是一个简单的运行时多态性),我不明白如何调用start()Thread对象上的方法被路由到run()类实现Runnable接口的方法.Thread该类是否具有Runnable首先检查的类型的私有字段,如果已设置,则在设置为对象时调用run方法?这将是一个奇怪的机制IMO.

如何start()将线程上的调用路由到Runnable类的实现的接口的run方法,该类的对象在构造线程时作为参数传递?

java multithreading

6
推荐指数
1
解决办法
5631
查看次数

使字段"volatile"会阻止并发情况下的所有内存可见性问题吗?

制作类字段是否会在并发情况下volatile阻止所有内存可见性问题?是否有可能对于下面的类,获取Test对象引用的线程x首先看到0(默认值为int)然后是10?我认为这是可能的,当且仅当构造函数在没有完成(不正确的发布)的情况下Test放弃this引用.有人可以验证/纠正我吗?

class Test {
    volatile int x = 10;            
}
Run Code Online (Sandbox Code Playgroud)

第二个问题:如果是这样的话final int x=10;

java concurrency memory-model

6
推荐指数
1
解决办法
917
查看次数

jhat 抛出无法识别的魔法数字

我正在尝试分析从遇到内存问题的 java 进程中获取的堆转储。转储是使用 jmap 获取的。我在转储文件上使用 jhat - 我得到

java.io.IOException: Unrecognized magic number: 169897589 at com.sun.tools.hat.internal.parser.Reader.readFile(Reader.java:94) at com.sun.tools.hat.Main.main(Main.java:159)

jdk 1.6和1.7都给出相同的错误。我在 Windows 计算机上本地运行 jhat(将转储文件复制到 后),转储文件是在 Linux 服务器上获取的。

有什么想法我做错了吗?

java jhat jmap

6
推荐指数
1
解决办法
5440
查看次数

在C#中列出<T> .Distinct() - EqualityComparer的多个标准?

我有一组对象,每个对象都有几个属性.我经常需要获取此集合中许多属性的不同值列表.如果我在这种类型上实现IEqualityComparer,它给了我一个标准来获取集合中的不同对象.如何在此系列的多个条件上调用Distinct?

例如 ,

  class Product {
    string name ;
    string code ;
    string supplier ;
//etc 
}
Run Code Online (Sandbox Code Playgroud)

想象一下这样的产品对象列表.有时候,我希望在列表中获得不同名称的列表,并在某个时间列出不同供应商的列表.如果我在这些产品的列表上调用Distinct,基于IEqualityComparer的实现方式,它将始终使用相同的标准,这不符合我的目的.

c# list distinct

5
推荐指数
2
解决办法
2万
查看次数