它取决于值集的数量吗?它是否依赖于INSERT语句中的字节数?
我注意到了一些意想不到的行为(意外相对于我的个人期望),我想知道是否有什么东西,如果JVM中有一个错误,或者这可能是一个边缘情况,我不明白究竟是什么细节应该发生.假设我们在main方法中有以下代码:
int i;
int count = 0;
for(i=0; i < Integer.MAX_VALUE; i+=2){
count++;
}
System.out.println(i++);
Run Code Online (Sandbox Code Playgroud)
一个天真的期望是,这将打印Integer.MAX_VALUE-1
,最大甚至可表示int
.但是,我认为整数算术应该在Java中"翻转",因此Integer.MAX_VALUE
应该导致添加1 Integer.MIN_VALUE
.由于Integer.MIN_VALUE
仍然小于Integer.MAX_VALUE
,循环将继续迭代负甚至整数.最终它会回到0,这个过程应该重复为无限循环.
当我实际运行此代码时,我得到非确定性结果.打印的结果往往大约为50万,但确切的值会有所不同.因此,当我认为它应该是一个无限循环时,不仅循环终止,而且它似乎随机终止.这是怎么回事?
我的猜测是,这可能是JVM中的一个错误,或者正在进行大量的时髦优化,这会产生这种预期的行为.这是什么?
不止一次,我发现自己希望获得Java中不可能的可变可见性.我希望某些成员在他们自己的类和任何子类中都可见,但不是对包的其余部分或世界其他地方都可见.换句话说,我想要这个:
Modifier Class Package Subclass World
sub-class Y N Y N
Run Code Online (Sandbox Code Playgroud)
然而,Java的设计者只给了我这个:
Modifier Class Package Subclass World
public Y Y Y Y
protected Y Y Y N
no modifier Y Y N N
private Y N N N
Run Code Online (Sandbox Code Playgroud)
我想要这样的东西的典型情况是创建一个抽象类.有时候我发现抽象的父母需要访问某些成员,但具体的孩子也会这样做.我可以通过创建成员来为他们提供这种访问权限protected
,但是当我不想要时,这会打开对包的其余部分的可访问性.
要完全清楚,我知道Java中不可能有这样的修饰符.我的问题是为什么这样的修饰符不包含在Java中?似乎(对我而言)是一个比任何一个protected
或默认的更自然的可见性水平.原因是它的重要性不足以被纳入,还是与我未考虑的可能的副作用更相关?
我认为可以接受的是,作为Java中的一般规则(也许是任何具有异常处理的语言),应该尽量避免使用异常处理来实际处理业务逻辑.一般来说,如果预计会发生某种情况,那么应该检查它并直接处理它,而不是依赖于异常处理来为您进行检查.例如,以下不被视为良好做法:
try{
_map.put(myKey, myValue);
} catch(NullPointerException e){
_map = new HashMap<String, String>();
}
Run Code Online (Sandbox Code Playgroud)
相反,懒惰初始化应该更像这样:
if(_map == null){
_map = new HashMap<String, String>();
}
_map.put(myKey, myValue);
Run Code Online (Sandbox Code Playgroud)
当然,可能存在比简单处理延迟初始化更复杂的逻辑.因此,鉴于此类事情通常不受欢迎......如果有的话,依靠发生某种业务逻辑的异常是一个好主意吗?是否准确地说任何一个人感到被迫使用这种方法的实例是否真的突出了所使用的API的弱点?
可以-Xmx
在32位系统中设置的理论最大堆值当然是2^32
字节,但通常(请参阅:了解最大JVM堆大小 - 32位对64位),不能使用全部4GB.
对于在64位计算机上运行64位操作系统的64位JVM,除了理论上的2^64
字节限制或16艾字节外,还有其他限制吗?
我知道由于各种原因(主要是垃圾收集),过大的堆可能不明智,但鉴于阅读有关TB的TB的服务器,我想知道什么是可能的.
我知道这个问题的变种频繁之前(见已被要求在这里和这里的实例),但是这不是一个确切的重复.
我想检查a String
是否是数字,如果是,我想将其存储为double
.有几种方法可以做到这一点,但所有这些方法似乎都不适合我的目的.
一种解决方案是使用Double.parseDouble(s)
或类似new BigDecimal(s)
.但是,如果存在逗号,则这些解决方案不起作用(因此"1,234"会导致异常).我当然可以使用这些技术之前去掉所有的逗号,但这似乎不会造成在其他语言环境的问题负载.
我查看了Apache Commons NumberUtils.isNumber(s)
,但是它遇到了同样的逗号问题.
我认为NumberFormat
还是DecimalFormat
,但这些似乎过于宽松.例如,"1A"被格式化为"1"而不是表示它不是数字.此外,像"127.0.0.1"这样的东西将被计为数字127而不是表示它不是数字.
我觉得我的要求不是那么奇特,我是第一个这样做,但没有一个解决方案完全符合我的要求.我想即使我不确切知道我需要什么(否则我可以编写自己的解析器),但我知道上述解决方案因指示的原因不起作用.是否存在任何解决方案,或者我是否需要准确弄清楚我需要什么并为其编写自己的代码?
我记得最初发布Java 7时,有许多建议不要将它用于任何事情,因为编译器优化中存在一些错误.这显然不仅仅是假设的.从那以后,我没有密切关注这种情况; 是否已经解决了这些问题,通常认为此时使用是安全的?
来自java.com的这个页面让我觉得它还没有准备好,但我不想过多地阅读它.如果它还不安全,是否足以-XX:-UseLoopPredicate
用作VM参数?
请注意,我不仅指代特定的Lucene问题,还指Java 7的一般稳定性.Java 7是否至少与Java 6一样稳定?
我很清楚的合同需求,确保hashCode
与一致equals
,并且equals
与一致compareTo
.但是,这在实践中经常被违反.是否有可以自动测试此一致性的工具,技术或库?
我怀疑不幸的是答案是"不",但能够对这种可以利用库调用或框架的东西进行单元测试而不是需要手动编写自定义测试是有用的.每个重要的案例.
如果目前还不清楚我所说的一致意思是,hashCode
和equals
我指的是以下几点:
如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须生成相同的整数结果.
对于equals
和compareTo
我指的是以下几点:
当且仅当e1.compareTo(e2)== 0具有与c的每个e1和e2的e1.equals(e2)相同的布尔值时,C类的自然排序被认为与equals一致.
所以我知道IEEE 754为非实数的值指定了一些特殊的浮点值.在Java中,铸造这些值的原始int
不会不抛出异常像我本来期望.相反,我们有以下内容:
int n;
n = (int)Double.NaN; // n == 0
n = (int)Double.POSITIVE_INFINITY; // n == Integer.MAX_VALUE
n = (int)Double.NEGATIVE_INFINITY; // n == Integer.MIN_VALUE
Run Code Online (Sandbox Code Playgroud)
在这些情况下不抛出异常的理由是什么?这是IEEE标准,还是仅仅是Java设计者的选择?如果这种演员阵容有例外情况,我是否会发现不良后果?
我需要存储大量的日期(可能足够大,以至于所使用的堆空间量是一个问题所以请不要过早优化的讲座),我想知道使用某种原始表示是否有意义java.util.Date(或其他一些现有的Date类).我知道我可以做一些分析来尝试一下,但有没有人知道单个Date对象使用的内存有多少字节?
java ×9
jvm ×2
64-bit ×1
bigdecimal ×1
casting ×1
coding-style ×1
compareto ×1
date ×1
equals ×1
hashcode ×1
heap-memory ×1
ieee-754 ×1
java-7 ×1
jvm-hotspot ×1
memory ×1
mysql ×1
numbers ×1
unit-testing ×1
visibility ×1