>Java >java지도 시간 >stackoverflow에서 가장 인기 있는 Java 질문 10가지

stackoverflow에서 가장 인기 있는 Java 질문 10가지

伊谢尔伦
伊谢尔伦원래의
2016-11-30 11:39:091213검색

1. 두 번(1927) 빼면 이상한 결과가 나오는 이유는 무엇입니까?

  (좋아요 3623개)

다음 프로그램을 실행하면 프로그램은 1초로 구분된 두 날짜 문자열을 구문 분석하고 비교합니다.

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
    String str3 = "1927-12-31 23:54:07";  
    String str4 = "1927-12-31 23:54:08";  
    Date sDt3 = sf.parse(str3);  
    Date sDt4 = sf.parse(str4);  
    long ld3 = sDt3.getTime() /1000;  
    long ld4 = sDt4.getTime() /1000;
    System.out.println(ld4-ld3);
}

출력은 다음과 같습니다.

353

ld4-ld3은 왜 1이 아니고(두 시간의 차이가 1초가 되기를 원하기 때문에) 353인가요?

각 날짜 문자열에 1초를 더하면:

String str3 = "1927-12-31 23:54:08";  
String str4 = "1927-12-31 23:54:09";

ld4-ld3의 결과는 1입니다.

sun.util.calendar.ZoneInfo[id="Asia/Shanghai",
offset=28800000,dstSavings=0,
useDaylight=false,
transitions=19,
lastRule=null]
Locale(Locale.getDefault()): zh_CN

해결 방법

이는 상하이 시간대이며 12월 31일로 변경되었습니다.

1927년 상하이의 시간대 변경에 대한 자세한 내용을 알아보려면 이 웹사이트를 확인하세요. 기본적으로 1927년 말 자정에는 항상 5분 52초 뒤로 설정됩니다. 따라서 "1927-12-31 23:54:08"은 실제로 두 번 발생하며 Java가 후자를 현지 날짜 및 시간으로 구문 분석하여 차이가 발생한 것처럼 보입니다.

2. Java는 "참조에 의한 전달"입니까, 아니면 "값에 의한 전달"입니까?

설명 좀 해주세요?

솔루션

Java는 항상 값으로 전달되었습니다. 불행히도 그들은 포인터 참조를 호출하기로 결정했기 때문에 새로 온 사람들은 항상 혼란스러워합니다. 이러한 참조는 값으로도 전달되기 때문입니다.

3. Java += 연산자에 대한 질문

(좋아요 2223개)

오늘날까지 나는 다음 예를 생각합니다:

Just A 약어:

i += j;
그러나 이렇게 하면:

i = i + j;
그러나 i = i + j;는 컴파일할 수 없지만 i += j;

i += j라는 뜻인데 실제로는 i = (type of i) (i + j)의 약자인가요?
int i = 5;
long j = 8;

솔루션

이런 질문을 하시는 분들이 늘 계시고, JLS가 그 답을 가지고 있습니다. §15.26.2 복합 할당 연산자를 참조하세요. 발췌:

E1 op= E2 유형의 복합 할당 표현식은 E1 = (T)((E1) op (E2))와 동일합니다. 여기서 T는 E1의 유형이며 차이점은 E1은 한 번만 계산됩니다.

§15.26.2에서 인용된 예

[...] 다음 코드는 정확합니다.

x의 결과는 7과 같습니다. it 동일:

short x = 3;
x += 4.6;
즉, 귀하의 가정이 정확합니다.

4. HashMap과 Hashtable의 차이점은 무엇인가요?
short x = 3;
x = (short)(x + 4.6);

(1769 좋아요)

Java에서 HashMap과 Hashtable의 차이점은 무엇인가요?

멀티스레드가 아닌 애플리케이션에서는 어느 것이 더 효율적인가요?

솔루션

Java의 HashMap과 HashTable에는 몇 가지 차이점이 있습니다.

Hashtable은 동기화되지만 HashMap은 그렇지 않습니다. 이는 동기화되지 않은 객체가 일반적으로 동기화된 객체보다 더 나은 성능을 발휘하기 때문에 HashMap이 다중 스레드가 아닌 응용 프로그램에 더 적합하게 만듭니다.

해시테이블은 null 값과 키를 허용하지 않습니다. HashMap은 널 키와 널 값을 허용합니다.

HashMap의 하위 클래스는 LinkedHashMap입니다. 따라서 반복 순서(기본 삽입 순서)를 예측하려면 HashMap을 LinkedHashMap으로 변환하면 됩니다. Hashtable에서는 그렇게 간단하지 않습니다.

동기화가 문제가 되지 않으니 HashMap을 사용하시는 걸 추천드립니다. 동기화가 문제인 경우 ConcurrentHashMap을 살펴볼 수도 있습니다.

5. (방법) InputStream을 문자열로 읽거나 변환합니다

(1724 좋아요)

Process와 같은 java.io.InputStream 객체가 있는 경우 이 객체를 생성하고 문자열을 생성하시겠습니까?

텍스트 데이터가 포함된 InputStream 개체가 있고 이를 문자열로 변환하려고 한다고 가정합니다(예를 들어 스트림의 내용을 로그 파일에 쓸 수 있도록).

InputStream을 문자열로 변환하는 가장 쉬운 방법은 무엇입니까?

솔루션

Apache commons IOUtils 라이브러리를 사용하여 InputStream을 StringWriter로 복사하는 것은 다음과 유사한 좋은 방법입니다.

심지어

StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
또는 Stream과 Writer를 혼합하고 싶지 않은 경우 ByteArrayOutputStream을 사용할 수 있습니다.

6. Java의 비밀번호는 왜 문자열 대신 char[]을 사용하는 것을 선호합니까?
// NB: does not close inputStream, you can use IOUtils.closeQuietly for that
// 注意:不关闭inputStream,你可以使用 IOUtils.closeQuietly
String theString = IOUtils.toString(inputStream, encoding);

 (좋아요 1574개)

  在Swing中,密码字段有一个getPassword()(返回 char数组)方法而不是通常的getText()(返回String)方法。同样的,我遇到过一个建议,不要使用 String 来处理密码。

  为什么String涉及到密码时,它就成了一个安全威胁?感觉使用char数组不太方便。

  解决方案

  String是不可变的。这意味着一旦创建了字符串,如果另一个进程可以进行内存转储,在GC发生前,(除了反射)没有方法可以清除字符串数据。

  使用数组操作完之后,可以显式地清除数据:可以给数组赋任何值,密码也不会存在系统中,甚至垃圾回收之前也是如此。

  所以,是的,这是一个安全问题 – 但是即使使用了char数组,仅仅缩小了了攻击者有机会获得密码的窗口,它值针对制定的攻击类型。

 7、遍历HashMap的最佳方法

  (1504个赞)

  遍历HashMap中元素的最佳方法是什么?

  解决方案

  这样遍历entrySet:

public static void printMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pair = (Map.Entry)it.next();
        System.out.println(pair.getKey() + " = " + pair.getValue());
        it.remove(); // avoids a ConcurrentModificationException
    }
}

  更多请查阅Map。

  8、(如何)从数组创建ArrayList

  (1468个赞)

  我有一个数组,初始化如下:

Element[] array = {new Element(1), new Element(2), new Element(3)};

  我希望将这个数组转化成一个ArrayList类的对象。

  解决方案

new ArrayList<Element>(Arrays.asList(array))

 9、产生一个Java的内存泄露

  (1478个赞)

  我有过一个面试,被问到如何产生一个Java内存泄露。不用说,我感到相当傻,甚至如何产生一个的线索都没有。

  那么怎么才能产生一个内存泄露呢?

  解决方案

  在纯Java中,有一个很好的方式可以产生真正的内存泄露(通过执行代码使对象不可访问但仍存在于内存中):

应用产生一个长时间运行的线程(或者使用一个线程池加速泄露)。

线程通过一个(可选的自定义)类加载器加载一个类。

该类分配大内存(例如,new byte[1000000]),赋值给一个强引用存储在静态字段中,再将它自身的引用存储到ThreadLocal中。分配额外的内存是可选的(泄露类实例就够了),但是这样将加速泄露工作。

线程清除所有自定义类的或者类加载器载入的引用。

重复上面步骤。

  这样是有效的,因为ThreadLocal持有对象的引用,对象持有类的引用,接着类持有类加载器的引用。反过来,类加载器持有所有已加载类的引用。这会使泄露变得更加严重,因为很多JVM实现的类和类加载都直接从持久带(permgen)分配内存,因而不会被GC回收。

  10、使用Java在一个区间内产生随机整数数

  (1422个赞)

  我试着使用Java生成一个随机整数,但是随机被指定在一个范围里。例如,整数范围是5~10,就是说5是最小的随机值,10是最大的。5到10之间的书也可以是生成的随机数。

  解决方案

  标准的解决方式(Java1.7 之前)如下:

import java.util.Random;
public static int randInt(int min, int max) {
    Random rand;
    int randomNum = rand.nextInt((max - min) + 1) + min;
    return randomNum;
}

  请查看相关的JavaDoc。在实践中,java.util.Random 类总是优于 java.lang.Math.random()。

  特别是当标准库里有一个直接的API来完成这个工作,就没有必要重复制造轮子了。


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.