我一直在使用JShell来测试它,今天我遇到了相当有趣的行为.
jshell> String a = "A"
a ==> "A"
jshell> String b = "A"
b ==> "A"
jshell> a == b
$4 ==> true
jshell> "A" == "A"
$5 ==> true
Run Code Online (Sandbox Code Playgroud)
我首先想知道这是否是Java 9的一个功能,我通过使用Java 9编译和运行该程序来检查它
public class Equus {
public static void main(String... args) {
String a = "A";
String b = "A";
System.out.println("a == b");
System.out.println(a == b);
System.out.println("\"A\" == \"A\"");
System.out.println("A" == "A");
}
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,我得到了
Run Code Online (Sandbox Code Playgroud)a == b true "A" == "A" true
作为我的输出也是如此.这里发生了什么?为什么a和b彼此相等,为什么是 …
使用 java 9 模块,如果我在我的代码中使用 java.xml...
1) 我将使用 import 语句导入 xml 包...
2) 如果我没有提到在模块声明中需要这个包我的模块...
-我的模块的编译会起作用吗.. ??
我猜......不......并且提到module-info.java上需要xml包......它可能会起作用。
所以......我想知道的是......这不是冗余......每个导入包都是隐含......必需的。(除非我需要更好地理解模块)
有没有办法提到模块声明中需要所有导入的包,否则在module-info.java中可能会提到一个很长的列表?
该分离出的最初的问题,我有,假设这是通用就够了。在使用工件之前,如何检查它是否是多版本的jar。
Multi-Release: true
Run Code Online (Sandbox Code Playgroud)
我知道它可以手动寻找到MANIFEST.MF内META-INF的罐子上面的属性,但有一个命令行选项可用于此?
也许我错过了一些已经存在的其他名称,或者对非常明显的东西视而不见。但是我试图寻找这样的选项jar和
java工具,但也没有成功。
我现在的Eclipse是Oxygen.2 Release(4.7.2),还有Java 9.0.1.基本上Java 9工作,特别是自动导入工作(对于"普通"类和包),但自动导入(和自动完成)不起作用javafx.*.如果我手动输入import java并按Ctrl+ Space,则弹出匹配包列表,我可以看到javafx.*层次结构.但是当我输入eg import javafx.stage并按Ctrl+时Space它会自动添加.*;并且不会显示包中的任何类.当我Stage在方法体中的某处键入并按Ctrl+时Space,没有任何建议.但是,当我键入添加导入(如import javafx.stage.Stage)时,代码编译并运行.
任何线索如何修复自动完成和自动导入功能(正如我所说,适用于其他类,例如java.time.LocalDateTime或许多其他类).
我正在执行下面的代码片段
System.out.println(List.of(1, 2).getClass());
System.out.println(List.of(1, 2, 3).getClass());
Run Code Online (Sandbox Code Playgroud)
这段代码的输出是;
class java.util.ImmutableCollections$List2
class java.util.ImmutableCollections$ListN
Run Code Online (Sandbox Code Playgroud)
我期待java.util.ImmutableCollections$List3作为第二个语句的输出,因为有一个of()方法需要三个参数,为什么java创建ImmutableCollections$ListN但不是ImmutableCollections$List3?
编辑:这是Java-9问题.在List接口中总共有11个重载的()方法,每个方法从0到10采用可变数量的参数,第11个采用varargs来处理N列表.所以我期待前10个重载方法的List0到List10实现,但它返回带有三个参数的ListN.是的,这是实施细节,但只是想了解更多相关信息.
Java 9+工具用于从模块路径上的非模块化jar的名称自动派生模块名称的算法是什么?
我将我的项目使用的SDK升级到Java 10.以下import语句导致错误:
import javax.annotation.PostConstruct;
包'javax.annotation'在模块'java.xml.ws.annotation'中声明,但模块'application'不读取它
点击ALT + ENTER让Intellij修复它,我收到了以下选项:
我选择Add Maven Dependency...了以下依赖项添加到pom.xml中.
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
看着新添加的JAR的MANIFEST.MF,我注意到模块的名称是java.annotation.
所以我添加requires java.annotation到module-info.java.
module application {
requires java.annotation;
}
Run Code Online (Sandbox Code Playgroud)
当我按CTRL +点击时requires java.annotation:
Intellij正确导航到JAR:
所以看起来我的模块名称正确并且javax.annotation:javax.annotation-api我的模块可以使用.不幸的是,错误import javax.annotation.PostConstruct并没有消失.为了确认我的模块描述符是否正常工作,我添加了其他指令,并且一切正常.我还添加了指令requires java.xml.ws.annotation,
这导致import语句错误消失但当然,这不是一个令人满意的解决方案,因为java.xml.ws.annotation已被弃用并标记为要删除.
有关如何解决此问题的任何想法?我需要能够将模块java.annotation提供给模块,application并且从我在这里和这里以及此处和此处阅读的方法来实现它是通过向模块路径添加JAR,以及我在这里阅读的新内容必须通过module-info.java中的指令引用添加的模块.
java module intellij-idea java-platform-module-system java-9
一个字节不能容纳来自世界上各种语言的字符的 unicode。所以使用字节数组我们不能有不同语言的字符串。为什么这些类使用字节数组而不是字符数组?
更新:
class First
{
public static void main(String[] args)
{
System.out.println();
String s = "\u0935\u0902\u0926\u0947 \u092e\u093e\u0924\u0930\u092e\u094d";
String s1 = "???? ??????";
System.out.println(sb);
System.out.println(sb1);
}
}
Run Code Online (Sandbox Code Playgroud)
我认为上面的字符串每个字符需要两个字节。它们如何可以容纳在一个字节中?
在过去的两天内,我一直在阅读有关编码Unicode Java 9紧凑型字符串的知识,我的情况还不错。但是有些我不明白。
关于字节数据类型
1)。是8位存储范围从-128到127
问题
1)。为什么Java没有像char unsigned 16 bits那样实现它?我的意思是它将在0.256的范围内,因为从0到127仅可以保存一个Ascii值,但是如果我将值设置为200,扩展的ascii将会溢出到-56会发生什么。
2)。负值是否表示我在用Java 11尝试过一个简单示例的意思?
final char value = (char)200;//in byte would overflow
final String stringValue = new String(new char[]{value});
System.out.println(stringValue);//THE SAME VALUE OF JAVA 8
Run Code Online (Sandbox Code Playgroud)
我检查了String.value变量,然后看到一个字节数组
System.out.println(value[0]);//-56
Run Code Online (Sandbox Code Playgroud)
像以前一样出现相同的问题,-56是否表示我检测到该溢出的其他语言中的(负值),则返回值200?Java如何知道-56的值与char中的200相同。
我尝试了最困难的示例,如代码点128048,并且在String.value变量中看到了这样的字节数组。
0 = 61
1 = -40
2 = 48
3 = -36
Run Code Online (Sandbox Code Playgroud)
我知道此代码点需要4个字节,但我知道如何将char []转换为byte [],但我不知道String如何处理此byte []数据。
很抱歉,这个问题很简单,很抱歉,任何键入英语都不是我的自然语言,非常感谢。
我正在尝试使用 Java 9 的 Stackwalking API 并注意到收集的帧少于实际堆栈跟踪给出的帧。我想知道是否有可能获得相同数量的帧和元素?
看看下面的测试:
@Test
public void test() {
NaughtyBusiness nb = new NaughtyBusiness();
try {
//This method throws an exception
nb.callMeForGoodTime(NaughtyBusiness.AlcoholTolerance.LOW);
} catch (Exception e) {
StackTraceElement[] stackTrace = e.getStackTrace();
StackWalker stackWalker = StackWalker.getInstance(StackWalker.Option.SHOW_HIDDEN_FRAMES);
List<StackWalker.StackFrame> frames =
stackWalker.walk(stackFrameStream -> stackFrameStream.collect(toList()));
System.out.println(frames);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,如果我调试代码,我会看到以下内容:
第一个明显的区别是 StacktraceElements 与 StackFrames 的数量(26 对 23)。但更令人惊讶的是,丢失的帧(用红色标记)是真正有趣的帧,即来自我的自定义代码,而两者共享的绿色部分只是样板。
因此,问题是,如何使用 StackWalking API 获取“丢失”的帧?我已经尝试了3个选项SHOW_HIDDEN_FRAMES,RETAIN_CLASS_REFERENCE并SHOW_REFLECT_FRAMES但没有奏效。
java ×10
java-9 ×10
java-module ×3
java-platform-module-system ×2
string ×2
ascii ×1
collections ×1
eclipse ×1
jar ×1
javafx ×1
javafx-9 ×1
jshell ×1
manifest ×1
module ×1
stack-trace ×1
stringbuffer ×1