В случае ArrayList: remove (int index) - если (индекс - позиция последнего элемента), он избегает без System.arraycopy()
и не занимает времени для этого.
Время arraycopy увеличивается, если (индекс уменьшается), кстати, элементы списка также уменьшаются!
лучший эффективный способ удаления - удаление его элементов в порядке убывания: while(list.size()>0)list.remove(list.size()-1);
// принимает O (1) while(list.size()>0)list.remove(0);
// принимает O (факториал ( n))
//region prepare data
ArrayList<Integer> ints = new ArrayList<Integer>();
ArrayList<Integer> toRemove = new ArrayList<Integer>();
Random rdm = new Random();
long millis;
for (int i = 0; i < 100000; i++) {
Integer integer = rdm.nextInt();
ints.add(integer);
}
ArrayList<Integer> intsForIndex = new ArrayList<Integer>(ints);
ArrayList<Integer> intsDescIndex = new ArrayList<Integer>(ints);
ArrayList<Integer> intsIterator = new ArrayList<Integer>(ints);
//endregion
// region for index
millis = System.currentTimeMillis();
for (int i = 0; i < intsForIndex.size(); i++)
if (intsForIndex.get(i) % 2 == 0) intsForIndex.remove(i--);
System.out.println(System.currentTimeMillis() - millis);
// endregion
// region for index desc
millis = System.currentTimeMillis();
for (int i = intsDescIndex.size() - 1; i >= 0; i--)
if (intsDescIndex.get(i) % 2 == 0) intsDescIndex.remove(i);
System.out.println(System.currentTimeMillis() - millis);
//endregion
// region iterator
millis = System.currentTimeMillis();
for (Iterator<Integer> iterator = intsIterator.iterator(); iterator.hasNext(); )
if (iterator.next() % 2 == 0) iterator.remove();
System.out.println(System.currentTimeMillis() - millis);
//endregion
В отличие от браузера, где переменные по умолчанию назначаются глобальному пространству (то есть окну), переменные узла привязаны к модулю (файлу) , если вы явно не назначили их module.exports .
На самом деле, когда вы запускаете node myfile.js
или require('somefile.js')
, код в вашем файле завернут следующим образом:
(function (exports, require, module, __filename, __dirname) {
// your code is here
});
Все остальные ответы на 100% правильны, но я думал, что добавлю расширенный / окончательный список областей в приложении Node.js, если кто-нибудь встретит это через Google, начиная с изучения Node.js или JavaScript:
Все, что объявлено без ключевого слова var
в любом файле, будет доступно из любого места в одном экземпляре сервера узла:
// foo.js
bar = 'baz';
// qux.js
console.log(bar); // prints 'baz'
Обратите внимание, что это считается плохой идеей, потому что это приложение сильно «связано» - это означает, что вам нужно будет открыть foo.js, чтобы выяснить, почему bar = 'baz'
в qux.js
Все, что объявлено с ключевым словом var
на верхнем уровне (не внутри функции или объекта или любого другого блока) файла node.js, находится в области модуля и будет быть доступным из любого места внутри одного и того же файла, но больше не будет существовать:
// foo.js
var bar = 'baz';
console.log(bar); // prints 'baz'
// qux.js
console.log(bar); // prints 'undefined'
Все, что объявлено с помощью ключевого слова var
внутри функции, будет доступно только from withi n эта функция, а не нигде:
// foo.js
function myFunction() {
var bar = 'baz';
console.log(bar); // prints 'baz'
}
function myOtherFunction() {
console.log(bar); // prints 'undefined'
}
// qux.js
console.log(bar); // prints 'undefined'
JavaScript - это функция с областью действия . В отличие от других языков [ block scoped ), переменные, объявленные в блоке внутри функции , доступны из любой другой части этой родительской функции . Например, это означает, что если вы объявляете новую переменную внутри цикла, она также доступна вне этого цикла, если вы все еще находитесь внутри родительской функции:
function myFunction() {
while (thing === true) {
var bar = 'baz';
thing = false;
}
console.log(bar); // prints 'baz'
}
Если вы обновляете существующую переменную, например используйте ключевое слово var
с именем переменной, которое уже было использовано, тогда значение, связанное с этим именем переменной, будет перезаписано в пределах области действия нового объявления :
var bar = 'foo';
console.log(bar) // prints 'foo'
function myFunction() {
var bar = 'baz';
console.log(bar);
}
myFunction(); // prints 'baz'
console.log(bar) // prints 'foo'
var
, например const
, let
или function
?
– pejalo
24 May 2017 в 20:07
Довольно старый вопрос, и если кто-то интересуется спецификациями ECMA по этому вопросу, вот ссылка
И нет никакого способа прямого доступа для переменных модуля (кроме для импортированных модулей):
Лексическая среда и среда Значения записи являются чисто спецификационными механизмами и не должны соответствовать какому-либо конкретному артефакту реализации ECMAScript. Программа ECMAScript не может напрямую обращаться к этим значениям или манипулировать ими.
blockquote>
Узел имеет область видимости модуля, поэтому var abc = '123'
в модуле создаст переменную, которая привязана к этому модулю (и, следовательно, доступна только для кода).
См. также http : //nodejs.org/api/globals.html#globals_global