내 용도는 애플리케이션 코드를 최적화하는 것입니다. 내 코드는 다음과 같습니다메서드가 비효율적 인 새로운 Integer (int) 생성자를 호출합니다. 대신 Integer.valueOf (int)를 사용하십시오.
내가 넷빈즈에 Findbugs에 의해 정적 분석했다int a = 10;
Map<String , Integer> myMap = new TreeMap<>();
myMap.put("first" , new Integer(a)); //[FindBugs] Method com.abc.xyz.Test.main(String[]) invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead
, 그것은 방법 "와 같은 경고/버그가 비효율적 새로운 정수 (INT) 생성자가 호출합니다 것을 보여준다 (Integer.valueOf를 사용 int) 대신 ".
나는 새로운 정수 (int)를 Integer.valueOf (int)를 대의 차이를 알고있다.
하나는 추가 개체를 만들고 다른 개체는 생성하지 않습니다. 또한 하나는 캐싱하지 않으며 다른 하나는 캐싱하지 않습니다.
그래서 나는 또한 (안 findbugs에 의해 에디터로) "정수에 불필요한 권투를"경고를 제공하는 ... 다시 다음과 같이m.put("first" , Integer.valueOf(a)); // Unnecessary boxing to Integer
하지만 내 코드를 수정했습니다.
그래서, 난 ....이 등 다시 마지막으로 모든 경고를 제공하지
m.put("first" , a); //No warning at all...
그것을 변경되었습니다.
내 질문 :1)이 link 제안 내부적으로 (("첫 번째"m.put) 컴파일러에 의해, A);은 에서 변환 중입니다. m.put ("first", Integer.valueOf (a));
(이 예제에는 List-ArrayList가 있으며 여기에는 Map-TreeMap ... FYI가 있습니다). 그러면 편집기에서 경고를 표시하는 이유는 무엇입니까? 그리고 어떻게해야합니까? 최적화 된 방법은 무엇입니까?
2) 만일 대신 맵의 다음 해시 같은 데이터 구조가 있다면 ???
3) 왜 편집기가 제공합니까 정수에 불필요한 권투는입니다.
4.) 왜 m.put ("first", a)이 작동합니까? 나는 프리미티브 변수을 전달하고지도의 put()은 객체 만 허용합니다. 그래서 자동 권투 때문에 그것입니까?
예는 자동 권투로 인해의 1을 참조하십시오. –
OK.thanks ... 그럼 최적화를위한 좋은 방법은 무엇입니까? 마지막 하나 ?? –
나는 당신이 그것을 최적화 할 수 있다고 생각지 않는다, 자동 권투는 당신을 위해 똑같은 일을한다. 그래서 당신은 명시 적으로'valueOf (a)'를 할 필요가 없다. –