Cóż, API dla Integer.valueOf(String)
rzeczywiście mówi, że String
jest interpretowany dokładnie tak, jakby został przekazany Integer.parseInt(String)
. Jednak valueOf(String)
zwraca obiekt, natomiast zwraca prymitywnych .new
Integer()
parseInt(String)
int
Jeśli chcesz czerpać korzyści z potencjalnego buforowania Integer.valueOf(int)
, możesz również skorzystać z tego narzędzia do usuwania oczu:
Integer k = Integer.valueOf(Integer.parseInt("123"))
Teraz, jeśli to, co chcesz, jest przedmiotem, a nie prymitywne, a następnie przy użyciu valueOf(String)
mogą być bardziej atrakcyjne niż tworzenia nowego obiektu z parseInt(String)
ponieważ ta pierwsza jest stale obecny w poprzek Integer
, Long
, Double
, itd.
Integer.valueOf(Integer.parseInt("123"))
nie ma korzyściInteger.valueOf("123")
aniInteger.valueOf(123)
marnowania cykli, ani rozmiaru twojego programu.Integer.valueOf(String)
wykonuje dokładnie takie samo buforowanie jakInteger.valueOf(int)
. W rzeczywistości jest zaimplementowany jakoInteger.valueOf(Integer.parseInt(…))
…int
. Podpis mówi, że zwracaInteger
i to jest dokładnie to, co robi. Ta odpowiedź jest również częściowo niepoprawna, gdy mówi, że zwraca „nowy”Integer
. Tak nie jest napisane w Javadoc. Zwrot pamięci podręcznej jest bezpłatnyInteger
.Z tego forum :
źródło
jest podobne do
Różnica polega na
valueOf()
zwracaniu anInteger
iparseInt()
zwracaniu anint
(typ pierwotny). Zauważ też, żevalueOf()
może zwrócićInteger
instancję z pamięci podręcznej , co może powodować mylące wyniki, gdy wyniki==
testów wydają się sporadycznie poprawne. Przed autoboxingiem może być różnica w wygodzie, po Java 1.5 nie ma to tak naprawdę znaczenia.Ponadto
Integer.parseInt(s)
może również przyjmować prymitywny typ danych.źródło
Spójrz na źródła Java:
valueOf
używaparseInt
:parseInt
zwrotyint
źródło
Integer.parseInt może po prostu zwrócić int jako typ macierzysty.
Integer.valueOf może faktycznie wymagać przydzielenia obiektu Integer, chyba że ta liczba całkowita przypadkowo będzie jedną z wstępnie przydzielonych. To kosztuje więcej.
Jeśli potrzebujesz tylko rodzimego typu, użyj parseInt. Jeśli potrzebujesz obiektu, użyj valueOf.
Ponadto, z powodu tego potencjalnego przydziału, autoboxing nie jest tak naprawdę dobrą rzeczą pod każdym względem. Może spowolnić rzeczy.
źródło
Warianty parsowania * zwracają typy pierwotne, a wersje valueOf zwracają obiekty. Wierzę, że wersje valueOf będą również korzystać z wewnętrznej puli referencyjnej, aby zwrócić obiekt SAME dla danej wartości, a nie tylko innej instancji o tej samej wartości wewnętrznej.
źródło
Ponieważ możesz używać jdk1.5 + i tam następuje automatyczna konwersja na int. Więc w kodzie najpierw zwracana jest liczba całkowita, a następnie automatycznie konwertowana na int.
twój kod jest taki sam jak
źródło
Jeśli zaznaczysz klasę całkowitą, znajdziesz wartość metody wywołania parseInt. Dużą różnicą jest buforowanie podczas wywoływania wartości API. Buforuje, jeśli wartość mieści się w przedziale od -128 do 127. Więcej informacji można znaleźć pod linkiem
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
źródło
public static static Integer valueOf (String s)
Wynikiem jest obiekt typu Integer, który reprezentuje wartość całkowitą określoną przez ciąg.
Innymi słowy, ta metoda zwraca obiekt typu Integer równy wartości: new Integer (Integer.parseInt (s))
źródło
Integer.parseInt akceptuje tylko ciąg znaków i zwraca pierwotną liczbę całkowitą typu int (int).
Iteger.valueOf accept int i String. Jeśli wartością jest String, wartośćOf przekształca ją na zwykłą liczbę int za pomocą parseInt i zwraca nową liczbę całkowitą, jeśli wartość wejściowa jest mniejsza niż -128 lub większa niż 127. Jeśli wartość wejściowa jest w zakresie (-128 - 127), zawsze zwraca obiekty Integer z wewnętrzna IntegerCache. Klasa całkowita utrzymuje wewnętrzną statyczną klasę IntegerCache, która działa jako pamięć podręczna i przechowuje obiekty całkowite od -128 do 127 i dlatego, gdy próbujemy uzyskać obiekt całkowity dla 127 (na przykład), zawsze otrzymujemy ten sam obiekt.
Iteger.valueOf(200)
da nową liczbę całkowitą od 200. To jest taknew Integer(200)
Iteger.valueOf(127)
samo jakInteger = 127
;Jeśli nie chcesz konwertować ciągu znaków na liczbę całkowitą, użyj
Iteger.valueOf
.Jeśli nie chcesz konwertować ciągu znaków na prosty int use
Integer.parseInt
. Działa szybciej.I porównanie Integer.valueOf (127) == Integer.valueOf (127) zwraca true
Ponieważ pobiera obiekty Integer z tymi samymi odwołaniami z pamięci podręcznej.
Ale Integer.valueOf (128) == Integer.valueOf (128) jest fałszem, ponieważ 128 jest poza zakresem IntegerCache i zwraca nową liczbę całkowitą, więc obiekty będą miały różne odwołania.
źródło
Powinniśmy użyć każdego w zależności od naszych potrzeb. W przypadku ValueOf, ponieważ tworzy on obiekt. zużyje więcej zasobów, jeśli potrzebujemy tylko wartości jakiegoś tekstu, wówczas powinniśmy użyć parseInt, parseFloat itp.
źródło