Questions tagged «java»

Java是一种流行的高级编程语言。如果您在使用或理解语言本身时遇到问题,请使用此标签。这个标签很少单独使用,最常与[spring],[spring-boot],[jakarta-ee],[android],[javafx],[gradle]和[maven]结合使用。

24
为什么不能在Java接口中定义静态方法?
编辑: 从Java 8开始,接口中现在允许使用静态方法。 这是示例: public interface IXMLizable<T> { static T newInstanceFromXML(Element e); Element toXMLElement(); } 当然这行不通。但是为什么不呢? 可能的问题之一是,当您致电时会发生什么: IXMLizable.newInstanceFromXML(e); 在这种情况下,我认为它应该只调用一个空方法(即{})。所有子类都将被强制实现static方法,因此在调用static方法时它们都很好。那为什么不可能呢? 编辑:我想我正在寻找比“因为这就是Java的方式”更深的答案。 有某种特殊的技术原因为什么不能覆盖静态方法?也就是说,为什么Java的设计者决定使实例方法可重写而不是静态方法? 编辑:我的设计的问题是我试图使用接口来强制执行编码约定。 也就是说,该接口的目标是双重的: 我希望IXMLizable接口允许我将实现它的类转换为XML元素(使用多态性,效果很好)。 如果有人想创建实现IXMLizable接口的类的新实例,那么他们将始终知道将有一个newInstanceFromXML(Element e)静态构造函数。 除了在界面中添加注释之外,还有其他方法可以确保这一点吗?


18
异常对Java性能有什么影响?
问题:Java中的异常处理是否真的很慢? 常规知识以及许多Google的研究结果都表明,不应将异常逻辑用于Java中的常规程序流程。通常有两个原因, 它确实很慢-甚至比常规代码慢一个数量级(给出的原因各不相同), 和 这很混乱,因为人们希望仅在特殊代码中处理错误。 这个问题是关于#1的。 例如,此页面将Java异常处理描述为“非常慢”,并将这种缓慢与异常消息字符串的创建相关联-“然后,此字符串用于创建抛出的异常对象。这不是很快。” Java中的有效异常处理文章说:“其原因是由于异常处理的对象创建方面,因此使固有的异常抛出速度变慢”。另一个原因是堆栈跟踪生成会减慢堆栈跟踪的速度。 我的测试(在32位Linux上使用Java 1.6.0_07,Java HotSpot 10.0)表明异常处理并不比常规代码慢。我尝试在执行一些代码的循环中运行方法。在方法的最后,我使用一个布尔值来指示是返回还是throw。这样,实际处理是相同的。我尝试以不同的顺序运行这些方法并平均测试时间,以为可能是JVM升温。在我所有的测试中,投掷速度至少与返回速度一样快,甚至不快(高达3.1%)。我完全可以接受我的测试错误的可能性,但是我并没有看到代码样本,测试比较或最近一两年中显示Java异常处理的结果的任何方式慢。 导致我走这条路的是我需要使用的将异常作为常规控制逻辑一部分的API。我想更正它们的用法,但现在可能无法。我是否必须赞扬他们的前瞻性思维? 在《即时编译中的高效Java异常处理》一文中,作者建议即使没有抛出异常,仅存在异常处理程序也足以阻止JIT编译器正确优化代码,从而减慢速度。我还没有检验过这个理论。

24
如何在Java中实现树形数据结构?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题编辑此帖子。 2年前关闭。 是否有标准的Java库类来表示Java中的树? 具体来说,我需要代表以下内容: 任何节点上的子树可以具有任意数量的子代 每个节点(在根之后)及其子节点将具有字符串值 我需要获取给定节点的所有子节点(某种形式的列表或字符串数​​组)及其字符串值(即,将节点作为输入并返回所有子节点的字符串值作为输出的方法) 是否有任何可用的结构或者我需要创建自己的结构(如果这样的话,实施建议会很棒)。

13
哈希集与树集
我一直都喜欢树木,它们的优美O(n*log(n))和整洁。但是,我认识的每个软件工程师都曾明确地问过我为什么要使用TreeSet。从CS的背景出发,我认为您使用的所有内容都不重要,并且我也不在乎哈希函数和存储桶(对于Java)。 在哪种情况下,我应该使用HashSetover TreeSet?
495 java  hashset  treeset 

26
如何将浮点数很好地格式化为String而没有不必要的十进制0?
64位双精度数可以精确表示整数+/- 2 53 鉴于这一事实,我选择对所有类型都使用双精度类型作为单个类型,因为我最大的整数是无符号的32位。 但是现在我必须打印这些伪整数,但是问题是它们也与实际的双精度数混合在一起。 那么,如何在Java中很好地打印这些双打呢? 我已经尝试过了String.format("%f", value),这很接近,除了小数值时会出现很多尾随零。 这是的示例输出 %f 232.00000000 0.18000000000 1237875192.0 4.5800000000 0.00000000 1.23450000 我想要的是: 232 0.18 1237875192 4.58 0 1.2345 当然,我可以编写一个函数来修剪这些零,但是由于String操作,这会导致很多性能损失。我可以使用其他格式代码做得更好吗? 编辑 Tom E.和Jeremy S.的答案都是不可接受的,因为它们都任意舍入到小数点后两位。请在回答之前了解问题。 编辑2 请注意,String.format(format, args...)是区域设置相关的(见下面的答案)。


26
为什么这会陷入无限循环?
我有以下代码: public class Tests { public static void main(String[] args) throws Exception { int x = 0; while(x<3) { x = x++; System.out.println(x); } } } 我们知道他应该已经写了just x++或x=x+1,但是x = x++首先应该将属性写给x自己,然后再递增。为什么x继续0作为价值? -更新 这是字节码: public class Tests extends java.lang.Object{ public Tests(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."<init>":()V 4: return public …

30
错误-trustAnchors参数必须为非空
我正在尝试在Jenkins / Hudson上配置我的电子邮件,并且不断收到错误消息: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty 我已经在网上看到了大量有关该错误的信息,但是我没有得到任何帮助。我在Fedora Linux(不是OpenJDK)上使用Sun的JDK。 这是我尝试过的几件事。我试着从以下这个建议后,但复制从Windows的cacerts到托管詹金斯没有工作,我的Fedora箱。在尝试将Gmail配置为SMTP服务器时,我尝试按照本指南进行操作,但是该方法也不起作用。我还尝试手动下载并移动这些cacert文件,并使用本指南中的各种命令将其移动到我的Java文件夹中。 我愿意接受任何建议,因为我目前仍处于停滞状态。我已经从Windows Hudson服务器上运行了它,但是我在Linux上苦苦挣扎。
492 java  hudson  javamail  jenkins 



11
在Java中从哪里获取“ UTF-8”字符串文字?
我试图在这段代码中使用常量而不是字符串文字: new InputStreamReader(new FileInputStream(file), "UTF-8") "UTF-8"出现在代码中的频率较高,而最好是引用某些static final变量。您知道我在JDK哪里可以找到这样的变量吗? 顺便说一句,顺便说一句,这样的常数是不好的设计:公共静态文字...不是数据复制的解决方案
489 java 


12
如何关闭Java代码某些部分的Eclipse代码格式化程序?
我有一些Java代码,其中的SQL语句编写为Java字符串(请不要使用OR / M烈火,嵌入式SQL就是它-不是我的决定)。 为了简化维护,我将SQL语句从语义上分成了几行代码,并由几行代码组成。因此,而不是像这样: String query = "SELECT FOO, BAR, BAZ FROM ABC WHERE BAR > 4"; 我有类似的东西: String query = "SELECT FOO, BAR, BAZ" + " FROM ABC " + " WHERE BAR > 4 "; 这种样式使SQL更易于阅读和维护(IMHO),尤其是对于较大的查询。例如,我可以将编辑器置于“覆盖”模式并相当容易地就地修改文本。 请注意,此问题超出了SQL的特定示例的范围。用任何垂直格式编写的任何代码,特别是表格结构,都容易被漂亮的打印机破坏。 现在,一些项目成员使用Eclipse编辑器,并且在格式化整个源文件时常常会破坏语义格式。 有没有一种方法可以指示Eclipse在格式化方面忽略某些源代码行? 我正在寻找类似特殊注释的东西,以切换Eclipse格式化程序。理想情况下,这样的注释可以配置为我们选择的任何内容,并且其他格式化程序也可以编程为尊重它: // STOP-ECLIPSE-FORMATTING String query = "SELECT FOO, BAR, …

10
用Java安全地将long转换为int
Java中最惯用的方法是验证 long到的转换int不会丢失任何信息? 这是我当前的实现: public static int safeLongToInt(long l) { int i = (int)l; if ((long)i != l) { throw new IllegalArgumentException(l + " cannot be cast to int without changing its value."); } return i; }
488 java  casting 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.