Будет ли вторая реализация включать несколько изменений размера HashMap или оптимизирована для выделения достаточно памяти?
В вашем коде первый. См. https://stackoverflow.com/a/51333961/139985
Стоит отметить, что для вашей текущей реализации:
- Большая часть дополнительная память, потребляемая путем изменения размера, будет восстановлена при следующем запуске GC.
- После окончания
collect
вы все равно можете получить основной массив хэшей, который в два раза больше. Память «впустую» может составлять до 8 байтов на запись в таблице, но в среднем она будет 4 байта на запись.- Тем не менее, узлы ввода хешей будут самым большим потребителем памяти в a
HashMap
. Каждая запись потребляет примерно 32 байта ... в дополнение к пространству, используемому для представления ключа и значения.(Приведенные выше числа предполагают 64-битные ссылки.)
В качестве альтернативы, если вы используете перегрузку аргумента 4 в
toMap()
, вы можете предоставитьSupplier
для созданияMap
для заполнения. Это позволяет сделать следующее:
- Выделить
HashMap
с начальной мощностью, достаточной для того, чтобы избежать изменения размера, но не слишком большого.- Используйте (гипотетический) альтернативная реализация
Map
, которая использует меньше памяти для каждой записи, чемHashMap
.- Создайте оболочку, чтобы заполнить объект, похожий на карту, который не реализует
Map
... для вашегоK
иV
. (Например, вы могли бы использоватьTLongObjectHashMap
в библиотеке GNU Trove.)(В последних двух случаях целью является найти
Map
или «map-like «класс, который использует меньше памяти (для ваших типовK
иV
), но все же имеет соответствующую производительность для поиска.)
Это не файл, а стандарт HTML5, который работает в браузерах. В предоставленной вами ссылке язык навигации находится в теге script. Если вы поместите метод navigator.geolocation в функцию getUserLoc()
, которая выполняет чуть больше, чем setState с координатами при щелчке, вы сможете обновить положение карты, установив состояние. Вы установили бы начальное состояние в конструкторе LandingPage, а затем передали функцию `getUserLoc () вашему компоненту NavBar, где ее можно запустить с помощью this.props.getUserLoc ().
const mapStyles = {
width: '100%',
height: '100%'
};
export class LandingPage extends Component {
constructor(props) {
super(props)
this.state={
lat: 28.871812,
lng: -34.814106
}
this.getUserLoc = this.getUserLoc.bind(this)
}
getUserLoc() {
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(function(position) {
var pos = {
lat: position.coords.latitude,
lng: position.coords.longitude
};
this.setState({
userLat: pos.lat,
userLng: pos.lng
})
});
} else {
// Browser doesn't support Geolocation
handleLocationError(false, infoWindow, map.getCenter());
}
}
render() {
return(
<div>
<Map
google={this.props.google}
zoom={3}
style={mapStyles}
initialCenter={{
lat: this.state.userLat,
lng: this.state.userLng
}}
>
</Map>
<NavBar getUserLoc={this.getUserLoc}/>
</div>
)
}
}