Выход 1 1 1 1 1 1
, потому что первый оператор for
выполняет цикл по массиву, названный list
, значений (т. е. {1, 2, 3, 4, 5, 6}
) и заменяя каждый на предыдущий, начиная со второго ( index 1
или, как некоторые говорят, 1-й, где «реальный» первый является 0-м ... я отвлекаюсь). Таким образом, текущее значение пункта 2 (индекс 1
) второго элемента (2
) заменяется на значение 1-го (индекс 0
), которое равно 1
: (list[i] = list[i - 1];
, где i = 1
). Это продолжается по массиву целых чисел, пока мы не достигнем конца list
. По мере того как мы заменяем каждое значение на предыдущий, все они в конечном итоге становятся одним и тем же значением - значением первого элемента в массиве, который является 1
. В конце мы имеем это значение для нашего list
: {1, 1, 1, 1, 1, 1}
.
Следующий оператор for
просто распечатывает каждое значение обновленного list
по очереди, за которым следует пустое пространство: System.out.print(list[i] + " ");
. Итак, как вы можете видеть, результатом запуска этого кода является то, что он выводит 1 1 1 1 1 1
.
Просто для того, чтобы вести точку дома более визуально, давайте просто нарисуем значения параметра list
с течением времени:
int i = 1; // i = 1
list[i] = list[i - 1]; // list[1] = list[1 - 1]; list[0] == 1
// list is now {1, 1, 3, 4, 5, 6}
i++; // i = i + 1 # i is now 2
list[i] = list[i - 1]; // list[2] = list[2 - 1]; list[1] == 1
// list is now {1, 1, 1, 4, 5, 6}
i++; // i = i + 1; i = 3
list[i] = list[i - 1]; // list[3] = list[3 - 1]; list[2] == 1
// list is now {1, 1, 1, 1, 5, 6}
i++; // i = i + 1; i = 4
list[i] = list[i - 1]; // list[4] = list[4 - 1]; list[3] == 1
// list is now {1, 1, 1, 1, 1, 6}
i++; // i = i + 1; i = 5
list[i] = list[i - 1]; // list[5] = list[5 - 1]; list[4] == 1
// list is now {1, 1, 1, 1, 1, 1}
i++; // i = i + 1; i = 6
i < list.length; // i == 6; list.length == 6; 6 < 6 == false
// exit the for loop
Я надеюсь, что это поможет вам понять, что игры здесь играют немного лучше. Удачи вам в оставшейся части вашего теста!
Вы могли бы также хотеть изучить Комета .
Это используется GTalk, Meebo и многими другие приложения чата . Несколько лет назад, когда я экспериментировал с ним, не было очень многих библиотек или деталей о серверной архитектуре для реализации его, но похоже, что теперь существует намного больше материала.
Взглянули на проект cometd для большей технической информации.
, Что Вы рекомендовали бы?
XMPP через ЕРУНДУ
нет никакой потребности изобрести Ваш собственный формат сообщения и транспортный протокол, когда кто-то еще имеет. Если Вы попробуете, то это будет медленно расти, чтобы быть столь же сложным как ЕРУНДА, но без преимущества сторонней поддержки библиотеки или стандартизации.
Если Вам не нравится идея опроса HTTP, у Вас мог бы быть фильм Flash на странице чата, которая имеет постоянное соединение с некоторым deamon на сервере, фильм Flash затем вызвал бы функции JavaScript на клиент для обновления чата, поскольку новые сообщения приходят. (Если Вы не хотите интерфейс Flash для своего чата..)
Вы могли бы также хотеть изучить Комету.
я думал, что все использовали cometd для этого вида вещи.
ЕРУНДА является стандартом для переноса XMPP по HTTP. Это включает Комету для продвижения данных клиенту.
Существует очень хороший сервер для обработки продвижения сообщения от сервера до браузера (назвал Комета ) - Вращаемый . Это легко интегрируется с другими технологиями (Django, направляющие, PHP и т.д.) точно так же, как memcached.
действительно необходимо проверить его, если Вы хотите обработать серьезную загрузку. Иначе простой опрос Ajax является лучшим способом.
Прием должен понять, что единственное время, Ваше приложение должно вызвать CGI на сервер, - когда кто-то говорит что-то. Для регулярных опросов опросите статическую страницу, которую обновляет Ваш сценарий CGI каждый раз, когда существует новый чат. Используйте ГЛАВНЫЕ запросы, сравните, метки времени с теми длятся замеченный и только делают полное ДОБИРАЕТСЯ, когда они изменяются. У меня есть простое наивное приложение чата, реализовал этот путь и использование загрузки и пропускной способности незначительно для нескольких десятков одновременных пользователей, которых мы имеем.
Я сделал эту точно ту же вещь несколько месяцев назад и весело провел время, просто играя вокруг с понятиями. Я на самом деле использовал навсегда-кадр техника вместо опроса.
ниже кода моя "комета" js файл, который содержит общие понятия, требуемые получать "партийный чат" настройки.
function Comet(key) {
var random = key;
var title = 'Comet';
var connection = false;
var iframediv = false;
var browserIsIE = /*@cc_on!@*/false;
var blurStatus = false;
var tmpframe = document.createElement('iframe');
var nl = '\r\n';
this.initialize = function() {
if (browserIsIE) {
connection = new ActiveXObject("htmlfile");
connection.open();
connection.write("<html>");
connection.write("<script>document.domain = '"+document.domain+"'");
connection.write("</html>");
connection.close();
iframediv = connection.createElement("div");
connection.appendChild(iframediv);
connection.parentWindow.comet = comet;
iframediv.innerHTML = "<iframe id='comet_iframe' src='./comet.aspx?key="+random+"'></iframe>";
} else {
connection = document.createElement('iframe');
connection.setAttribute('id', 'comet_iframe');
iframediv = document.createElement('iframe');
iframediv.setAttribute('src', './comet.aspx?key='+random);
connection.appendChild(iframediv);
document.body.appendChild(connection);
}
}
// this function is called from the server to keep the connection alive
this.keepAlive = function () {
if (!browserIsIE) {
mozillaHack();
}
}
// this function is called from the server to update the client
this.updateClient = function (value) {
var outputDiv = document.getElementById('output');
outputDiv.value = value + nl + outputDiv.value;
if (blurStatus == true) {
document.title = value;
}
if (!browserIsIE) {
mozillaHack();
}
}
this.onUnload = function() {
if (connection) {
// this will release the iframe to prevent problems with IE when reloading the page
connection = false;
}
}
this.toggleBlurStatus = function(bool) {
blurStatus = bool;
}
this.resetTitle = function() {
document.title = title;
}
function mozillaHack() {
// this hack will fix the hour glass and loading status for Mozilla browsers
document.body.appendChild(tmpframe);
document.body.removeChild(tmpframe);
}
}
Я думал, что все использовали cometd для этого вида вещи.
Я соглашаюсь с John. Но был другой вопрос, на который не ответили.
я сделал это, но вместо того, чтобы использовать базу данных мы использовали плоский файл, это действительно в конечном счете наносило вред серверу, но только когда у нас есть ~450 активных пользователей, и если бы мы сделали это с базой данных, то это, вероятно, тарифицировало бы лучше.
Это было сделано на основном хостинг-аккаунте от Godaddy.
Редактирование: BTW Godaddy звучал меньше затем удивленным, когда я получил телефонный вызов.
Я думаю, опрашивая, самый простой подход и рекомендовал бы это сначала. Если загрузка становится проблемой, запускаются, изучая более сложные методы. Хорошее обсуждение за и против здесь - http://www.infoq.com/news/2007/07/pushvspull
http://ajaxian.com/archives/a-report-on-push-versus-pull
Касса Speeqe . Это решение с открытым исходным кодом для веб-чатов, которое негласно использует BOSH и XMPP.