我使用布尔数组作为HashMap的键.但问题是当一个不同的数组作为键传递时,HashMap无法获取键,尽管元素是相同的.(因为它们是不同的对象).
如何使用数组作为键?这是代码:
public class main {
public static HashMap<boolean[], Integer> h;
public static void main(String[] args){
boolean[] a = {false, false};
h = new HashMap<boolean[], Integer>();
h.put(a, 1);
if(h.containsKey(a)) System.out.println("Found a");
boolean[] t = {false, false};
if(h.containsKey(t)) System.out.println("Found t");
else System.out.println("Couldn't find t");
}
}
Run Code Online (Sandbox Code Playgroud)
无论是阵列a和t包含相同的元素,但HashMap的不返回任何东西t.
我如何使其工作?
JMM中的因果关系似乎是其中最令人困惑的部分.我有几个关于JMM因果关系的问题,并允许并发程序中的行为.
据我了解,目前的JMM总是禁止因果关系循环.(我对吗?)
现在,根据JSR-133文档,第24页,图16,我们有一个例子,其中:
原来 x = y = 0
线程1:
r3 = x;
if (r3 == 0)
x = 42;
r1 = x;
y = r1;
Run Code Online (Sandbox Code Playgroud)
线程2:
r2 = y;
x = r2;
Run Code Online (Sandbox Code Playgroud)
直觉上,r1 = r2 = r3 = 42似乎不可能.但是,它不仅被提及,而且在JMM中也被"允许".
对于这种可能性,我无法理解的文件中的解释是:
编译器可以确定分配给的唯一值
x是0和42.从那以后,编译器可以推断出,在我们执行的时候r1 = x,我们刚刚执行了42的写入x,或者我们刚刚读过x和看过价值42.在任何一种情况下,读取x价值42 是合法的.然后可以r1 = x改为r1 = 42; 这将允许y = r1转换为y = 42更早并执行,从而导致相关行为.在这种情况下,y首先提交写入.
我的问题是,它真的是什么样的编译器优化?(我是编译器无知的.)由于42只被写入有条件,当if …
java concurrency compiler-optimization causality java-memory-model
我有一个二进制整数的字符串表示,我需要具有精确位结构的字节,通过套接字发送.
例如,如果我有一个长度为16的字符串:0000111100001010那么我需要2个字节的相同位结构.在这种情况下,第一个字节应该是int值,15第二个字节应该是10.它们是否可以以ascii格式打印并不重要.我怎么得到它?
我尝试了以下方法,以形式创建字节0xf0xa.但这个大小为6个字节而不是2个字节.
def getByte(s):
if(len(s) != 8):
return
b = b'0'
for c in s:
b = (int(b) | int(c)) & 0x0000ff #This makes b an integer
b = b << 1
b = b >> 1 #because of 1 extra shift
b = hex(b).encode('utf-8') #how else can I get back to byte from int?
return(b)
Run Code Online (Sandbox Code Playgroud)
此方法采用长度为8的字符串,并打算提供相同内部位结构的字节,但失败.(我需要类似strtol的内容C.)
有什么帮助吗?
我有对象的LinkedList和迭代器.我知道当您尝试在运行迭代器时修改列表时会抛出此ConcurrentModificationException.但在我的情况下,我不明白这种修改在哪里.
迭代器看起来像这样:
private static void insertTasks(Task t) {
if(eventQueue.size() == 0) {
eventQueue.addFirst(tsk);
return;
}
int pos = 0;
while (itr.hasNext()){
//The line below throws the exception
if (t.getArrivalTime() <= itr.next().getArrivalTime() )
{
break;
}
pos++;
}
}
Run Code Online (Sandbox Code Playgroud)
我insertTasks从另一种方法调用此方法,如下所示:
tsk = null;
tsk = new Task(1,"P1",1,4.0f,1.5f,0.0f,8.0f);
insertTasks(tsk);
tsk = null;
tsk = new Task(0,"P0",2,5.0f,2.5f,1.0f,10.0f);
insertTasks(tsk);
Run Code Online (Sandbox Code Playgroud)
将getArrivalTime在Task对象的样子:
public float getArrivalTime() { return arrivalTime; }
Run Code Online (Sandbox Code Playgroud)
我的问题是,我在哪里做这个修改?while我运行它的循环iterator没有做任何修改.可以 ?
我错过了什么吗?
我想拥有一个Mapper同时包含create和update方法的类。为create方法生成的代码很好,但是在更新的情况下,仅当源中的属性不为null时,我才想在目标中设置属性。
我该怎么做mapStruct?
之所以会出现混乱,是因为nullValueMappingStrategy在Mapper或Mapping级别上定义。
如果我将该值设置为Mapper级别,它将应用于所有方法,包括创建和更新。
@Mapper // If I define null strategy here, it will be applied to all methods
public interface AmcPkgMapper {
AmcPkgMapper MAPPER = Mappers.getMapper(AmcPkgMapper.class);
AmcPackage create(AmcPackageRequest amcPackageRequest);
// How to define the null strategy here??
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackage amcPackage);
}
Run Code Online (Sandbox Code Playgroud)
并且,如果我使用将该方法设置为方法Mapping,则它希望我定义一个target对象,为此,我可能需要一个包装对象,并以某种方式映射其中的所有内部属性。
@Mapping(target = "amcPackage", nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
void update(AmcPackageRequest amcPackageRequest, @MappingTarget AmcPackageWrapper amcPackageWrapper);
Run Code Online (Sandbox Code Playgroud)
使用上述方法,生成的代码如下所示,该代码无需amcPackage …