我知道,如果你将盒装原始Integer与常量进行比较,例如:
Integer a = 4;
if (a < 5)
Run Code Online (Sandbox Code Playgroud)
a
将自动取消装箱,比较将起作用.
但是,当您比较两个盒装Integers
并希望比较相等或小于/大于?时会发生什么?
Integer a = 4;
Integer b = 5;
if (a == b)
Run Code Online (Sandbox Code Playgroud)
以上代码是否会导致检查它们是否是同一个对象,还是会在这种情况下自动取消装箱?
关于什么:
Integer a = 4;
Integer b = 5;
if (a < b)
Run Code Online (Sandbox Code Playgroud)
?
为什么Java API会使用int
,何时short
甚至byte
是足够的?
示例:DAY_OF_WEEK
类中的字段Calendar
使用int
.
如果差异太小,那么为什么存在这些数据类型(short
,int
)?
通常要将debuger附加到正在运行的jvm,您需要使用如下参数启动jvm:
> java -Xdebug -Xrunjdwp:transport=dt_socket,address=1000,server=y,suspend=n
Run Code Online (Sandbox Code Playgroud)
现在,如果我想调试未在调试模式下启动的进程,我该怎么办?
当生产系统(即没有调试args启动)表现出"随机"(我使用松散术语)错误时,就会出现这种情况.所以我不能用适当的参数重启jvm,因为没有人知道如何再次重现bug.在这种情况下是否无法连接到JVM?
只是为了澄清它是不可能使用像jdb这样的工具连接到已经运行的JVM,除非它们是在调试模式下启动的
来自JVM手册页
使用jdb的另一种方法是将其附加到已经运行的Java VM.必须使用以下选项启动要使用jdb调试的VM:
我读了一些关于如何使用log4j的文章.他们中的大多数都将以下代码作为开头:
Logger logger = Logger.getLogger("com.foo.Bar");
Run Code Online (Sandbox Code Playgroud)
要么
Logger logger = Logger.getLogger(XXX.class);
Run Code Online (Sandbox Code Playgroud)
这将初始化记录器对象.但我的问题是为什么需要将类类型作为参数发送?看来当我使用记录器时,我并不关心我在哪个类中使用它.所以Class类型似乎对记录器没有影响.如果我将一个logger声明为static和public,我可以在另一个类中调用这个logger,那么作者有意这样设计它吗?当我使用记录器时,Class类型会绑定一些东西吗?或者我可以将任何类类型发送到getLogger函数.
我正在尝试确定以下语句是否保证是真的:
((Boolean)true) == Boolean.TRUE
((Boolean)true) == Boolean.valueOf(true)
((Integer)1) == Integer.valueOf(1)
Run Code Online (Sandbox Code Playgroud)
我一直认为自动装箱相当于调用valueOf()
相应的类型.我在这个主题上看到的每一个讨论似乎都支持我的假设.但我在JLS中找到的只有以下内容(§5.1.7):
如果该值
p
被装箱是整数文本类型的int
之间-128
和127
包容性(§3.10.1)或布尔值true
或false
(§3.10.3),或字符之间文字'\u0000'
和'\u007f'
包容性(§3.10.4),然后让a
与b
是任何两个拳击转换的结果p
.情况总是如此a == b
.
这描述的行为与*相似valueOf()
.但似乎没有任何valueOf()
实际调用的保证,这意味着理论上可以有一个实现为自动装箱值保留一个单独的专用缓存.在这种情况下,缓存的自动装箱值与常规缓存的装箱值之间可能不存在标识相同性.
Oracle的自动装箱教程说明了li.add(i)
编译到的事实li.add(Integer.valueOf(i))
,其中i
是一个int
.但我不知道该教程是否应被视为权威来源.
*这是一个稍微弱一点的保证valueOf()
,因为它只是指字面值.
将String拆分为Stream 的最佳方法是什么?
我看到了这些变化:
Arrays.stream("b,l,a".split(","))
Stream.of("b,l,a".split(","))
Pattern.compile(",").splitAsStream("b,l,a")
我的优先事项是:
一个完整的,可编译的例子:
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class HelloWorld {
public static void main(String[] args) {
stream1().forEach(System.out::println);
stream2().forEach(System.out::println);
stream3().forEach(System.out::println);
}
private static Stream<String> stream1() {
return Arrays.stream("b,l,a".split(","));
}
private static Stream<String> stream2() {
return Stream.of("b,l,a".split(","));
}
private static Stream<String> stream3() {
return Pattern.compile(",").splitAsStream("b,l,a");
}
}
Run Code Online (Sandbox Code Playgroud) 最近我搜索了一种初始化复杂对象的方法,而没有将大量参数传递给构造函数.我尝试使用构建器模式,但我不喜欢这样的事实,即如果我确实设置了所有需要的值,我无法在编译时检查.
当我使用构建器模式创建我的Complex
对象时,创建更"类型安全",因为它更容易看到用于什么参数:
new ComplexBuilder()
.setFirst( "first" )
.setSecond( "second" )
.setThird( "third" )
...
.build();
Run Code Online (Sandbox Code Playgroud)
但现在我遇到了问题,我很容易错过一个重要的参数.我可以在build()
方法中检查它,但这只是在运行时.如果我错过了什么,在编译时没有什么可以警告我.
现在我的想法是创建一个构建器,"提醒"我是否错过了所需的参数.我的第一次尝试看起来像这样:
public class Complex {
private String m_first;
private String m_second;
private String m_third;
private Complex() {}
public static class ComplexBuilder {
private Complex m_complex;
public ComplexBuilder() {
m_complex = new Complex();
}
public Builder2 setFirst( String first ) {
m_complex.m_first = first;
return new Builder2();
}
public class Builder2 {
private Builder2() {}
Builder3 setSecond( String …
Run Code Online (Sandbox Code Playgroud) 我在我的Windows 7(32位)中安装了gpp,如图所示.
PATH变量气体g ++
"%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\cygnus\cygwin-b20\H-i586-cygwin32\bin\g++"
Run Code Online (Sandbox Code Playgroud)
还是eclipse显示错误:
"程序"g ++"在PATH中找不到".
怎么解决这个问题?
我必须向网站的所有用户发送massEmails.我想为发出的每封电子邮件使用一个线程池.目前我已将值设置为:
<property name="corePoolSize" value="500" />
<property name="maxPoolSize" value="1000" />
Run Code Online (Sandbox Code Playgroud)
两者之间有什么区别,它会扩展吗?目前我有约.10000个用户.