Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Маленький тест |
Автор: Domestic Cat 21.6.2004, 17:06 | ||
Думаю что многие знают, но все же ![]() Есть такая программа:
Вопрос: что она выдаст если ее запустить: java Test * ![]() |
Автор: Sun 21.6.2004, 17:53 |
Список файлов в текущей директории? |
Автор: AntonSaburov 21.6.2004, 17:55 |
Век живи, век учись - дураком помрешь. Я не знал. Класс. |
Автор: Domestic Cat 21.6.2004, 18:03 |
![]() ![]() Под UNIXом можно попробовать еше java Test .* и получить список hidden фаuлов. |
Автор: Nobody 21.6.2004, 18:07 |
Ну вполне логично вообще-то. Шелл заменяет * на список файлов. |
Автор: Sun 21.6.2004, 18:26 |
Мне еще нравиться загадка как изменить этот класс, не делая никаких изменений в методе main, чтобы он вывел например строку "Hello, world!". |
Автор: Domestic Cat 21.6.2004, 19:30 |
java Test "Hello, World!" ?![]() |
Автор: DarkDS 21.6.2004, 21:06 | ||||||
Для виндозы то же что и при
А
![]() ![]() |
Автор: Domestic Cat 21.6.2004, 21:17 | ||
Кстати, создав фаил
классы можно компилить так: javac @f ![]() |
Автор: Sun 22.6.2004, 11:02 | ||||
Нет, я имел в виду как поменять скажем такой класс
не меняя текст метода main вывести первой строкой "Hello, World!" |
Автор: Domestic Cat 22.6.2004, 15:25 | ||
Ну так ето еше проше :
- поскольку static блоки и переменные всегда инициализируются первыми |
Автор: Domestic Cat 22.6.2004, 15:39 | ||
Кстати тогда другои вопрос - как, не меняя метода main сделать так чтобы программа напечатала только "Hello, World" ? Ну и заодно - как, не меняя метода main сделать так, чтобы программа
печатала "Hello World" при одновременном нажатии 2х клавиш? |
Автор: AntonSaburov 22.6.2004, 15:57 | ||
Т.е. уже издеваемся ![]()
|
Автор: Domestic Cat 22.6.2004, 16:03 |
Ага - ето про первыu вопрос ![]() ![]() PS. Можно добавить один класс, но GUI и KeyListener использовать нельзя |
Автор: ElectricalStorm 22.6.2004, 19:20 |
Domestic Cat класс побольше бы таких приколов... |
Автор: Domestic Cat 22.6.2004, 19:41 | ||
![]() ![]() ![]() сформулирую вопрос еше раз: что нужно добавить к классу
чтобы при одновременном нажатии 2х клавиш программа напечатала "Hello World" 1. Изменять main нельзя 2. Пользоваться GUI / Listenerami и Stream'ами (кроме System.out.println) нельзя. 3. Можно добавить 1 класс ![]() |
Автор: ElectricalStorm 22.6.2004, 19:58 |
Можно сделать класс потомок от Thread и в статике как показанно выше запустить поток... если так нельзя то я предпологаю что эти магитческие две кнопки Ctrl + D или Z или С тоесть например ситается ввод все в том же статике через System.in а по завершению ввода печатаем Hello и выходим наверно что типа такого ... ![]() |
Автор: LSD 22.6.2004, 19:59 | ||
Отзывается на Ctrl+Break ![]() ![]() ![]() |
Автор: Domestic Cat 22.6.2004, 20:08 |
Браво LSD ![]() ![]() Было бы у меня 100 постов добавил бы репутацию ![]() ![]() ![]() |
Автор: LSD 22.6.2004, 20:41 |
Переживу ![]() А вот мой: можно ли запретить наследование не объявляя класс final? |
Автор: DarkDS 22.6.2004, 20:56 | ||
Объявить все конструкторы приватными ![]() |
Автор: Domestic Cat 22.6.2004, 20:59 | ||
|
Автор: DarkDS 22.6.2004, 21:01 | ||||||
так все равно проще:
|
Автор: Domestic Cat 22.6.2004, 21:07 |
Согласен ![]() |
Автор: Domestic Cat 22.6.2004, 21:40 | ||
Ок, вопрос такоу: Сколько памяти на хипе заuмет Object (то есть полученныж как Object object = new Object()) . Сколко памяти нужно на об#ект если он содержит поле типа byte (boolean, int, long, double, float)? ![]() PS, Naprimer
|
Автор: AntonSaburov 23.6.2004, 17:13 |
Я тут тестик навалял - у меня такие вот числа получились: Просто Object жрет аж 200 байтов. Хотя я не понял -почему. Надо покопатьс в документации. Или может кто подскажет. А любое поле (byte, float, double ...) добавляет еще 8 байт. |
Автор: Domestic Cat 23.6.2004, 17:40 | ||||
По идее Object ест только 8 баuт плюс 8 баuт на лyбое поле, хотя если примитив меньше 8 баuт то JVM впихивает 2 примитивa в те же 8 баuт.![]()
nu a MyFactory menjaem kak hotim:
|
Автор: LSD 23.6.2004, 19:02 | ||
1) Это по моему зависит от реализации JVM 2) А как вы выяснили? 3) Domestic Cat у вас случайно не Power Mac G5? От класса с приватными конструкторами может наследовать внутренний класс. И если он public то от него можно вполне успешно наследовать дальше ![]() |
Автор: Domestic Cat 23.6.2004, 21:53 |
1. Зависит, но вроде на многих дает 8 баит на примитив. Интересно сравнить с M$JVM 2. Выяснили что ? ![]() 3. 700 MHz PowerPC G4 / 384 MB SDRAM А вопрос хоpоshии ![]() |
Автор: LSD 23.6.2004, 22:12 | ||||
Как выяснили сколько байт идет на примитив, и на пустой объект.
А я надеялся что 64 битная машинка, можно было-бы сравнить разные JDK. Запретить наследование от класса можно приватными конструкторами, throw Exception, System.exit() и т.д. не запрещает наследовать, но не дает создавать экземпляры объекта при помощи конструктора. При большом желании это можно обойти сериализацией. Но если все-таки есть внутренний класс, и если он public то от него можно вполне успешно наследовать дальше. А как от него наследовать если он не static? |
Автор: Domestic Cat 23.6.2004, 23:04 | ||||
В пред-предыдушем посте программа, она сравнивает размер хипа до и после new MyObject. От внутреннего класса можно наследоват так:
Но вот если нет inner static класса ... ![]() Kласс! ![]() |
Автор: Domestic Cat 24.6.2004, 17:06 | ||||
![]() ![]() ![]() Dodumalsja, odnako ![]()
Добавлено @ 17:15 Мои вопрос: // простоu ![]() есть программа:
Kak изменить цвет подписи на кнопке если 1. добавлять вызов каких-либо методов в методы класса MyFrame нельзя 2. button - инстанс JButton, добавлять своu класс наследуюшиu от JButton нельзя |
Автор: LSD 24.6.2004, 18:42 | ||
И вызываем findThatDamnButton() для экземпляра MyFrame ![]() |
Автор: Domestic Cat 24.6.2004, 18:57 |
Хорошо ![]() ![]() |
Автор: LSD 24.6.2004, 19:11 |
А методы добавлять в MyFrame можно или его вообще изменять нельзя? |
Автор: Domestic Cat 24.6.2004, 19:17 |
Да, надо было мне лучshе правила продумать ![]() Даваuте так: Nel'zja дописывать novye классы (inner, nested, top-level), novye методы (main, ...) и novye вызовы методов в init i constructor. |
Автор: LSD 24.6.2004, 19:34 | ||
|
Автор: Domestic Cat 24.6.2004, 19:41 | ||
Nel'zja дописывать novye классы (inner, nested, top-level), novye методы и novye вызовы методов в init, main i constructor. UIManager.put("Button.foreground" , Color.RED); - eto vyzov medoda ![]() |
Автор: LSD 24.6.2004, 19:48 |
Исходный код вообще main() не содержит значит его и запустить можно только из вне. Я так и предпологал делать. Переформулирую вопрос а что вообще можно делать с MyFrame? Методы переписывать можно? Если его никак не менять и запусткать его а не свой класс, то один выход мучить JDK ![]() ![]() ![]() |
Автор: Domestic Cat 24.6.2004, 20:01 |
Можно менять аргументы передаваемые методам ![]() |
Автор: LSD 26.6.2004, 12:23 | ||
Единственный метод аргументы которого мы можем поменять это main(), но он их не использует никак, так что единственный вариант это мучить JVM, пытаясь вызвать загрузку свих классов, до MyFrame. |
Автор: Domestic Cat 26.6.2004, 19:48 | ||
![]()
![]() ![]() ![]() |
Автор: AntonSaburov 28.6.2004, 11:22 | ||
Мда-а-а. А ведь встречал я такой вариант. |
Автор: Domestic Cat 29.6.2004, 21:33 | ||
Ну это совсем просто (![]() что выдаст такая программа (отвечать быстро, не задумываясь)
|
Автор: LSD 29.6.2004, 21:49 |
Вот это что мне не нравиться в Java, все эти сишные штучки пред и пост инкременты, только запутывают код. Должна быть 10. |
Автор: Domestic Cat 30.6.2004, 01:36 | ||
![]() Что ж, еше вопрос. Предположим, что на момент запуска данноu программы у нас 12 января 2004 года и ровно 15 часов 10 минут. Программа исполняется в течение 1 миллисекунды (это всего лишь предположение ![]() Вопрос: Какого цвета будет панель если для заливки использовать color?
|
Автор: AntonSaburov 30.6.2004, 11:57 | ||
Набросал такой вот тест - хотя по идее можно было бы подсчитать. В JavaAPI вся необходимая информаци есть. Но может я не совсем прав и есть какой-то трюк ?
|
Автор: Domestic Cat 30.6.2004, 15:21 |
Согласен ![]() только 1. Январь - это не 1 а 0 2. gc.getTimeInMillis() будет давать каждыu раз разные значения, нужно обнулять последние цифры ![]() |
Автор: AntonSaburov 30.6.2004, 16:09 | ||||
Да, тут ошибочка вышла ![]()
У меня не дает - специально проверял. |
Автор: Domestic Cat 30.6.2004, 16:15 | ||
Да, у меня тоже ошибочка - GregorianCalendar деuствительно устанавливает секунды/миллисекунды на 0. Я писал
- тогда их нужно самому занулять ![]() |
Автор: AntonSaburov 30.6.2004, 16:42 |
Кстати тема хорошая получилась - можно попробовать ее причесать и выкатить что-то вроде Tips&Tricks. И вести ее постоянно. |
Автор: Sun 30.6.2004, 17:30 | ||
Хорошая идея. Мне эта тема тоже очень нравиться. |
Автор: Domestic Cat 30.6.2004, 18:11 | ||
Неплохо было бы ![]() |
Автор: Domestic Cat 1.7.2004, 16:05 | ||
Продолжим. Есть такая программа:
Nuzhno, чтобы в текстовом поле при нажатии любоu клавиши отображался ее код. Пользоваться любыми Listener'ами нельзя. Других ограничении нет. |
Автор: LSD 1.7.2004, 21:51 | ||
|
Автор: Domestic Cat 1.7.2004, 22:07 |
![]() ![]() |
Автор: Domestic Cat 1.7.2004, 23:39 |
Предположим, вы запустили многопотоковую программу и вам кажется что она зависла. Как определить, находится ли она в состоянии дедлока в данныu момент? |
Автор: Sun 2.7.2004, 10:55 |
killall -3 java? |
Автор: Domestic Cat 2.7.2004, 20:37 |
По-моему, Ctrl + \ или Ctrl + break ![]() |
Автор: Sun 2.7.2004, 20:53 | ||
Да, но когда Java запущена как демон (например Tomcat), то такой вариант больше подходит ![]() |
Автор: LSD 2.7.2004, 23:45 |
Это зависит от JVM, например Microsoft JVM такого не делает, если JVM запущенна без консольного окна (под виндами это javaw) то это тоже не сработает. У меня другой вопрос, как получить (програмно) все потоки которые в данный момент активны? |
Автор: Domestic Cat 2.7.2004, 23:56 | ||
|
Автор: Domestic Cat 3.7.2004, 00:47 |
Слова "кафе" и "бэби" - кому-нибудь о чем-нибудь говорят? ![]() // Хотя я знаю кто ответит первым ![]() |
Автор: LSD 3.7.2004, 01:00 |
CA FE BA BE заголовок класс файла ![]() ![]() ![]() Давай детка выпьем кружечку кофе (того самого) ![]() ![]() ![]() Добавлено @ 01:03 Кстати а где оставил о себе память Марк Збыковский? /** @hint к Java не относится */ |
Автор: Domestic Cat 3.7.2004, 01:23 |
![]() ![]() ![]() ![]() |
Автор: Domestic Cat 3.7.2004, 01:43 |
Пусть у меня есть программа и я не хочу, чтобы юзер мог запустить 2 или больше копиu данноu программы на одноu и тоu же машине. Нужно... |
Автор: Domestic Cat 5.7.2004, 16:42 | ||
Один из вариантов: открывать сокет на определенном порту, в случае поимки BindException делать System.exit(1). Есть программа:
Pochemu она бyдет выдавать разные значения на разных ОС? |
Автор: ElectricalStorm 5.7.2004, 18:01 |
CA FE BA BE заголовок класс файла - КЛАСС |
Автор: LSD 5.7.2004, 18:57 | ||||
Ну еще есть вариант с файлами, но для апплета они не подходят оба ![]()
А почему она должна выдавать одинаковые результаты? Результаты вариируются от запуска к запуску, не говоря уж о использовании разных режимов выполнения (-client, -server, -Xint). |
Автор: Domestic Cat 5.7.2004, 19:06 |
Хм, pечь идет о совсем разных результатах ![]() java -Test значения отличаюшиеся на, скажем, <= 5f cчитать одинаковыми. Добавлено @ 19:09 Хинт: на Маке она выдаст что-то около 1, а вот на 95, 98, XP ![]() |
Автор: LSD 5.7.2004, 19:13 |
Ну под W2K + Sun JDK, System.currentTimeMillis() выдает результат с точность 10мсек, а под другими системами и другими JDK ситуация может быть иная. |
Автор: Domestic Cat 5.7.2004, 19:20 |
Ага, только проблема не у System.currentTimeMillis(), а у таuмера ОС. Точность таuмеров такая: Windows 95/98/Me: 55 ms Windows NT/2000/XP : 10-15 ms Mac / Linux : 1 ms Tak что если я вывожу 50 фреuмов / сек и обновляю экран каждые 20 мс, то на 98 виндах каждыu второu фреuм выпадет ![]() |
Автор: LSD 5.7.2004, 19:34 |
Если обновлять по таймеру может быть, а если в цикле, то все зависит от скорости системы. |
Автор: Domestic Cat 5.7.2004, 19:39 |
Обычно обновляется по таuмеру, в играх например. Иначе картинка будет дергаться поскольку нагрузка процессора в разные моменты времени будет разноu. Добавлено @ 19:41 Хотя в утилитах Java3D / Windows есть более точныu таuмер. |
Автор: redrick 6.7.2004, 01:29 |
а эти времена определяются только реализацией JDK или это принципиальные ограничения осей(хотя с чего бы) ? |
Автор: Domestic Cat 6.7.2004, 02:05 |
"... точность зависит от оперционноu сuстемы. Например, многие ОС измеряjут время в десятках миллисекунд". http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#currentTimeMillis() |
Автор: redrick 6.7.2004, 02:09 |
понятно, спасибо |
Автор: Domestic Cat 6.7.2004, 15:42 | ||
Программа:
Надо, чтобы юзер мог набрать произвольныu Java-код в JTextArea. При нажатии на кнопку этот код должен быть записан в метод main созданного программоu java-фаила, скомпилирован и выполнен. PS. Runtime использовать нельзя ![]() |
Автор: AntonSaburov 6.7.2004, 16:04 |
Если ответ в com.sun.tools.javac.Main.compile, то есть еще одно предложение - при запуске программы в CLASSPATH не использовать tools.jar ![]() Т.е. запуск программы должен быть просто java Test P.S. Само собой, что и в системной переменной CLASSPATH этой библиотеки быть не должно. |
Автор: Domestic Cat 6.7.2004, 16:27 | ||||
![]()
![]() А я так и запускаю, кроме того у меня -то и tools.jar нет, и CLASSPATH не выставлен (bad baad Apple ![]() |
Автор: AntonSaburov 6.7.2004, 16:36 |
Но ведь где-то у тебя должен быть com.sun.tools.javac.Main ? |
Автор: Domestic Cat 6.7.2004, 16:42 |
Он сидит в classes.jar, вместе с java, javax, sunw, org и sun. |
Автор: AntonSaburov 6.7.2004, 16:49 | ||
Понятно. Под Винду в версии 1.4 он находится в отдельном JAR-файле tools.jar. Ладно, тогда обобщим вопрос ![]() Как можно использовать классы из JAR-файла, не указывая этот файл в опции -classpath ? |
Автор: Domestic Cat 6.7.2004, 17:01 | ||
Поместить его в ext директорию, которую можно наuти так:
![]() |
Автор: LSD 6.7.2004, 19:57 | ||
Можно реализовать свой ClassLoader. Вот мне не понятен другой вопрос: если во время работы программы изменить classpath (System.setProperty()), то никакого влияния на SystemClassLoader это не оказывает, может есть еще варианты? |
Автор: Domestic Cat 6.7.2004, 21:41 | ||
Можно запустить
но разницы особож нет ![]() |
Автор: LSD 6.7.2004, 21:59 |
Не это не вариант. С таким же успехом я могу написать батничек. Мне надо как-то реализовать, механизм плагинов, вот я и думаю как. Идеально если для пользователя это будет так: - поместил в нужный каталог jar - в меню включил появился плагин, ты его если надо выключил вот пока думаю как бы это реализовать. |
Автор: Domestic Cat 6.7.2004, 23:54 | ||
Ну вот что-то типа того:
|
Автор: DarkDS 7.7.2004, 13:19 | ||
Оффтоп. Подобная тема уже поднималась. Я как то объяснял уже один из вариантов ![]() http://forum.vingrad.ru/index.php?showtopic=11906&st=0entry76499 |
Автор: Domestic Cat 7.7.2004, 15:23 | ||
Я чего-то не понял. Там же о создании обэцктов при заранее неизвестном названии класса ? |
Автор: Domestic Cat 7.7.2004, 15:50 | ||
Данную программу можно "ускорить" на 30%(на Маке; на Wиндах может быт меньше). Как?:
Mozhno добавлять поля, умножение, деление и кастинг. PS. Vnutri ciklov nichego ne menjat'. Tochnost' derzhat' do 3x znakov posle zapjatoj. |
Автор: AntonSaburov 7.7.2004, 16:01 | ||
Вот такой вариант у меня получился ![]() При этом скорость выросла на вскидку раза в 4-5 под Виндой.
|
Автор: Domestic Cat 7.7.2004, 16:05 | ||
![]() Более обwиu вариант
4-5 raz - WOW |
Автор: AntonSaburov 7.7.2004, 16:27 | ||
Через java -Xprof Test получил 1.9 и 11.6 секунд. |
Автор: Domestic Cat 7.7.2004, 16:29 |
java -Xprof Test Удобная штука - показывает сколько времени потрачено на выполнение, плюс на каждый метод отдельно (в %) // Pochti 10 raz ![]() ![]() ![]() |
Автор: DarkDS 7.7.2004, 16:43 | ||||
Так "механизм плюгинов" как раз такой и есть ![]() |
Автор: Domestic Cat 7.7.2004, 16:55 |
ОК ![]() 1. Kstati: известно что есть две части хипа: "молодоu" хип (young heap) и "старыu" (tenure heap). Как узнать сколько раз в течение времени выполнения был запушен сборшик мусора, сколько он собрал на каждоu части хипа, и сколько времени он потратил? 2. Сборка мусора в старом хипе длится на 1-2 порядка дольше. Если программа создаeт много обeктов (3D шутер скажем), то это будет давать лаг. Как минимизировать сборку мусора на старом хипе? |
Автор: LSD 7.7.2004, 19:13 |
Как создать экземпляр класса в Runtime я представляю, у меня вопрос в том как это класс загрузить если он не был прописан в CLASSPATH и как определить тот ли это класс что я ищу (реализует ли он необходимый интерфейс) не загружая этот класс. Со воторым вопросом можно разобраться потребовав прописать в mainfest нужный класс. Но вот как сделать так чтобы SystemClassLoader загружал файлы из данного jar? Если использовать вариант Domestic Cat с URLClassLoader, то придется предварительно грузить все классы из jar-а, иначе при запуске плагина он может не обнаружить некоторых классов. Это не желательно по тому что плагин может и не использоваться, кроме как получить его имя и показать новый пункт меню, и тогда все эти классы не нужны. У меня вопрос такой Domestic Cat написал программу которая показывает все Thread-ы, созданные "нормальным" образом, а как ее можно обмануть? Т.е. запустить в той же JVM Thread так чтобы она его не увидела? |
Автор: Domestic Cat 7.7.2004, 19:59 | ||||
LSD, может тебе в сторону Avalon посмотреть (http://avalon.apache.org/) ? Я не работал с ним, но говорят что-то подобное делает:
Nu а чтобы обмануть программу, нужно написать сабкласс ThreadGroup и сделать override метода activeCount()
|
Автор: LSD 7.7.2004, 20:20 |
Хорошее решение я пошел более радикальным путем, без субклассов. |
Автор: Domestic Cat 7.7.2004, 20:29 | ||
А каким, интересно? ![]() |
Автор: DarkDS 7.7.2004, 20:36 | ||
Эта... Кстати... Создай по этому тему... тама и пообсуждаем ![]() |
Автор: Domestic Cat 7.7.2004, 20:45 |
Опять флууудим-с ? ![]() Добавлено @ 20:47 Вопрос про хип не закрыт ![]() |
Автор: LSD 7.7.2004, 21:17 | ||||
Я использовал приватный конструктор ThreadGroup. Хотя тут могут быть проблемы с SecurityManager.
Я пока гляну на Avalon, а там если будут вопросы или не понравиться создам. |
Автор: Domestic Cat 8.7.2004, 16:00 | ||||
1. Чтобы узнать о том, что делал сборщик мусора (=gc), нужно запустить программу с опцией -verbose:gc Типичный результат будет таким:
(если сборки мусора не было, то ничего он не выдаст конечно) GC обозначает сборку на молодом хипе, Full GC - на старом; далее идет : [размер хипа до -> размер после (общий размер хипа), вреня потраченное на сборку] Как видим, сборка на старом хипе заняла в 10 раз больше времени чем на молодом - правда комп был в плохом настроении, обычно в этом же шутере сборка длится в 10 раз быстрее на обеих частях хипа. Более подробную инфу осборке можно получить так: -XX:+PrintGCDetails:
DefNew соответствует молодому хипу, Tenured - старому. Длительность сборки зависит от размера хипа, поскольку молодой хип меньше, то и убирается он быстрее. Все созданные обьекты попадают сначала на молодой хип; если в течение некоторого времени они все еще нужну, они перемещаются на старый хип. |
Автор: ElectricalStorm 8.7.2004, 16:08 |
Domestic Cat - большое спасибо за информацию !!! очень интересно |
Автор: Domestic Cat 8.7.2004, 16:30 | ||||||
2. Первоначально хип имеет достаточно маленький размер. По мере его заполнения, JVM пытается высвободить место, убирая мусор. Если это не удается, JVM увеличивает размер хипа. Если программа создаэт много обэктов в короткий промежуток времени, то JVM много времени будет уделять перезапускам gc, увеличениям хипа, и т д. Чтобы минимизировать сборку мусора, нужно изначально создавать достаточно большой хип. Чтобы узнать необходимый размер, проведем мониторинг памяти:
Программа определяет минимальный/максималный размер хипа, выделенной памяти и приращения. Для сбора данных я из цикла вызиваю метод takeSample(); при выходе/заверщении просто передаю обэкт класса MemMonitor в System.out. При запуске того же шутера я получил:
(Желательно конечно поработать дольше) За время выполнения было сделано 29 уборок мусора на молодом хипе, и 11 - на старом, что заняло около 4 секунд! Видно, что JVM начинает с хипа в 4 мб; он увеличивается до 40 мб. Чтобы посчитать приблизительный размер молодого хипа, учтем ,что приращение за 1 фрейм составляет 162.8 кб; при прорисовке 10 фрэймов/сек за 10 сек мы получим ~ 10 мб идет в молодой хип. Скажем JVM теперь что изначально нужно 40 мб хипа и 10 мб молодого хипа: java -Xms40m -Xmn10m -verbose:gc Test Вот что я получил:
Всего 4 уборки мусора на молодом хипе - и игра идет гораздо плавнее ![]() |
Автор: ElectricalStorm 8.7.2004, 16:40 |
у меня вот эта команда java -Xms40m -Xmn4m -verbose:gc Test ничего не выдает пустую строку ![]() |
Автор: Domestic Cat 8.7.2004, 16:47 | ||||
Имеется в виду, что Test- название вашего java-класса; кроме того программа должна создавать МНОГО обьектов, иначе просто сборшик мусора не запускается - собирать нечего. Чтобы подключить MemMonitor, нужно из цuкла (например, цuкла анимации) вызывать takeSample(). Добавлено @ 16:53 Попробууте такую программу:
java -verbose:gc Test u поекспериментируuте с размерами хипов. |
Автор: ElectricalStorm 8.7.2004, 16:59 |
Спасибо ! все получилось |
Автор: ElectricalStorm 8.7.2004, 17:14 |
А вы не могли рассказать про способы оптимизации Java програм ?![]() |
Автор: Domestic Cat 8.7.2004, 17:33 |
![]() Не претендую на абсолютную истину, но попробую. Не оптимизируйте! Пишите программы, которые понятны, легко дебагить и модифицировать. На самом деле конечно оптимизировать нужно. Чтобы понять что оптимизировать, помните, что в основном нагрузка приходится на 10-20% кода. Узнать какой метод наиболее задействован мозжно, запустив с флагом -Xprof. На самом деле HotSpot и JIT (Just-In-Time Compiler) делают большую работу по оптимизации. Можно легко найти инфо по этому вопросу. В целом же оптимизация программы программистом сводится к: 1. Использованию оптимальных алгоритмов. Например, для быстрого поиска используйте HashMap, он быстрее чем, скажем TreeMap. 2. Старайтесь использоват побитовые операции. Вместо х/32 луче использоват х >> 5; вместо х % 32 - х & 31 (31 = 32 - 1). Работает только для степеней 2. 3. Заменяйте умножение на суммирование, возведение в степень - на умножение. 4. Используйте готовые таблицы значений. Например, если нужно считать синус/косинус и большая точность вычислений не нужна, используйте готовую таблицу для синуса. 5.Заменяйте операции с float, double на операции с int и делайте кастинг назад в float (тут на предыдущей странице пример есть ) 6. Используйте Buffered{}Stream 7. Если нужен рандом -доступ к большим файлам (несколько мб), используйте memory-mapped files (см MappedByteBuffer в Java API). Программа может читать из MappedByteBuffer почти так же быстро, как из памяти. |
Автор: ElectricalStorm 8.7.2004, 18:06 |
Большое спасибо .... мотаем на ус ... Вот при компиляции javac версии 1.4 без флагов используется технология HotSpot и JIT или это специальные программы выполняют стандартный компилятор это не делает ? |
Автор: Domestic Cat 8.7.2004, 18:15 |
При компиляции javac делает небольшие оптимизации (можно ради интереса декомпильнуть class-фаuл и посмотреть). "Еше" больше oптимизировать можно, компилируя с флагом -O, но я особоu разницы не замечаю. JIT же, как следует из названия, дополнительно компилирует при запуске JVM (java MyClassName), на 1.4 тоже; причем его оптимизации очень сушественные. Опять-таки, дополнительную оптимизацию дает запуск с флагом -server (java -server MyClassName), например, тогда JIT может "развернуть" цuклы. |
Автор: ElectricalStorm 8.7.2004, 18:31 |
понятно спасибо ! |
Автор: Domestic Cat 8.7.2004, 19:19 |
Не за что ![]() Ну и вопрос в тему: как сменить иконку java-программы с "Hot Java" на какую-нибудь другую? |
Автор: LSD 8.7.2004, 20:53 |
setIconImage() У меня нет -Xmn в списке команд ![]() А есть возможность узнать распределение по старому и молодому хипу програмно? |
Автор: Domestic Cat 8.7.2004, 21:09 | ||||||
работает не всегда. Меняет ли он иконку на панели задач?
- в списке (java -X) ее нет, но работает ![]()
Po-moemu, нет. Можно узнать только размер всего хипа. |
Автор: LSD 8.7.2004, 21:11 | ||
Под виндами меняет и на панели задач и у диалоговых окон для которых это установленно как родительское. |
Автор: Domestic Cat 8.7.2004, 21:15 |
Тогда соррu. На Маке не меняет, зато -Xdock:icon=logo.gif работает |
Автор: Domestic Cat 9.7.2004, 16:04 | ||||
Программа:
chto нужно добавить чтобы при нажатии кнопки "Repaint" прекратилась прорисовка овала? Нужно выключить только repaint события (то есть posle нажатиja на "Turn repainting off" овал не прорисовывается, но дата в консоль выводится esli nazhimat' "Repaint"). Можно: 1. добавлять код в
2. создавать другие классы Менять код в программе нельзя. |
Автор: Domestic Cat 10.7.2004, 21:39 | ||
![]() Ответ простоu:
|
Автор: Domestic Cat 12.7.2004, 15:29 | ||
Какие 2 строки нужно добавить чтобы получить в результате true? Приравнивать string1 i string2 нельзя. |
Автор: Domestic Cat 12.7.2004, 15:46 | ||||
Имеется в виду, что нельзя использовать выражения типа
и
|
Автор: Sun 12.7.2004, 16:35 | ||
|
Автор: Domestic Cat 12.7.2004, 17:13 |
Согласен ![]() |
Автор: Domestic Cat 12.7.2004, 17:28 | ||
А как узнать сколько было создано обьектов класса Float и Integer после выполнении этоu программы:
|
Автор: Domestic Cat 13.7.2004, 19:48 |
Ответ опять простой : java -Xaprof Test - выдаст количество созданных объектов каждого класса (за все время выполнения программы) и занятое ими место. |
Автор: Domestic Cat 14.7.2004, 15:56 | ||||
Простой бенчмарк:
Частенько я получаю нечто наподобие: Loop time: 22 milliseconds Method time: 17 milliseconds Method time - Loop time: -5 milliseconds Почему пустoй цикл медленнее чем цикл с вызовом метода ? ![]() ![]() Еще интереснее станет если изменить метод, например
Опять получаем: Loop time: 22 milliseconds Method time: 16 milliseconds Method time - Loop time: -6 milliseconds Почему цикл с вызовом непустого метода быстрее пустого цикла? |
Автор: Domestic Cat 15.7.2004, 15:45 |
Чуствую приходит шизофрения: сам спрашиваю, сам себе же и отвечаю ![]() |
Автор: LSD 15.7.2004, 19:58 |
Результат довольно нестабильный, после 3-4 запуско все становится на свои места. Я думаю все дело в JIT. Если запускать с -Xint, то loop всегда меньше. |
Автор: Domestic Cat 15.7.2004, 20:20 |
![]() Здесь в обеих случаях method фактически ничего не делает, поэтому JIT делает инлайнинг метода, то есть оба цикла после компиляции оказываются пустыми, а значит и время выполнения должно быть одинаковым. То, что оно разное обусловлено случайными факторами. |
Автор: Domestic Cat 16.7.2004, 15:48 | ||
Ну это совсем уж просто. Для записи объекта используем сериализацию:
1. Предположим я сохраню 1000 обьектов, после чего может оказаться что нужно добавить новое поле в класс MyObject. После добавления нового поля при попытке чтения ранее сохраненных объектов я получу InvalidClassException. Как обеспечить совместимость версий? 2. Предположим я сохраняю объект в фаил описанным выше методом. Любой злонамеренный товариш теперь может открыть этот фаил в текстовом редакторе и исправить все что нужно: Содержимое : srMyObjectLnametjava/lang/String;xptName Исправлено: srMyObjectLnametjava/lang/String;xptFame Как предотвратить такую возможность в рамках той же сериализации? |
Автор: DarkDS 16.7.2004, 17:31 |
Что можно менять/добавлять? Отвечать сразу или подождать вариантов? ![]() |
Автор: Domestic Cat 16.7.2004, 17:42 |
Ну, здесь можно делать с классом MyObject все что хотите ![]() |
Автор: LSD 16.7.2004, 17:58 | ||||
Для совместимости версий надо добавить в MyObject поле:
где число равно serialVersionUID для оригинального класса. Узнать его можно с помощью утилиты serialver. Для того чтобы защитится от злыдней которые посягают на наш класс, надо в классе определить 2 метода:
и уже в них например организовать шифрацию/дешифрацию критичной информации (например сделать поля transient и записывать их вручную). |
Автор: Domestic Cat 16.7.2004, 18:36 |
Хороший ответ ![]() Кстати внутри методов можно пользоваться defaultWriteObject, defaultReadObject; например defaultWriteObject запишет все не-транзиентные не-static поля. А как сделать так чтобы он записывал только часть не-транзиентных не-static полей (например 2 поля String name и String age, в то время как всего public String полей 20 штук)? |
Автор: DarkDS 16.7.2004, 18:43 |
Как вариант - можно использовать Экстарналайз интерфейс. При этом класс сам отвечает за сохранение и востановление полей ![]() |
Автор: Domestic Cat 16.7.2004, 18:49 |
Externalizable служит для полного контроля над сериализацией. А если мне нужно просто настроить default****Object? ![]() |
Автор: LSD 16.7.2004, 19:33 |
Не вызывать defaultWriteObject и defaultReadObject, а самому записать нужные поля. |
Автор: Domestic Cat 16.7.2004, 19:45 | ||||
![]()
и в одномерный массив записать те поля которые нужно сохранить. При вызове defaultWriteObject будут соxраняться только они.
|
Автор: Domestic Cat 17.7.2004, 23:26 | ||||||
Ну а теперь действительно маленький тест (в качестве отдыха ![]() 1.
а. Код не скомпилируется б. При запуске программа добавит в vector элемент на позиции 10 в. При запуске программа добавит в vector элемент на позиции 9 г. При запуске будет bрошена exception д. Программа выполнится без exception'ов, но vector останется пустым 2.
а. Код не скомпилируется б. При запуске будет брошена exception в. Mikreseft or Mikrosoft г. Mikreseft or Mikrosuckaz д. Mikrosoft or Mikrosoft е. Mikrosoft or Mikrosuckaz zh. Mikresoft or Mikrosuckaz 3.
а. Код не скомпилируется б. При запуске будет брошена exception в. 9 9 г. 10. 9. д. 9 10 е. 8 9 ж 10 10 з 10 8 |
Автор: Domestic Cat 20.7.2004, 19:40 |
Ответы : 1. г 2. е 3. д |
Автор: Domestic Cat 20.7.2004, 20:05 |
А каково точное значение цвета (RGB) у TextField бакграунда при выделении для MetalLookAndFeel ? Для получения ответа cоздавать TextField нельзя. |
Автор: redrick 21.7.2004, 00:41 | ||
эм, где подвох ? |
Автор: Domestic Cat 21.7.2004, 01:04 | ||
![]() ![]()
- печатает все дефаулты |
Автор: redrick 21.7.2004, 01:35 |
да, полезная вещь :-) |
Автор: Domestic Cat 21.7.2004, 16:50 | ||
Как сделать чтобы этот миди-плеер крутил миди в цuкле (loop)? Можно добавить один метод, исправить констрактор и добавить implements
|
Автор: Domestic Cat 26.7.2004, 15:23 |
Ответ: http://java.sun.com/j2se/1.3/docs/api/javax/sound/midi/MetaEventListener.html Другой вопрос: чтобы скопировать файл "обычный" подход - прочитать его содержимое и записать в другой файл. (см например http://www.experts-exchange.com/Programming/Programming_Languages/Java/Q_10245809.html) А как это сделать в одну строчку не читая содержимого файла? |
Автор: LSD 26.7.2004, 19:07 |
Без использования команд ОС? |
Автор: Domestic Cat 26.7.2004, 19:10 |
Ага, забыл про такую возможность. Без Runtime.exec(), в общем, без ОС. |
Автор: ElectricalStorm 30.7.2004, 10:25 | ||||
Не совсем уверен что это то но метод в одну строчку ![]()
вот стандратный метод ( правда немного надуманный ![]()
|
Автор: Domestic Cat 30.7.2004, 15:10 | ||
![]() ![]() Вопрос: в таком коде:
obj1 и obj2 передаются по значанию (by value) или по ссылке (by reference)? |
Автор: AntonSaburov 30.7.2004, 16:27 | ||
Если бы FAQ внимательнее почитали, то сразу бы нашли ![]() |
Автор: Domestic Cat 30.7.2004, 16:33 | ||
Кто? Я собственно и имел в виду transferFrom ![]() Added: Вопрос остается - obj1, obj2 передаются по ссылке или по значению ? |
Автор: ElectricalStorm 2.8.2004, 12:34 |
мне кажется по ссылке |
Автор: Domestic Cat 2.8.2004, 15:58 |
А я думаю, что Java всегда все передает по значению ![]() |
Автор: AntonSaburov 2.8.2004, 17:27 | ||
Ну это уже спор достаточно теоретический IMHO. В принципе obj1 и obj2 являются ссылками и вот сами ссылки передаются как значения - они копируются. |
Автор: Domestic Cat 2.8.2004, 17:47 | ||
Скорее так: в Java "pass-by-reference" обрело несколько другой смысл, чем, например, в C++. В C++ код
изменит оригинальные var1, var2. В Java этот же самый код изменит локальные arg1, arg2, тогда как var1 и var2 не изменятся. Эсли называть C++-шный вариант "pass-by-reference", то Java - 100% pass-by-value. Когда говорят о "передаче по ссылке" в, то имеется в виду cкорее нечто вроде передачи поинтера (правда, более "безопасного" поинтера); причем называется этот поинтер "ссылкой". |
Автор: DarkDS 2.8.2004, 20:22 | ||||
Не скажи. По твоему что выдаст такой код?
|
Автор: Domestic Cat 2.8.2004, 20:33 | ||
Здесь ты изменяешь ОБЪЕКТ ( l ), пользуясь поинтером ( test, буду называть его ссылкой как принято). Но изменить sam test НЕЛЬЗЯ. Например, метод:
- он напечатает хэш код, не null. Если бы myObject был передан по ссылке, мы бы получили null. |
Автор: Domestic Cat 2.8.2004, 20:45 | ||||
1. Передача по ссылке: методу передается "оригинальный" поинтер; например
Здесь 'а' принимает другое (локальное) имя ('b'), но она "синхронизирована" с b - если ее занулить, то 'а' тоже будет null. a (она же b) ----> Object 2. По значению.
Ссылка копируется - то есть, у нас есть уже 2 ссылки на объект. a-----> Object <-----b С объектом можно делать что угодно, но ссылки "асинхронны" - зануление b никак не влияет на а. |
Автор: DarkDS 2.8.2004, 23:05 | ||
Ты будешь смеятся, но я это знаю. ![]() ![]() |
Автор: redrick 3.8.2004, 02:26 |
pass-by-value точно нет, скорее pass-by-reference. Хотя я бы здесь присоединился к AntonSaburov. Действительно, вроде бы все представляют, что происходит, просто разные слова говорят. |
Автор: Domestic Cat 3.8.2004, 15:24 |
![]() |
Автор: DarkDS 3.8.2004, 18:54 |
Более точно - в ява все передается по защищенному указателю. ТО есть при изменении данных внутри объекта изменения сохранятся. при попытки изменения указателя на обект (b = null;) изменений не произойдет ![]() |
Автор: Domestic Cat 3.8.2004, 19:32 |
Ну вот с этим уже трудно не согласиться ![]() |
Автор: Domestic Cat 4.8.2004, 17:41 | ||
А что выдаст эта программа ? ![]() Программу не запускать!!! ![]()
|
Автор: AntonSaburov 4.8.2004, 18:04 |
Можно было догадаться, что фраза из 12 букв. На ум приходит "Hello world!". Потому как байтов 24, а символ из двух байт. Каюсь, потом запустил. Повеселился от души ![]() |
Автор: redrick 5.8.2004, 03:47 | ||
- ошибка во втором символе. Вот только с nio я никогда не работал, может тут каие ексепшены посыпятся, хотя врядли.... |
Автор: Domestic Cat 5.8.2004, 15:41 | ||
![]()
|
Автор: redrick 5.8.2004, 21:23 |
ну, это понятно, я просто копипайстил значения float и переводил в hex в соответствии со стандартом но вопрос я так понимаю всё еще не отвечен.... |
Автор: Domestic Cat 5.8.2004, 21:28 |
Почему? Вроде все правильно ![]() |
Автор: Domestic Cat 5.8.2004, 21:48 | ||
Вопрос: Можно ли массив
отсортировать быстрее (не руками ![]() |
Автор: redrick 5.8.2004, 23:14 |
пузырьком, проверить правда прямо сейчас не могу |
Автор: Domestic Cat 7.8.2004, 20:31 |
Ага, по идее и пузырек, и insertion sort дадут О(n). Более интересный вопрос: Каково практическое применение метода hashCode() из java.lang.Object? |
Автор: LSD 7.8.2004, 20:48 |
Hashtable, HashMap. |
Автор: Domestic Cat 7.8.2004, 21:03 |
Да, но более конкретно? Нужно ли (и для чего) делать override этого метода в классах, объекты которых я собираюсь поместить в ту же HashMap? |
Автор: LSD 8.8.2004, 08:40 |
По рекомендациям Sun нужно переопределять этот метод совместно с equals(), так чтобы для любых обектов для которых equals() == true хэш код тоже был бы равен. Это требуется если нужно определить сравнение отличное от унаследованного. Например для объекта Entry который представляет элемент Map (т.е. пару ключ значение), equals() должен сравнивать только ключи и соответственно хэш код надо брать от ключа. Вообще хороший хэш код должен давать равномерное распределение кодов для всего множества объектов, или его некой части которая встречается в конкретной задаче. |
Автор: Domestic Cat 9.8.2004, 15:36 |
Да. Есть методы получения равномерного распределения хэш кодов. Кроме того, не было бы полезно, если бы скажем, слово "язык" имело хэш код близкий к кодам слов "язук", "юзук" и т п ![]() |
Автор: Domestic Cat 9.8.2004, 16:11 | ||
Ну, це мае бути просто:
Как "перебросить" a и b, не используя вспомогательных переменных? |
Автор: Ignat 9.8.2004, 17:38 | ||||
так? |
Автор: Domestic Cat 9.8.2004, 17:53 | ||
Я бы предпочел более красивый вариант
Хотя для double'ов это не пройдет ![]() |
Автор: AntonSaburov 9.8.2004, 17:56 |
Ну и я тоже внесу свою лепту ![]() 1. Какие из объявлений переменных неверные ? a) int 99year; b) int year99; c) int hello#; d) int #hello; e) int hello$; f) int $hello; 2. Какое сообщение об ошибке будет при компиляции совершенно пустого файла ? |
Автор: Domestic Cat 9.8.2004, 18:00 |
Переменные я "угадал", а вот с пустым файлом ты меня подловил ![]() |
Автор: AntonSaburov 9.8.2004, 18:07 |
Пишем ответы 1. НЕверные объявления a), c), d) 2. Никаких сообщений не будет - просто не будет результата компиляции, файла с расширением class. |
Автор: Domestic Cat 9.8.2004, 18:36 | ||
Можно ли из Java-программы вызвать метотоды, содержащиеся в файле (ращирениe - не ".java"). Содержание файла таково:
Какой самый простой способ? |
Автор: Domestic Cat 9.8.2004, 21:04 | ||
Чуствую, круто взял ![]() http://www.beanshell.org/ Другой вопрос:
Каков результат? |
Автор: DarkDS 10.8.2004, 11:51 |
а==б Так как конвертация во флоат будет с потерей точности. В данном случае а = 1.29685632E9 б так же будет 1.29685632E9 |
Автор: Domestic Cat 10.8.2004, 22:25 | ||||
![]() Известно, что всегда можно сделать такой cast:
А что в Java обладает способностю быть приведенным к любому типу?
|
Автор: DarkDS 11.8.2004, 12:14 |
null ![]() |
Автор: Domestic Cat 11.8.2004, 15:21 |
![]() Другая задачка, менее связанная с Java, но мне ндравится ![]() Итак: Противоракетная система Patriot имеет внутренний счетчик частотой 10 Гц. Для определения времени в секундах значение счетчика умножается на 1/10. Значение 1/10 хранится как 24-битный float ( ![]() последним значениям радара. Система работает в течение 100 часов. Радар засек ракету Skud, скорость которой 2000 м/с. Какова будет ошибка определения положения ракеты системой Patriot (в метрах)? // Реальная история: 25 февраля 1991 года, Дхаран, Саудовская Аравия. PS. За первый правильный ответ с точностью до метра дам +1 * -------------- * Subject to change. Only residents of USA and Canada are eligible. ![]() |
Автор: LSD 11.8.2004, 21:27 | ||
И что же можно привести и к int и к Object? ![]() Не известна погрешность самого радара. |
Автор: Domestic Cat 11.8.2004, 21:33 | ||||
Подловил ;) "The null reference initially has no runtime type, but may be cast to any type (JVM spec, 3.4). " Под "типом" подразумеваются : "class types, array types, and interface types"
Считаем, что погрешность радара = 0 ![]() |
Автор: redrick 12.8.2004, 00:13 | ||
давайте определимся, что такое float для начала =) |
Автор: Domestic Cat 13.8.2004, 15:15 | ||
Нууу... Подсказка нужна? ![]() Записать 1/10 в двоичной форме, оставить 23 бита (первый бит подразумевается) ... Можно ради интереса посмотреть какие будут 24, 25, 26 ... биты |
Автор: redrick 13.8.2004, 18:41 |
да не =) это понятно, просто float разные бывают и от этого зависит, что собственно в этих битах будет. Стандарта 3-байтового float я не нашёл =( хотя так тоже конечно можно попробовать прикинуть |
Автор: Domestic Cat 13.8.2004, 18:43 | ||
Да забудь ты уже про флоат ![]() ... 1/10 в двоичной форме, оставить 23 бита... |
Автор: redrick 13.8.2004, 19:20 |
ну тогда по первым предворительным =) подсчетам 64 метра (считая что експоненты нет вообще =\ ) |
Автор: Domestic Cat 13.8.2004, 19:40 |
Желательно расчеты выложить, но отевет на самом деле побольше... раз в 5- 10 ![]() |
Автор: redrick 13.8.2004, 20:11 |
ну чтож, 1/10 = 6710886,4 / 2^26 6710886 / 2^26 = 110 0110 0110 0110 0110 0110 / 2^26 итого 1/10 = 0,00 0110 0110 0110 0110 0110 0110 с точностью до 26 знака после запятой итого ошибка 110 / 2^26 = 6 / 67108864 = 0,0000000894069671630859375 0,0000000894069671630859375 * 360000 * 200 = 6,43 и того меньше..... я всё таки не понимаю, неужели не очевидно, что от того в каком виде там число храниться всё и зависит ? или я как всегда что то не понимаю |
Автор: Domestic Cat 13.8.2004, 20:19 |
// Удалил по причине арифметической ошибки ![]() --------------- А здесь можно об этом прочитать (статья уже напрямую связана с Java) ![]() http://www.rrs.ru/articles.html?article=52 |
Автор: redrick 13.8.2004, 20:29 |
здесь итого ошибка 110 / 2^26 = 6 / 67108864 = 0,0000000894069671630859375 я отсёк первые 23 и оставил 24-ый, 25-ый и 26-ой опс.... я потерял порядок, когда считал число секунд... - не умножил на 10 (10 Гц) =( и ракета во второй раз у меня летела со скоростью 200 м/с вместо 2000 м/с =(( - так что в результате 643 (4) будет.... |
Автор: redrick 13.8.2004, 21:14 | ||
на мой взгляд самое интересное было в конце
впервые слышу о такой альтернативе - токлько об "квантовых" и "оптоэлектронных" знал |
Автор: Domestic Cat 13.8.2004, 21:18 |
Ух, я ошибся, вместо умножить на (1 + 0.5) поделил на него, да еще и разделил на 2^23 а не 2^24 ; надо было так: 1/10 (точно) - 1/10 (23-bit) = 0.0.....11 = 2^(-24) + 2^(-25) = 2^(-24) * (1 + 0.5) 2000 * 3600 * 10 * 100 * (1 + 0.5)/ 2^24 ~ 643 метра |
Автор: Domestic Cat 13.8.2004, 21:32 | ||
По этому поводу вот статейка http://research.sun.com/async/RelatedSites/Versions/SunUnveils.html |
Автор: redrick 14.8.2004, 00:36 |
спасибо - но тут тоже больше реклама вроде как... хотя наверно больше никто и не скажет пока =) |
Автор: Domestic Cat 14.8.2004, 22:51 |
Кстати, с точностью до метра результат будет иной: нужно учитывать еще и 28, 29 биты: 0.0....11001100... - 1/10(23-bit) ~ 2^(-24) * (1 + 1/2 + 1/16 + 1/32) = 2 ^ (-24) * 1.59375 Так что ошибка будет ~ 683.96 метров. |
Автор: Domestic Cat 15.8.2004, 01:13 | ||
Ну почему же? Вот тут: http://research.sun.com/async/Publications/KPDisclosed/sml2003-0241/sml2003-0241.pdf А здесь вообще на 140 страниц: http://research.sun.com/research/techrep/2002/abstract-107.html |
Автор: Domestic Cat 16.8.2004, 15:48 |
Ок, задача такая: 1. Можно использовать только операторы: ~, |, &, ^, !=, (). Соответственно, остальные использовать нельзя (<, > ,<=, >= ...) 2. Можно использовать только 2 методa из класса StringBuffer: charAt() setCharAt() Дана произвольная строка, скажем "The Java Programming Language" Напечатать: а. THE JAVA PROGRAMMING LANGUAGE б. the java programming language в. tHE jAVA pROGRAMMING lANGUAGE // Можно использовать также =, ++, length() |
Автор: DarkDS 16.8.2004, 15:57 |
А length и ++ пользовать можно? |
Автор: Domestic Cat 16.8.2004, 16:58 |
Можно: =, ++, length() ![]() |
Автор: DarkDS 16.8.2004, 20:22 | ||||||
a)
b)
c)
Добавлено @ 20:28 Объяснение: Как известно ^ это XOR, то есть исключающее или (то есть если побитово сравнивать, то остаются биты, которые не равны). Это значит что (i ^ buffer.length()) != 0 будет правдой тогда и только тогда, когда и = длинне буфера. |
Автор: Domestic Cat 16.8.2004, 20:44 | ||
У меня (есессно) аналогичное решение:
![]() |
Автор: DarkDS 16.8.2004, 21:09 |
i != sb.length() ХА! Так не спортивно ![]() |
Автор: Domestic Cat 16.8.2004, 21:11 | ||
Ну дык по правилам же? ![]() --------------------------------- Кстати, почему в ascii символ DEL имеет код 127, тогда как остальные аналогичные символы имеют код 0 - 31 ? ![]() |
Автор: DarkDS 16.8.2004, 21:24 |
Дык... Он же 2^7.. То есть покрывает всю нерасширенную таблицу. | с ним всегда будет 1 |
Автор: Domestic Cat 16.8.2004, 21:30 |
Насколько я знаю, некое время назад ![]() бинарный формат и отображался на бумаге в виде дырочек - 1 - дырка, 0 - не дырка. Чтобы удалить символ на перфоленте, и сделали DEL = 127 = 1111111 - он выбивал все семь дырок. |
Автор: redrick 16.8.2004, 21:34 |
=))))) |
Автор: DarkDS 16.8.2004, 21:57 |
Уточнение: На перфокартах ![]() На перфоленте было комбинацией дырок (то есть там был квадрат с которого считывались дырки...) |
Автор: Domestic Cat 16.8.2004, 22:20 | ||
![]() А почему данный код не бyдет работать? И что сделать чтобы он заработал?
|
Автор: redrick 16.8.2004, 22:30 |
ну если str определена выше по тексту, то должен работать... ну и слэш наверно удвоить надо |
Автор: Domestic Cat 17.8.2004, 15:20 |
Эх... попробуй удвоить ![]() |
Автор: AntonSaburov 17.8.2004, 16:04 |
Забудем об опечатке: Объявлено string а используем str.replaceAll(). Вообщем-то надо 4 слеша поставить. replaceAll() использует синтаксис регулярных выражений и один слеш (если удвоить) будет воспринят отнюдь не как слеш (читайте regular expression) |
Автор: Domestic Cat 17.8.2004, 16:19 |
Опечатку исправил ![]() В replaceAll() регулярным выражением является только ":", а второй аргумент - обычный String ![]() Объяснение здесь такое: чтобы вставить в String слэш, нужно писать "\\". Это будет интерпретировано как "\", и в процессе замены ":" на "\" мы получим строку "somedir\somestuff" - с ошибкой! Поэтому ":" нужно заменять на 2 слэша - "\\\\". Это будет понято как "\\", и после замены мы получим "somedir\\somestuff" - здесь уже все ок. |
Автор: redrick 17.8.2004, 16:28 |
да, а ведь точно... я на этом даже както напарывался уже =) |
Автор: Domestic Cat 17.8.2004, 16:57 |
Next: Нaписать программу, которая, соединившись с сервером 69.64.33.189, из полученного респонса вытянет и напечатает текст самой себя (можно в неформатированном виде) ![]() |
Автор: Domestic Cat 18.8.2004, 15:59 | ||
Тут я немного смошенничал ![]()
|
Автор: redrick 18.8.2004, 16:29 |
ну знаете =)) ... кстати, а кто может накатать код программы, которая выводит свой сорс, но без всяких коннектов к серверам, и даже без открытия файла - т. е. из IO функций только println используется ? |
Автор: Domestic Cat 18.8.2004, 16:58 | ||
=) Ну а если форматирование убрать, то получится в точности она же. |
Автор: redrick 18.8.2004, 17:35 |
не проверяю - верю =) просто в свое время я долго не мог понять как это все работает - не укладывалось в голове : "раз программа выводит сама себя, то то, что она выводит тоже должно быть такой программой и т. д. и получается на вроде бесконечной рекурсии". Софизм основан на том, что данные в программе можно повторно использовать... вроде так =) |
Автор: Domestic Cat 18.8.2004, 18:41 | ||
Структура директорий такая: text.txt Desktop/ text.txt Test.class Файл "text.txt" в Desktop содержит текст "1", файл в паренте - "2". Если я запускаю код из Desktop, я получу: 1 1 Если я запущу код из парентa: java -Duser.dir=(здесь полный путь)/Desktop/ Test - что я получу и почему? |
Автор: redrick 18.8.2004, 19:05 | ||||||
предполагаю, что так :
за первый ответ ручаюсь т. к.
насчет второго только предполагаю (считаю, что VM при создании FileInputStream ищет в директории, откуда была запущена), т. к. в доках не нашел, написано только, что
кстати, почему оно будет работать вообще ? VM разве будет искать Test.class и в user.dir ? (считаем, что Desktop в path нет) |
Автор: Domestic Cat 18.8.2004, 19:29 |
user.dir устанавливает текущую рабочую директорию, так что JVM должна искать там и на CLASSPATH'е. По идее, и FileInputStream дoлжен читать Desktop/text.txt ![]() Но читать он будет второй файл (Bug ID: 4117557). |
Автор: redrick 19.8.2004, 15:44 |
о как =) да, будем знать, что ещё и в Bug Reports надо заглядывать =) javadoc-ом уже не проживешь =) |
Автор: Domestic Cat 19.8.2004, 22:01 | ||||||
![]()
Вопрос: в чем состоит вопрос? |
Автор: redrick 19.8.2004, 22:47 | ||
с ходу не сообразил, полез в книжки, ну и =) Java Language Specification Second Edition
т. е. будет Derived Class насчет С++ : думаю будет вывод Base Class т. к. там вроде все по человечески и у Стауструпа не оговорено иначе =) |
Автор: Domestic Cat 19.8.2004, 22:51 |
Насколько я понимаю, в C++ нельзя вызвать overridden метод, если объект еще не создан (как в этом случае - из конструктора). А в Java можно ![]() |
Автор: redrick 20.8.2004, 04:09 |
ну в общем - насчет Java там все доступно написано в спецификации =) а насчет С++ - собственно все так и есть, только имхо тут фраза нельзя "вызвать overridden метод" не очень подходит, т. к. фактически он и не пытается вызваться - вызывается метод базового класса. На мой взгляд это всё таки логичнее : вызывается конструктор базового класса, из него вызывается метод - естественно искать его в этом же классе, тем более, что в этот момент наследник ещё не создан. Хотя с другой стороны создатели Java тоже правы - вроде как дополнительная возможность, но вот нужна ли она ? Ведь они итак навырезали из C++ кучу всего дабы "упорядочить и упростить", да вот не забыли такую заморочку вставить - зачем ? а вот насчет того, что это совсем нельзя в С++ я не уверен - просто я не знаю с ходу как... можт кто и знает, а может и нельзя =) |
Автор: Domestic Cat 20.8.2004, 15:54 | ||||
Хм, для чего? Кажется, вот для чего:
Предположим, я вызываю A(): A() -> a.initParsers() -> a.init() -> a.parseSomeStuff() Теперь C() A() -> a.initParsers() -> c.init() -> c.parseSomeStuff() -> C() Если я все-таки хочу вызвать a.init(), я вставлю super() в c.init(). А если я не хочу его вызвать? Здесь -то все просто, а в C++ нужно что сделать? По-моему, только переписать А, и соответственно, все классы от него наследующие. //Я тут B класс удалил - он был лишний |
Автор: redrick 20.8.2004, 16:07 |
хм, спору нет, но вот вообще в С++ сообществе считается хорошим тоном не заставлять конструктор делать что-то кроме своих прямых обязанностей, т. е. инициаллизации полей _начальными_, а не появляющимися в процессе работы значениями. Думаю, если и можно придумать пример, в котором это правило будет нарушено и нарушение оправдано, то это получится довольно натянуто. Неговоря уже о тяжелой воспринимаемости такого кода (нужно лишний раз соображать что и где вызовется). В вышеприведенном примере я бы вынес все эти действия в функцию типа init_0() и явно вызывал бы ее. |
Автор: Domestic Cat 20.8.2004, 16:21 |
А что ж тут плохого? Я инициализирую суперкласс в init(). Для инициализации сабкласса мне нуzhно чо-то другое отпарсить, вот и все. Если учесть возможность того, что саблассы могут по-другому инициализировать поля, наследованные от суперкласса, то как раз все ок. Если не ошибаюсь, в C++ есть такая штука как "resource acquisition is initialization". Да и вызов init() вполне нормальное явление, см. Stroustrup, The C++ Programming Language, 2000, 14.4.1. Using Constructors and Destructors. init() , initParsers() могут инициализировать различные ресурсы, соответственно, можно один init() разбит' на несколько методов. |
Автор: redrick 20.8.2004, 17:02 |
вобщем здесь я уже немного "не в теме", поэтому не буду говорить и утверждать глупостей, но вот у Страуструпа насколько я понял идет речь как раз об использовании ресурсов, ну то есть памяти, а когда вы парсите там что то, то это уже никак нельзя назвать просто захватом ресурсов. И вот ещё (опять же на правах чистого имхо) : если ваш детёнок инициализирует поля родителя по-другому нежели родитель, то стоило ли его вообще делать детёнком этого родителя ? |
Автор: Domestic Cat 20.8.2004, 17:18 | ||||
Например:
|
Автор: Domestic Cat 20.8.2004, 17:30 | ||
Давайте вернемся к теме. Вопрос: какие проблемы могут возникнуть при запуске программы:
|
Автор: AntonSaburov 20.8.2004, 17:50 | ||
А эта строчка специально с пробелом (String []) ?
А вообще 10000*10000 = 100 000 000 да еще на размер целого. Вывалится по нехватке памяти, если конечно опциями не добавить. |
Автор: Domestic Cat 20.8.2004, 17:53 | ||||
А разве на что-то влияет? ![]()
Хм. А сборщик мусора? Разве не должен он убирать все эти массивы? ![]() Добавлено @ 17:54 Ведь сразу после 1 пробега цикла ссылки на объект в памяти нет! |
Автор: redrick 20.8.2004, 18:58 |
а сборщик мусора когда захочет, тогда и соберет - вовсе не обязательно сразуже и вот еще такой вопрос : собственно где и какая ссылка на объект класса Test появляется после выполнения new Test() ? понятно, что эивет она в фигурных скобочках цикла только - но тогда, кстати, все объекты будут жить, пока цикл не закончится и GC нам тут уж никак не поможет |
Автор: Domestic Cat 20.8.2004, 19:32 | ||||||
Если создается много объектов - он начнет работать. Зуб даю. Редиской буду. Ну а проверить можно, запуская с флагом -verbose:gc. В данном случае сбоки мусора будут, но незначительные.
А ее нету - прoграмма на объект не ссылается, следовательно , он подлежит сборке
Чтобы проверить, нужно поставить в цикл просто int[] array = new int[10000]; и запустить с тем же флагом. Уууупс ![]() ![]() |
Автор: redrick 20.8.2004, 23:02 |
насчет GC - ну это хорошо, но формально никаких гарантий нет и полагаться на это нельзя совсем. А то сделаем из Sun ещё один M$ (http://www.joelonsoftware.com/articles/APIWar.html) а насчет времени жизни - это я ошибся, т. е. не знал =) забавно получается - создаем объект и он сразу может умирать |
Автор: Domestic Cat 21.8.2004, 23:04 | ||
В общем, проблема такая: если поставить в main
то окажется, что new Test() забивает память очень серьeзно; а gc работать и не собирается (хотя он на самом деле чего-то собирает, по нескольку килобайт несколько раз ![]() Заменим new Test() чем-нибудь другим- будь то new Object(), new Integer() или int[] arr = new int[10000] - все ок, в конце память почти не истрачена, да и gc трудится хорошо. Вопрос: почему? Подсказка n1 : в коде есть логическая ошибка. Но даже если ее найти, то почему gc не убирает мертвые объекты? |
Автор: DarkDS 22.8.2004, 01:18 | ||
Для этого в сях есть виртуальность ![]() |
Автор: Guest 23.8.2004, 09:49 |
Объекты не "мертвые". Они находятся в состоянии NEW. GC не трогает объект класса Thread до тех пор, пока он не окажется в состоянии TERMINATED |
Автор: AntonSaburov 23.8.2004, 12:44 | ||
А можно поподробнее - что-то я такого не встречал (все знать нельзя ![]() |
Автор: Guest 23.8.2004, 14:50 |
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Thread.State.html http://www.codeguru.com/java/tij/tij0155.shtml#Heading483 When main( ) creates the Thread objects it isn’t capturing the handles for any of them. An ordinary object would be fair game for garbage collection, but not a Thread. Each Thread “registers” itself so there is actually a reference to it someplace and the garbage collector can’t clean it up until the thread exits its run( ) and dies |
Автор: Domestic Cat 23.8.2004, 15:11 | ||
[
Таки Guest раскусил ![]() А ошибка была в том, что вместо start() я вызывал run(), то есть поток запущен на самом деле не был ![]() |
Автор: Domestic Cat 23.8.2004, 15:42 | ||
Можно написать виртуальный метод, инициализирующий поле и вызывать его после конструктора, но как это сделать из конструктора? |
Автор: Domestic Cat 23.8.2004, 18:41 | ||
Простой вопрос: Напечатает ли эта программа "true"?
|
Автор: redrick 23.8.2004, 19:23 | ||||
на первый взгляд вроде бы не видно подводных камней...
с массивом вроде тоже всё чисто - "array of array of char" т. е. ответ "да" |
Автор: Domestic Cat 23.8.2004, 19:24 |
Остается ее запустить ![]() |
Автор: redrick 23.8.2004, 21:23 |
ёлки палки - как же я не заметил !!! (char[2][20];) мда, лопухнулся так лопухнулся =)) |
Автор: Guest 23.8.2004, 21:25 | ||
Массивы примитивов при создании заполняются нулевыми значениями. Строка из такого массива получится "соответствующая"
|
Автор: Domestic Cat 23.8.2004, 21:33 |
А что нужно сделать, чтобы получить в результате true; но при этом string менять нельзя? |
Автор: redrick 23.8.2004, 21:55 | ||
ну например так...
|
Автор: Domestic Cat 23.8.2004, 21:59 |
Можно, но это вызов метода... ![]() |
Автор: redrick 23.8.2004, 22:04 |
ну это уже загадки какие-то пошли =) А что собственно можно менять ? System.out.println("true"); и всё =) |
Автор: Domestic Cat 23.8.2004, 22:19 | ||
Аааа ![]()
|
Автор: redrick 23.8.2004, 22:26 |
=) Идея в том, что пробелы не покатят ? ну в общем понятно |
Автор: Domestic Cat 24.8.2004, 15:46 | ||
Эта программа напечатает 96.985954:
Задача: изменить только ОДИН символ таким образом, чтобы она выдала 145.07143. // под "изменить" подразумевается также и "добавить" и "удалить" |
Автор: anonymouse 24.8.2004, 16:04 |
public class Test { public static void main(String [] arg) { int x = 34527; int y = 0356; System.out.println((float) x / y); } } ![]() |
Автор: redrick 24.8.2004, 16:14 |
вообще говоря это не изменение, а дополнение - ну это конечно не суть =) |
Автор: Domestic Cat 24.8.2004, 16:21 | ||
Быстро, однако ![]() |
Автор: Domestic Cat 24.8.2004, 16:57 | ||
Простой:
1. Почему дата будет 21? 2. Что нужно добавить, чтобы нельзя было использовать "неправильные" даты? |
Автор: anonymouse 24.8.2004, 17:31 |
1. потому как день в месяце будет высчитываться 2334 % 365(дней в году) % 31(макс. дней в месяце) + 1(первое число). 2. сделать можно все что угодно, а какие ограничения ? |
Автор: Domestic Cat 24.8.2004, 17:40 |
Ок, ограничeния такие: 1. Нельзя проверять дату (например : if (date > 31) {...}) 2. Нельзя бросать эксепшн 3. Нельзя устанавливать / читать дату соответствуюшими методами get / set. |
Автор: anonymouse 24.8.2004, 17:51 |
нашел ![]() calendar.setLenient(false); |
Автор: AntonSaburov 24.8.2004, 18:08 |
Думаю, что несложно, но ... Как можно объявить несколько public классов в одном файле ? |
Автор: Domestic Cat 24.8.2004, 18:28 | ||||
Ага, хороший метод ![]()
Сделать их внутренними? |
Автор: AntonSaburov 24.8.2004, 18:37 | ||
Ага. Только можно уточнить чтоюы можно было объявить переменные такого типа в других классах ? |
Автор: Domestic Cat 24.8.2004, 18:43 | ||
В смысле, так : ?
|
Автор: anonymouse 24.8.2004, 18:48 |
а если так // A.java public class A { public static class B { public B() { System.out.println("A$B"); } } } то и A не надо будет инициализировать // Test.java public class Test { public static void main(String [] args) { A a = new A(); A.B b = new A.B(); } } |
Автор: AntonSaburov 24.8.2004, 18:52 | ||
Ок. Что выведет такой код
Желательно объяснить результат ![]() |
Автор: Domestic Cat 24.8.2004, 18:52 | ||||
А это зависит от того, что нужно. Если нужно чтобы каждый объект класса А ассоциировался с объектом класса B, то используем внутренний класс (member class), а если просто два "близких по смыслу" класса - то static member class. Добавлено @ 19:02
Размер у лонга приличный, так что последний принт даст 4000000000 Первый даст 240, поскольку для байтов метода System.out.println() нет, и произойдет конвертация в int. А второй принт даст что-то отрицательное из-за оверфлова. |
Автор: Domestic Cat 24.8.2004, 19:25 |
Задача: написать программу, которая через час начнет выдавать сообщения типа "Wake Up !!!" ![]() Программа должна занимать 1 строчку (не считая импортов, public class.., public static void main ... и скобок). Строчкой cчитаем все, что заканчивается точкой с запятой (кроме ";" во внутренних классах). Наследовать от класса Thread и интерфейса Runnable нельзя. Использовать методы классa Thread нельзя. |
Автор: AntonSaburov 24.8.2004, 20:09 | ||
Зацепило ![]()
|
Автор: Domestic Cat 24.8.2004, 20:24 |
У меня аналогичный вариант ![]() Ну а такая : Написать код в одну строчку (определение строчки такое же как и выше), который будет отлавливать все AWTEvent'ы и печатать их в консоль. |
Автор: Domestic Cat 25.8.2004, 16:10 | ||
|
Автор: Domestic Cat 25.8.2004, 20:10 |
Если к числу прибавить 256, то получится 123. Если его умножить на 2, то получим -10. Что это за число? Решать в уме. ![]() |
Автор: DarkDS 25.8.2004, 22:47 |
А какого типа число? ![]() |
Автор: DarkDS 25.8.2004, 23:03 |
Хотя я понял ![]() ![]() Это будет байт = 123 |
Автор: Domestic Cat 26.8.2004, 15:42 | ||
![]()
что нужно дописать, чтобы код скомпилился? Сам код не менять. |
Автор: DarkDS 26.8.2004, 16:28 | ||
|
Автор: Domestic Cat 26.8.2004, 16:57 | ||
![]() ![]() ![]() |
Автор: AntonSaburov 26.8.2004, 17:07 |
boolean x = false; |
Автор: Domestic Cat 26.8.2004, 17:10 |
Слишом простые вопросы ![]() ![]() ![]() |
Автор: AntonSaburov 27.8.2004, 11:17 | ||
Ну это же не только для хорошо знающих - пусть и начинающие подключаются. Я собирался недели через две уже начать делать выжимку из этого топика. А этот пусть остается ![]() |
Автор: Domestic Cat 27.8.2004, 15:24 | ||||
[/code]
В смысле? ![]() ----- Продолжу простые вопросы: Что напечатает код и почему:
|
Автор: AntonSaburov 27.8.2004, 16:54 | ||
Я поначалу хотел просто убрать водичку, но с другой стороны тут общение живое - мне нравиться, не хотелось, чтобы исчез некий дух ![]() Вот и подумал - может делать это в отдельном топике. А здесь все как раньше. Очень хороший топик получается ![]() Добавлено @ 17:00 А я не угадал - но почему они Equal ? Похоже, тут оптимизация работает, но у меня нет уверенности. А хотелось бы точно знать |
Автор: Domestic Cat 27.8.2004, 17:17 | ||||||
Подсказка: ![]() ![]()
|
Автор: redrick 28.8.2004, 02:15 | ||
когда константой инициализируется, то один и тот же объект подставляется (соответственно и хеши одинаковые) - это и правда оптимизация (вдруг они только для чтения будут использоваться). А если придет запрос на запись в a или b то создастся новый объект с таким же содержимым. для полноты картины отискал вот : Java Language Specification Second Edition
|