Tag: java

为什么Java没有真正的multidimensional array?

对于那些不想要背景的人来说,TL; DR版本是以下具体问题: 题 为什么Java没有实现真正的multidimensional array? 有一个坚实的技术原因吗? 我在这里错过了什么? 背景 Java在语法级别有multidimensional array,可以声明 int[][] arr = new int[10][10]; 但这似乎并不是人们所期望的。 而不是让JVM分配一个足以存储100个int的连续块,它是以int数组的forms出现的:所以每一层都是连续的RAM块,但是整体来说不是这样。 访问arr[i][j]是相当慢的:JVM必须 find存储在arr[i]的int[] arr[i] ; 索引这个来find存储在arr[i][j]的int 。 这包括查询一个对象从一层到另一层,这是相当昂贵的。 为什么Java这样做 在一个层面上,不难看出为什么不能通过简单的扩展和增加查找来优化,即使它们全部分配在一个固定块中。 问题是, arr[3]是所有它自己的参考,它可以被改变。 所以虽然数组的大小是固定的,但我们可以很容易地写出来 arr[3] = new int[11]; 现在规模和增加是因为这个层次的增长而被拧紧的。 你需要知道在运行时是否所有东西都和以前一样大小。 此外,当然,这将被分配到RAM中的其他地方(这将是,因为它比它所替代的要大),所以它甚至不是在缩放和添加的正确位置。 有什么问题呢 在我看来,这是不理想的,这有两个原因。 首先,它很慢 。 对于多维情况( int[1000000]和int[100][100][100] ),使用这些方法对单维或multidimensional array的内容进行求和的testing花费了近两倍的时间 (714秒vs 371秒) int[100][100][100] ,用随机的int值填充,运行1000000次,热caching)。 public static long sumSingle(int[] arr) { long […]

名单<? 扩展MyType>

我有一个关于generics的Java问题。 我宣布了一个通用列表: List<? extends MyType> listOfMyType; 然后在一些方法中,我尝试实例化并添加项目到列表中: listOfMyType = new ArrayList<MyType>(); listOfMyType.add(myTypeInstance); myTypeInstance只是MyTypetypes的对象; 它不会编译。 它说: 该方法添加(捕获#3 – ?扩展MyType)typesList <capture#3-of? 扩展MyType>不适用于参数(MyType) 任何想法?

如何在java中打印完整的堆栈跟踪

问题很简单,我想读取我捕获的exception的完整stacktrace 🙂 例: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.ibm.db2.jcc.DB2Driver' at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1136) at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880) at com.azurian.lce.usuarios.ConnectionManager.getConnection(ConnectionManager.java:65) at com.azurian.lce.usuarios.db2.UsuarioDAOImpl.autenticar(UsuarioDAOImpl.java:101) at com.azurian.lce.usuarios.UsuarioServiceImpl.autenticar(UsuarioServiceImpl.java:31) at com.azurian.lce.web.admin.actions.LoginAction.execute(LoginAction.java:49) at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525) at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) at […]

CXF JAXRS – 如何将Query作为QueryParam传递给Date

我有一个服务定义如下。 public String getData(@QueryParam("date") Date date) 我试图从我的客户端(这是CXF的jaxrs:客户端,而不是通用的HTTP客户端或浏览器)传递一个java.util.Date到它。 我的服务在HTTP URL中收到date为Thu Mar 01 22:33:10 IST 2012 。 由于CXF将无法使用此string创buildDate对象,因此我的客户端收到404错误。 我尝试在服务端使用ParameterHandler ,但我仍然无法成功parsing它,因为我不期望在任何特定格式的date。 根据这篇文章 ,传递Date应该是开箱即用,但我似乎无法得到基本的情况下工作。 我是否需要做任何事情才能成功地将我的客户的Date对象传递给服务? 感谢任何帮助。 谢谢

是否需要在onActivityResult()中使用super.onActivityResult()?

哪一个更好,为什么? 这个: @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { super.onActivityResult(requestCode, resultCode, intent); … } 或这个: @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { // do not call super.onActivityResult() … }

无法将java.util.ArrayList的实例反序列化为VALUE_STRING

我有一个使用Jersey构build的REST服务,并部署在AppEngine中。 REST服务实现了使用应用程序/ json媒体types的动词PUT。 数据绑定由Jackson执行。 动词使用以JSON表示的企业 – 部门关系 {"name":"myEnterprise", "departments":["HR","IT","SC"]} 在客户端,我使用gson将JSON表示转换为一个java对象。 然后,我将该对象传递给我的REST服务,它工作正常。 问题: 当我的JSON表示在集合中只有一个项目 {"name":"myEnterprise", "departments":["HR"]} 该服务不能反序列化该对象。 ATTENTION: /enterprise/enterprise: org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of VALUE_STRING token at [Source: org.mortbay.jetty.HttpParser$Input@5a9c5842; line: 1, column: 2 正如其他用户所报告的,解决scheme是添加标志ACCEPT_SINGLE_VALUE_AS_ARRAY(例如Jersey:不能将StringList的实例反序列化为string )。 不过,我并不是在控制一个ObjectMapper,因为在服务方面它是由Jackson透露的。 题: 有没有办法在服务端configurationObjectMapper来启用ACCEPT_SINGLE_VALUE_AS_ARRAY? 注释? web.xml中? 代码细节 Java对象: @XmlRootElement public class Enterprise { private String name; private List<String> […]

Collectors.toSet()和HashSet

采取以下行示例代码: Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet()); 我想要一个HashSet 。 把一个debugging器的代码,我确实得到一个HashSet 。 我看了一下java.util.stream.Collectors.toSet()来观察下面的代码: public static <T> Collector<T, ?, Set<T>> toSet() { return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, (left, right) -> { left.addAll(right); return left; }, CH_UNORDERED_ID); } 合约保证一个Set ,实现决定一个HashSet ; 看起来合理。 但是,我的实现需要由HashSet保证的恒定时间查找,而不仅仅是任何旧的Set 。 如果toSet()的实现决定使用FooSet ,这完全在它的权限之内,那么我的实现就会受到影响。 这个问题的最佳实践解决scheme是什么?

在Java中嘲笑静态块

我对Java的座右铭是“仅仅因为Java有静态块,并不意味着你应该使用它们”。 除了笑话之外,Java中有很多技巧使得testing成为一场噩梦。 我最讨厌的两个是匿名类和静态块。 我们有很多使用静态块的遗留代码,这些都是我们在编写unit testing时的烦人之处。 我们的目标是能够编写unit testing的类,依赖于这个静态初始化与最小的代码更改。 到目前为止,我的同事的build议是将静态块的主体移动到一个私有的静态方法,并将其staticInit 。 这个方法可以在静态块中被调用。 对于unit testing,依赖于这个类的另一个类可以很容易地使用JMockit来嘲弄staticInit而不做任何事情。 我们来看看这个例子。 public class ClassWithStaticInit { static { System.out.println("static initializer."); } } 将被改为 public class ClassWithStaticInit { static { staticInit(); } private static void staticInit() { System.out.println("static initialized."); } } 所以我们可以在JUnit中进行以下操作。 public class DependentClassTest { public static class MockClassWithStaticInit { public static void staticInit() […]

什么是Java / Swing良好的对接框架?

我正在寻找一个好的轻量级Java对接框架。 我知道Netbeans和Eclipse可以用作RCP,但我正在寻找一些更轻量级的东西。

Trie与后缀树与后缀数组

哪个结构提供了最佳的性能结果; trie(前缀树),后缀树还是后缀数组? 还有其他类似的结构吗? 什么是这些结构的好的Java实现? 编辑:在这种情况下,我想进行string匹配一个大的名称字典和大量的自然语言文本之间,以便确定文本字典的名称。