Mamy klasy opakowujące w java, takie jak Interger, Float .. dlaczego nadal wspierają one prymitywy, które powstrzymują java, aby być w pełni obiektowym językiem?Kiedy mamy klasy opakowania, dlaczego prymitywy są obsługiwane?
Odpowiedz
Owijarki, będące przedmiotami, zostają umieszczone w stercie. Prymitywy są po prostu "wartościami" i przechodzą w stos. Jest to bardziej efektywne, ponieważ dla zawiniętych prymitywów w stosie potrzebujesz (przynajmniej) zarówno wartości (która jest w stosie), jak i odniesienia do obiektu opakowania.
To, czy ten przyrost wydajności ma znaczenie, zależy od tego, co robisz. W przypadku ciężkiej pracy liczbowej zdecydowanie, ale w 99% przypadków jest to raczej irytujące. Po pierwsze, w ogóle nie możesz przechowywać prymitywów w Kolekcji; ulegają autoboxed. Tak więc jedynym sposobem na przechowywanie ich jest użycie zwykłych tablic, co z kolei może prowadzić do innych rodzajów nieefektywności (na przykład, jeśli trzeba zmienić ich rozmiar).
Ponieważ prymitywy są lżejsze i bardziej wydajne pod względem przetwarzania pamięci i procesora.
Musimy wziąć to pod uwagę podczas pracy z urządzeniami mobilnymi/ręcznymi. –
Ale proszę również rozważyć, czy ma on 10% lub 0,00001% wpływu w konkretnej sytuacji. Optymalizuj tylko, jeśli to ma znaczenie. –
Jedno słowo: wydajność.
Typy opakowania są również niezmienne, co czyni go ekstra kosztownym, jeśli ktoś chciałby na przykład użyć go do licznika pętli.
JVM ma również kody operacyjne do wykonywania bezpośrednio arytmetyki na elementach pierwotnych.
- 1. Dlaczego DIAL (Discovery and launch), kiedy mamy UPnP?
- 2. Dlaczego mamy niezmienną pustą mapę?
- 3. Dlaczego właściwości przechowywane w klasach nie są obsługiwane w klasach?
- 4. Co to są prymitywy rysowania WebGL?
- 5. Dlaczego klasa opakowania Void istnieje w JDK?
- 6. Dlaczego Shadow DOM, gdy mamy iframes?
- 7. Kiedy i dlaczego powinniśmy używać klasy System.ComponentModel.Container?
- 8. Dlaczego VC++ nie może zoptymalizować opakowania całkowitego?
- 9. Dlaczego te fragmenty są inaczej obsługiwane przez GCC?
- 10. Dlaczego operatorzy czasami są samodzielni, a czasami są metodami klasy?
- 11. Jakie są obsługiwane zdarzenia Ember.js?
- 12. Obsługiwane urządzenia są wyjątkowo niskie.
- 13. Jak przeciążać operator indeksu tablic dla klasy opakowania klasy 2D?
- 14. Dlaczego używać kodowania CJSON, gdy mamy json_encode
- 15. Wywołania funkcji nie są obsługiwane w dekoratorze.
- 16. Prymitywy przeciążenia języka Python
- 17. Smukłe klasy synchronizacji są na AppDomain lub na proces?
- 18. Kompilacja ABCL i prymitywy
- 19. Dlaczego przekazywanie portów nie jest obsługiwane?
- 20. Jakie typy plików są obsługiwane przez WKWebView?
- 21. Długie wektory mclapply nie są jeszcze obsługiwane
- 22. Jak długo są obsługiwane wersje Grails?
- 23. Animacje jQuery nie są prawidłowo obsługiwane
- 24. Jakie funkcje ES6 są obsługiwane w JSX?
- 25. WCF: operacje bez parametrów nie są obsługiwane
- 26. Ukryj prymitywy nagłówek kolumny tabeli
- 27. Dlaczego funkcje konstruktora zwracają obiekty, ale nie prymitywy w JavaScript?
- 28. MIPS: Dlaczego potrzebujemy bajta obciążenia, gdy mamy już słowo load?
- 29. Kiedy opróżnione są PLIK?
- 30. Zasoby Crossrider są obsługiwane z HTTP zamiast Https
Czy są jakieś inne powody niż przechowywanie? – GuruKulki
Nie jestem w 100% pewny, jak działają tutaj wewnętrzne elementy, ale uważam, że aby obliczyć wszystko za pomocą liczb, maszyna musi najpierw wyodrębnić wartości z owijki (rozpakowywanie), która wymaga przynajmniej części pracy. Jednak optymalizacja środowiska uruchomieniowego JIT prawdopodobnie gra tutaj swoje sztuczki, więc różnica ta może być praktycznie pomijana w praktyce, nawet w programach intensywnych liczbowo. Należy to zmierzyć, aby mieć pewność. –