Skip to content

Commit 9cc6dd8

Browse files
authored
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 DemoApp2$1.class
24+
2009/05/27 16:35 1,976 DemoApp2$10.class
25+
2009/05/27 16:35 1,919 DemoApp2$11.class
26+
2009/05/27 16:35 2,404 DemoApp2$12.class
27+
2009/05/27 16:35 1,197 DemoApp2$13.class
28+
29+
/* snip */
30+
31+
2009/05/27 16:35 1,953 DemoApp2$30.class
32+
2009/05/27 16:35 1,910 DemoApp2$31.class
33+
2009/05/27 16:35 2,007 DemoApp2$32.class
34+
2009/05/27 16:35 926 DemoApp2$33$1$1.class
35+
2009/05/27 16:35 4,104 DemoApp2$33$1.class
36+
2009/05/27 16:35 2,849 DemoApp2$33.class
37+
2009/05/27 16:35 926 DemoApp2$34$1$1.class
38+
2009/05/27 16:35 4,234 DemoApp2$34$1.class
39+
2009/05/27 16:35 2,849 DemoApp2$34.class
40+
41+
/* snip */
42+
43+
2009/05/27 16:35 614 DemoApp2$40.class
44+
2009/05/27 16:35 2,344 DemoApp2$5.class
45+
2009/05/27 16:35 1,551 DemoApp2$6.class
46+
2009/05/27 16:35 1,604 DemoApp2$7.class
47+
2009/05/27 16:35 1,809 DemoApp2$8.class
48+
2009/05/27 16:35 2,022 DemoApp2$9.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)