小编Jim*_*ans的帖子

Java"双支撑初始化"的效率?

Java隐藏功能中,最佳答案提到了Double Brace Initialization,它具有非常诱人的语法:

Set<String> flavors = new HashSet<String>() {{
    add("vanilla");
    add("strawberry");
    add("chocolate");
    add("butter pecan");
}};
Run Code Online (Sandbox Code Playgroud)

这个成语创建了一个匿名内部类,其中只包含一个实例初始化程序,"可以使用包含作用域中的任何[...]方法".

主要问题:这听起来效率低吗?它的使用是否应限于一次性初始化?(当然炫耀!)

第二个问题:新的HashSet必须是实例初始化程序中使用的"this"...任何人都可以了解机制吗?

第三个问题:在生产代码中使用这个成语是否过于模糊

简介:非常非常好的答案,谢谢大家.在问题(3)中,人们认为语法应该是清楚的(尽管我建议偶尔发表评论,特别是如果你的代码会传递给可能不熟悉它的开发人员).

在问题(1)上,生成的代码应该快速运行.额外的.class文件会导致jar文件混乱,并且会稍微减慢程序启动速度(感谢@coobird测量它).@Thilo指出垃圾收集可能会受到影响,在某些情况下,额外加载类的内存成本可能是一个因素.

问题(2)对我来说最有趣.如果我理解答案,那么DBI中发生的事情是匿名内部类扩展了由new运算符构造的对象的类,因此具有引用正在构造的实例的"this"值.井井有条.

总的来说,DBI让我感到非常好奇.Coobird和其他人指出,您可以使用Arrays.asList,varargs方法,Google Collections和提议的Java 7 Collection文字获得相同的效果.Scala,JRuby和Groovy等较新的JVM语言也为列表构建提供了简明的符号,并且与Java良好地互操作.鉴于DBI使类路径混乱,减慢了类加载速度,并使代码更加模糊,我可能会回避它.但是,我打算在一位刚刚获得SCJP的朋友身上发表这篇文章,并且喜欢关于Java语义的好朋友!;-) 感谢大家!

7/2017:Baeldung 对双支撑初始化有很好的总结,并认为它是一种反模式.

12/2017:@Basil Bourque指出,在新的Java 9中你可以说:

Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan");
Run Code Online (Sandbox Code Playgroud)

这肯定是要走的路.如果您遇到早期版本,请查看Google Collections的ImmutableSet.

java collections performance initialization

786
推荐指数
10
解决办法
12万
查看次数

使用NoSQL数据存储时遇到了哪些可伸缩性问题?

NoSQL指的是打破关系数据库和ACID保证历史的非关系数据存储.流行的开源NoSQL数据存储包括:

  • Cassandra(表格,用Java编写,由Cisco,WebEx,Digg,Facebook,IBM,Mahalo,Rackspace,Reddit和Twitter使用)
  • CouchDB(文档,用Erlang编写,BBC和Engine Yard使用)
  • Dynomite(键值,用Erlang编写,由Powerset使用)
  • HBase(键值,用Java编写,Bing使用)
  • Hypertable(表格,用C++编写,百度使用)
  • Kai(键值,用Erlang编写)
  • MemcacheDB(键值,用C编写,Reddit使用)
  • MongoDB(文档,用C++编写,由Electronic Arts,Github,NY Times和Sourceforge使用)
  • Neo4j(图形,用Java编写,一些瑞典大学使用)
  • Project Voldemort(键值,用Java编写,LinkedIn使用)
  • Redis(键值,用C语言编写,Craigslist,Engine Yard和Github使用)
  • Riak(键值,用Erlang编写,Comcast和Mochi Media使用)
  • Ringo(键值,用Erlang编写,诺基亚使用)
  • Scalaris(键值,用Erlang编写,OnScale使用)
  • Terrastore(文档,用Java编写)
  • ThruDB(文档,用C++编写,由JunkDepot.com使用)
  • 东京内阁/东京暴君(键值,用C语言写的,由Mixi.jp(日本社交网站)使用)

我想知道您的具体问题 - SO读者 - 使用数据存储解决了您使用的NoSQL数据存储.

问题:

  • 您使用NoSQL数据存储解决了哪些可扩展性问题?
  • 您使用了什么NoSQL数据存储?
  • 在切换到NoSQL数据存储之前,您使用了什么数据库?

我正在寻找第一手经验,所以除非你有这个经验,否则请不要回答.

database nosql graph-databases key-value-store distributed-database

189
推荐指数
6
解决办法
2万
查看次数

Scala演员:接受vs反应

首先我要说的是,我有很多Java经验,但最近才对函数式语言感兴趣.最近我开始关注Scala,这似乎是一种非常好的语言.

但是,我一直在阅读Scala 编程中的 Scala的Actor框架,有一点我不明白.在第30.4章中,它表示使用react而不是receive可以重用线程,这对性能有好处,因为线程在JVM中很昂贵.

这是否意味着,只要我记得打电话react而不是receive,我可以开始尽可能多的演员?在发现Scala之前,我一直在和Erlang一起玩,编程Erlang的作者自豪地生成了超过20万个进程,而且不会出汗.我讨厌用Java线程做到这一点.与Erlang(和Java)相比,我在Scala中看到了什么样的限制?

此外,此线程如何在Scala中重用?为简单起见,我们假设我只有一个线程.我开始的所有演员都会在这个帖子中按顺序运行,还是会进行某种任务切换?例如,如果我启动两个互相ping消息的actor,如果它们在同一个线程中启动,我是否会冒死锁?

根据Scala编程,编写演员使用react比使用更困难receive.这听起来似乎有道理,因为react不会回来.然而,本书接着展示了如何react使用循环内部Actor.loop.结果,你得到了

loop {
    react {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

对我来说,这看起来非常相似

while (true) {
    receive {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

在本书前面使用过.尽管如此,这本书还是说"在实践中,程序至少需要少数几个receive".那我在这里错过了什么?除了回归之外,receive做什么不能做到react?为什么我关心?

最后,进入我不理解的核心:本书不断提及如何使用react可以丢弃调用堆栈来重用线程.这是如何运作的?为什么有必要丢弃调用堆栈?当函数通过抛出异常(react)而终止时,为什么可以放弃调用堆栈,而不是当它通过返回(receive)终止时?

我的印象是Scala中的Programming一直在掩盖这里的一些关键问题,这是一种耻辱,因为否则它是一本真正优秀的书.

multithreading scala actor

110
推荐指数
4
解决办法
2万
查看次数

Rest API服务器的Scala框架?

我们正在考虑将我们的Rest API服务器(它在Web服务中,在Symfony PHP上)移动到Scala有以下几个原因:速度,无开销,更少的CPU,更少的代码,可扩展性等.我不知道Scala直到几个几天前,但我一直很享受这些天我用Scala书和所有博客文章和问题学习的东西(它不是那么难看!)

我有以下选择:

  • 从头开始构建Rest API服务器
  • 使用像Scalatra这样的小型Scala Web框架
  • 使用Lift

我将不得不使用的一些东西:HTTP请求,JSON输出,MySQL(数据),OAuth,Memcache(缓存),日志,文件上传,统计(可能是Redis).

你会推荐什么?

api rest scala lift

104
推荐指数
4
解决办法
7万
查看次数

如何将java.util.logging发送到log4j?

我有一个现有的应用程序,它针对log4j进行所有日志记录.我们使用了许多其他库,它们也使用log4j,或者记录Commons Logging,最终使用我们环境中的log4j.我们的一个依赖项甚至记录了slf4j,它也可以正常工作,因为它最终也会委托给log4j.

现在,我想为这个应用程序添加ehcache以满足一些缓存需求.以前版本的ehcache使用了commons-logging,它在这种情况下可以很好地工作,但是从版本1.6-beta1开始,它们已经删除了对commons-logging的依赖,而是用java.util.logging替换它.

不熟悉java.util.logging提供的内置JDK日志记录,是否有一种简单的方法可以将针对log4j发送到JUL的任何日志消息记录下来,因此我可以使用现有配置并设置任何日志记录来来自ehcache?

看看JUL的javadocs,看起来我可以设置一堆环境变量来改变使用的LogManager实现,也许可以用它来将log4j包装Logger在JUL Logger类中.这是正确的方法吗?

具有讽刺意味的是,当世界其他地方(大部分)使用第三方库时,图书馆使用内置JDK日志记录会引起如此头疼.

java logging log4j apache-commons slf4j

83
推荐指数
4
解决办法
6万
查看次数

Google App Engine Java上的RESTful应用程序?

我想在Google App Engine上创建一个RESTful应用程序.我想提供XML和JSON服务.我简要地试过了Restlet,Resteasy和Jersey.除了Restlet中的一些简单示例之外,我没有取得任何成功.

您能否分享使用Java在Google App Engine上创建Restful Web应用程序的经验,或者提供有关GAE上述工具包的任何见解?

谢谢!

编辑(2009-07-25):

我决定暂时使用Restlet.到目前为止似乎完美无瑕.请发布您可能拥有的任何其他见解/意见.你遇到了什么问题?你在GAE/J上成功使用过Jersey/Restlet/Resteasy吗?如果是这样,我们想听听它!

java rest google-app-engine jersey restlet

82
推荐指数
4
解决办法
4万
查看次数

如何设计可扩展应用程序?

您如何设计/构建可伸缩的应用程序?任何有助于理解如何扩展应用程序的书籍或网站的建议?

谢谢

architecture scalability

61
推荐指数
1
解决办法
5万
查看次数

哪个是Java序列化的最佳替代方案?

我目前正在开发一个项目,它需要持久保存任何类型的对象(我们没有任何控制权的实现),因此这些对象可以在之后恢复.

我们无法实现ORM,因为我们无法在开发时限制库的用户.

我们的第一个选择是使用Java默认序列化对其进行序列化,但是当用户开始传递同一对象的不同版本(属性更改类型,名称等)时,我们在恢复对象时遇到了很多麻烦.

我们尝试过使用XMLEncoder类(将对象转换为XML),但我们发现缺少功能(例如,不支持Enums).

最后,我们还尝试了JAXB,但这会强制我们的用户注释他们的类.

还有什么好办法吗

java serialization xml-serialization

47
推荐指数
7
解决办法
4万
查看次数

我应该将初始java String值从null设置为""吗?

我常常有一个班级:

public class Foo
{
private String field1;
private String field2;

// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)

这使得field1和field2的初始值等于null.拥有我的所有String类字段会更好吗?

public class Foo
{
private String field1 = "";
private String field2 = "";

// etc etc etc
}
Run Code Online (Sandbox Code Playgroud)

然后,如果我与类定义一致,我会避免很多空指针问题.这种方法有什么问题?

java string null initialization

47
推荐指数
7
解决办法
7万
查看次数

WHERE子句中的字段顺序是否会影响MySQL的性能?

我在表中有两个索引字段 - typeuserid(单个索引,而不是复合索引).

types字段值非常有限(假设它只有0或1),因此50%的表记录具有相同的值type.userid另一方面,值来自更大的集合,因此具有相同userid值的记录量很小.

这些查询中的任何一个都会比另一个运行得更快:

select * from table where type=1 and userid=5
select * from table where userid=5 and type=1
Run Code Online (Sandbox Code Playgroud)

此外,如果两个字段都没有编入索引,它会改变行为吗?

mysql sql performance

47
推荐指数
3
解决办法
3万
查看次数