Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9cc6dd8

Browse files
Merge branch 'master' into Lookup-enum-by-string-value
2 parents c24cd35 + 01b6166 commit 9cc6dd8

28 files changed

+1108
-36
lines changed

‎README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ stackoverflow-Java-top-qa
2525
- 输出gitbook版本(现在直接在github上查看,体验不好)
2626

2727
#### 文档优化反馈:
28-
2928
请大家多多反馈,优化已翻译好的文章:可以到[吐槽区](https://github.com/giantray/stackoverflow-java-top-qa/issues/66)吐槽,也可以在已翻译文章基础上进行优化,提新的PR。文章质量的提升,需要大家一起努力!
3029

3130

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
为自动代码调整设置最大的行数?
2+
问题:我正在学习Java。如果我在Eclipse Helios里使用ctrl+shift+f的组合键,它会自动调整我的代码。一定程度下,它会改变行数。我想增加行数的最大值。应该怎么做?
3+
4+
回答,在偏好设置里,分别点击Java->Code Style->Fomatter->edit,在菜单栏Line Wrapping下会有行的宽度选择(Maximun line width).你将需要编辑你的代码轮廓。

‎contents/avoiding-null-statements-in-java.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,4 @@ ParserFactory.getParser().findAction(someInput).doSomething();
9999
- 如果你想返回null,请停下来想一想,这个地方是否更应该抛出一个异常
100100

101101
stackoverflow链接:
102-
http://stackoverflow.com/questions/271526/avoiding-null-statements-in-java?page=2&tab=votes#tab-top
102+
http://stackoverflow.com/questions/271526/avoiding-null-statements?page=1&tab=votes#tab-top

‎contents/convert-a-string-to-an-enum-in-java.md

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,38 @@ Enum.valueOf()是否能实现以上目的,如果是,那我如何使用?
1919

2020
### 其他答案
2121

22+
当文本和枚举值不同时,可以采用这种方式:
23+
```java
24+
public enum Blah {
25+
A("text1"),
26+
B("text2"),
27+
C("text3"),
28+
D("text4");
29+
30+
private String text;
31+
32+
Blah(String text) {
33+
this.text = text;
34+
}
35+
36+
public String getText() {
37+
return this.text;
38+
}
39+
40+
public static Blah fromString(String text) {
41+
for (Blah b : Blah.values()) {
42+
if (b.text.equalsIgnoreCase(text)) {
43+
return b;
44+
}
45+
}
46+
return null;
47+
}
48+
}
49+
```
50+
fromString方法中,throw new IllegalArgumentException("No constant with text " + text + " found") 会比直接返回null更优秀.
51+
52+
### 其他答案
53+
2254
我有一个挺赞的工具方法:
2355
```java
2456
/**
@@ -47,4 +79,4 @@ public static MyEnum fromString(String name) {
4779
}
4880
```
4981

50-
stackoverflow链接:http://stackoverflow.com/questions/604424/convert-a-string-to-an-enum-in-java
82+
stackoverflow链接:http://stackoverflow.com/questions/604424/convert-a-string-to-an-enum-in-java
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
## "Double Brace Initialization"的效率问题
2+
3+
#### 问题
4+
5+
`Double Brace Initialization`是java的隐藏特性,它有着如下诱人的语法:
6+
7+
```java
8+
Set<String> flavors = new HashSet<String>() {{
9+
add("vanilla");
10+
add("strawberry");
11+
add("chocolate");
12+
add("butter pecan");
13+
}};
14+
```
15+
16+
但是,这个特性听说不是很高效率,是否要限制一次性使用?
17+
18+
#### 回答
19+
20+
当我使用匿名内部类时出现了如下的问题:
21+
22+
```Auto
23+
2009年05月27日 16:35 1,602 DemoApp21ドル.class
24+
2009年05月27日 16:35 1,976 DemoApp210ドル.class
25+
2009年05月27日 16:35 1,919 DemoApp211ドル.class
26+
2009年05月27日 16:35 2,404 DemoApp212ドル.class
27+
2009年05月27日 16:35 1,197 DemoApp213ドル.class
28+
29+
/* snip */
30+
31+
2009年05月27日 16:35 1,953 DemoApp230ドル.class
32+
2009年05月27日 16:35 1,910 DemoApp231ドル.class
33+
2009年05月27日 16:35 2,007 DemoApp232ドル.class
34+
2009年05月27日 16:35 926 DemoApp233ドル1ドル1ドル.class
35+
2009年05月27日 16:35 4,104 DemoApp233ドル1ドル.class
36+
2009年05月27日 16:35 2,849 DemoApp233ドル.class
37+
2009年05月27日 16:35 926 DemoApp234ドル1ドル1ドル.class
38+
2009年05月27日 16:35 4,234 DemoApp234ドル1ドル.class
39+
2009年05月27日 16:35 2,849 DemoApp234ドル.class
40+
41+
/* snip */
42+
43+
2009年05月27日 16:35 614 DemoApp240ドル.class
44+
2009年05月27日 16:35 2,344 DemoApp25ドル.class
45+
2009年05月27日 16:35 1,551 DemoApp26ドル.class
46+
2009年05月27日 16:35 1,604 DemoApp27ドル.class
47+
2009年05月27日 16:35 1,809 DemoApp28ドル.class
48+
2009年05月27日 16:35 2,022 DemoApp29ドル.class
49+
```
50+
51+
这是在我的一个简单应用中所产生的类信息。在这个应用中,使用了大量的匿名内部类,这些类会被单独地编译成`class`文件。
52+
53+
`Double Brace Initialization`是一个带有实例初始化块的匿名内部类。这就意味着每一个新的类的产生都会执行一次实例块,这样的目的通常是为了创建一个简单的对象。
54+
55+
java虚拟机在使用类之前需要去读取其classes信息,然后执行字节码校验等流程。所以为了保存这些`class`文件,所需要的磁盘空间会增大。
56+
57+
这个可以说是`Double Brace Initialization`的开销。所以尽量不要过分使用。
58+
59+
---
60+
61+
在java的介绍中,`Double Brace Initialization`有着如下的写法:
62+
63+
```java
64+
List<String> list = new ArrayList<String>() {{
65+
add("Hello");
66+
add("World!");
67+
}};
68+
```
69+
70+
看起来像是java的隐藏特性,其实它只是下面代码的一个重写:
71+
72+
```java
73+
List<String> list = new ArrayList<String>() {
74+
75+
// 实例初始化块
76+
{
77+
add("Hello");
78+
add("World!");
79+
}
80+
};
81+
```
82+
83+
所以,它只是在匿名内部类中加上了实例初始化块而已。
84+
85+
---
86+
87+
Joshua Bloch希望以后的集合代码能够像这样简介:
88+
89+
```java
90+
List<Integer> intList = [1, 2, 3, 4];
91+
92+
Set<String> strSet = {"Apple", "Banana", "Cactus"};
93+
94+
Map<String, Integer> truthMap = { "answer" : 42 };
95+
```
96+
97+
但目前还没有这样的语法。
98+
99+
---
100+
101+
<strong>实践</strong>
102+
103+
做一个简单的试验:创建1000个带着`"Hello"``"World!"`元素的`ArrayList`
104+
105+
* 方法1:Double Brace Initialization
106+
107+
```
108+
List<String> l = new ArrayList<String>() {{
109+
add("Hello");
110+
add("World!");
111+
}};
112+
```
113+
114+
* 方法2:初始化`ArrayList`并调用`add`方法
115+
116+
```java
117+
List<String> l = new ArrayList<String>();
118+
l.add("Hello");
119+
l.add("World!");
120+
```
121+
122+
我修改了java的源文件使之能够为每种上述方法分别创建出1000个实例
123+
124+
* 方法1的测试
125+
126+
```java
127+
class Test1 {
128+
public static void main(String[] s) {
129+
long st = System.currentTimeMillis();
130+
131+
List<String> l0 = new ArrayList<String>() {{
132+
add("Hello");
133+
add("World!");
134+
}};
135+
136+
List<String> l1 = new ArrayList<String>() {{
137+
add("Hello");
138+
add("World!");
139+
}};
140+
141+
/* snip */
142+
143+
List<String> l999 = new ArrayList<String>() {{
144+
add("Hello");
145+
add("World!");
146+
}};
147+
148+
System.out.println(System.currentTimeMillis() - st);
149+
}
150+
```
151+
152+
* 方法2的测试
153+
154+
```java
155+
class Test2 {
156+
public static void main(String[] s) {
157+
long st = System.currentTimeMillis();
158+
159+
List<String> l0 = new ArrayList<String>();
160+
l0.add("Hello");
161+
l0.add("World!");
162+
163+
List<String> l1 = new ArrayList<String>();
164+
l1.add("Hello");
165+
l1.add("World!");
166+
167+
/* snip */
168+
169+
List<String> l999 = new ArrayList<String>();
170+
l999.add("Hello");
171+
l999.add("World!");
172+
173+
System.out.println(System.currentTimeMillis() - st);
174+
}
175+
}
176+
```
177+
178+
然后得出了下面的测试时间:
179+
180+
```Auto
181+
Test1 Times (ms) Test2 Times (ms)
182+
---------------- ----------------
183+
187 0
184+
203 0
185+
203 0
186+
188 0
187+
188 0
188+
187 0
189+
203 0
190+
188 0
191+
188 0
192+
203 0
193+
```
194+
195+
从上面我们可以看到,`Double Brace Initialization`平均时间花费了190ms左右。
196+
同时,另外一种方法平均只用了0ms。
197+
198+
所以,在第一个方法测试程序中,即`Double Brace Initialization`产生了1000个`class`文件。
199+
200+
## StackOverflow地址
201+
202+
[http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization](http://stackoverflow.com/questions/924285/efficiency-of-java-double-brace-initialization)

‎contents/examples-of-gof-design-patterns-in-javas-core-libraries.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
### [装饰模式](http://en.wikipedia.org/wiki/Decorator_pattern)
5656

57-
- [java.io.InputStream](http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html),[OutputStream](http://docs.oracle.com/javase/6/docs/api/java/io/OutputStream.html),[Reader](http://docs.oracle.com/javase/6/docs/api/java/io/Reader.html)[Writer](http://docs.oracle.com/javase/6/docs/api/java/io/Writer.html) 的所有资料都有一个使用 InputStream,OutputStream,Reader,Writer 的构造器
57+
- [java.io.InputStream](http://docs.oracle.com/javase/6/docs/api/java/io/InputStream.html),[OutputStream](http://docs.oracle.com/javase/6/docs/api/java/io/OutputStream.html),[Reader](http://docs.oracle.com/javase/6/docs/api/java/io/Reader.html)[Writer](http://docs.oracle.com/javase/6/docs/api/java/io/Writer.html) 的所有子类都有一个使用 InputStream,OutputStream,Reader,Writer 的构造器
5858
- [java.util.Collections](http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html) 中的 [checkedXXX()](http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#checkedCollection%28java.util.Collection,%20java.lang.Class%29), [synchronizedXXX()](http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#synchronizedCollection%28java.util.Collection%29)[unmodifiableXXX()](http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableCollection%28java.util.Collection%29) 方法
5959
- [javax.servlet.http.HttpServletRequestWrapper](http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletRequestWrapper.html)[HttpServletResponseWrapper](http://docs.oracle.com/javaee/6/api/javax/servlet/http/HttpServletResponseWrapper.html)
6060

@@ -148,4 +148,4 @@
148148

149149

150150
- stackoverflow原址:
151-
http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
151+
http://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
加载JNI共享库失败(JDK)
2+
问题:当我试图打开Eclipse时,会弹出一个提示写着:
3+
Failed to load the JNI shared library "C:/JDK/bin/client/jvm.dll"`.
4+
然后,Eclipse会强制关闭。
5+
我做了以下几点:
6+
·我检查那个路径有没有存在什么,真的有存在。
7+
·我的Eclipse和Java SE Development Kit都是64位的。我检查我的系统,它能处理64位。
8+
·我也在Google和Stack Overflow搜索解决方法,我找到唯一的方法是下载一个32位版本的JDK和Eclipse。
9+
下载32位版本是我没办法下的办法。但还有其他的解决方法吗?
10+
11+
回答:
12+
你需要一个三件套:
13+
·64位的操作系统
14+
·64位的Java
15+
·64位的Eclipse
16+
17+

‎contents/how-can-i-initialize-a-static-map.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -52,23 +52,23 @@
5252

5353
我喜欢用Guava(是 Collection 框架的增强)的方法初始化一个静态的,不可改变的map
5454

55-
static fianl Map<Integer, String> myMap = ImmutablMap.of(
56-
1,"one",
57-
2, "two"
58-
)
55+
static final Map<Integer, String> MY_MAP = ImmutableMap.of(
56+
1, "one",
57+
2, "two"
58+
);
59+
5960
·
6061
当map的 entry个数超过5个时,你就不能使用`ImmutableMap.of`。可以试试`ImmutableMap.bulider()`
6162

62-
static fianl Map<Integer, String> myMap = ImmutableMap.<Integer, String>builder()
63-
{
64-
.put(1, "one")
65-
.put(2, "two")
66-
67-
.put(15, "fifteen")
68-
.build();
69-
}
63+
static final Map<Integer, String> MY_MAP = ImmutableMap.<Integer, String>builder()
64+
.put(1, "one")
65+
.put(2, "two")
66+
// ...
67+
.put(15, "fifteen")
68+
.build();
69+
7070

7171

7272
# 原文链接 #
7373

74-
http://stackoverflow.com/questions/507602/how-can-i-initialize-a-static-map
74+
http://stackoverflow.com/questions/507602/how-can-i-initialize-a-static-map

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /