jjzjj

java - Java 的位移运算符在底层是如何工作的?

我没有学习IT,直到最近才遇到bitshifts和two'scomplement的申请.那么,您能否在解释中使用简单的英语并假设我对IP地址、位操作和Java数据类型几乎一无所知?今天,我找到了如下一段代码(略):longm=(-1)现在,这是用于IP子网掩码。我知道我需要从4个8位block(即4个字节)开始,并且所有位都必须“打开”:,在本例中为16位;所以我们得到1111111111111111000000000000000,掩码。但是我有几个问题:16是否必须是byte类型才能工作?结果是long类型。当上面的表达式运行时,-1被有效地转换为4x8位block。在应用二进制补码

Java - 获取泛型对象作为 String 泛型类型抛出异常

publicclassBox{privateTelement;publicTgetElement(){returnelement;}publicvoidsetElement(Telement){this.element=element;}}publicclassTest{publicstaticvoidmain(String[]args){Listl=newArrayList();//JustListofBoxwithnospecifictypeBoxbox1=newBox();box1.setElement("aa");Boxbox2=newBox();box2.setElement

java - Java 中的子上下文在堆栈中是单独的行吗?

在Java中是这样的:publicvoidmethod(){if(condition){Objectx=....;}System.out.println(x);//Error:xunavailable}我想知道的是:x仅限于if语句的范围这一事实只是Java编译器的一个特性,还是x实际上在if语句之后从堆栈中删除了? 最佳答案 不,代码块没有单独的堆栈框架,使用周围方法之一。但是,一旦变量离开作用域,它在当前堆栈帧中的位置就可以重新用于其他变量。栈帧的结构和使用在JavaVirtualMachineSpecification§3.6

java - 同步块(synchronized block)中的意外代码

以下Java代码生成以下JVM字节码。我很好奇为什么会生成偏移量31到偏移量36的代码。JLS7或JVM7规范中没有任何内容谈到这一点。我错过了什么吗?即使我删除了println语句,代码(偏移量31到偏移量36)仍然会生成,只是在较早的位置,因为println调用已被删除。//JavacodevoidtestMonitor(){Booleanx=newBoolean(false);synchronized(x){System.out.println("insidesynchronized");System.out.println("blah");};System.out.printl

java - 为什么 Eclipse 会编译它,而 javac 不会?

我们有一些单元测试可以在Eclipse3.4中正常编译和运行,但是当我们尝试使用javac编译它们时,它会失败。我已经设法将代码缩减为一些小而独立的代码,因此它没有外部依赖性。代码本身没有多大意义,因为它完全脱离了上下文,但这并不重要——我只需要找出为什么javac不喜欢这样:publicclassTest{publicvoidtest(){matchOn(someMatcher().with(anotherMatcher()));}voidmatchOn(SubMatchermatcher){}SubMatchersomeMatcher(){returnnewSubMatcher()

java - 在Java中,为什么我不能写i++++或(i++)++?

当我尝试在/减量中写入后缀/前缀,然后在/减量中写入后缀/前缀时,出现以下错误:Invalidargumenttooperation++/--。但是,根据JLS的说法:PostIncrementExpression:PostfixExpression++和PostfixExpression:PrimaryExpressionNamePostIncrementExpressionPostDecrementExpression这样写:PostfixExpression++++应该是可能的......有什么想法吗? 最佳答案 请注意,原始

java - JLS 是否允许此指令重新排序?

根据Java语言规范(Example17.4-1),以下代码段(从A==B==0开始)...Thread1Thread2----------------r2=A;r1=B;B=1;A=2;...可能导致r2==2和r1==1。这是因为B=1;的执行结果不依赖于r2=A是否执行过,因此JVM可以自由调换执行这两条指令。换句话说,规范允许以下交错:Thread1Thread2----------------B=1;r1=B;A=2;r2=A;这显然导致r2==1和r1==1。我的问题:假设我们稍微调整一下示例:Thread1Thread2----------------r2=A;r1=B;

java - 删除 final 关键字如何改变程序的行为方式?

这个问题主要不是关于字符串。出于学术好奇,我想知道变量上的final修饰符如何改变程序的行为。以下示例表明这是可能的。这些行打印truefinalStringx="x";System.out.println(x+x=="xx");但是这些行打印falseStringx="x";System.out.println(x+x=="xx");除了String实习之外,如果从变量声明中删除修饰符final,是否还有任何其他因素会导致程序的行为发生变化?我假设程序编译时使用或不使用修饰符。请不要投票将其作为Comparingstringswith==whicharedeclaredfinalin

java - 简单名称和限定名称

我正在阅读JLS8andinChapter6写成:AqualifiednameN.xmaybeusedtorefertoamemberofapackageorreferencetype,whereNisasimpleorqualifiednameandxisanidentifier.IfNnamesapackage,thenxisamemberofthatpackage,whichiseitheraclassorinterfacetypeorasubpackage.IfNnamesareferencetypeoravariableofareferencetype,thenxnamesa

java - Java内存模型中具有数据竞争的正确同步程序的示例

在JLS,§17.4.5.Happens-beforeOrder中,它说Aprogramiscorrectlysynchronizedifandonlyifallsequentiallyconsistentexecutionsarefreeofdataraces.根据Doesacorrectlysynchronizedprogramstillallowdatarace?(PartI)中的讨论,我们得出以下结论:Aprogramcanbecorrectlysynchronizedandhavedataraces.两个结论的组合意味着它必须存在这样的示例:Allsequentiallyco