
مرحبا بالجميع!
انتهى JPoint 2019 ، أحد أكثر مؤتمرات جافا المتشددين ، وتم عقده للمرة السابعة ، وكما هو الحال دائمًا ، فقد حطم سجل الحضور ، وهذه المرة اجتذب الحدث أكثر من 1700 متخصص في مجال تطوير Java.
شارك Odnoklassniki في جميع مؤتمرات JPoint. منذ عام 2013 ، ندعم بنشاط JPoint ونقوم في أجنحةنا بتنظيم العديد من أنشطة اختبار معرفة جافا لمشاركينا. هذا العام كان لدينا مهام "غير قابلة للحل" الشهيرة من مطوري OK.ru الرائدين. حصل المشاركون في المؤتمر الذين أجابوا على الأسئلة بشكل صحيح على جوائز.
في الإنصاف ، يجب أن أقول أنه من بين 600 منشور مع المهام التي قمنا بتسليمها ، تم إرجاع أقل من 100 منشور ، وبلغ متوسط الدرجات حوالي 0.25.
أفضل حل هو تسجيل 4 نقاط من 5 ممكن.
ننشر المهام وحلولها حتى تتمكن من اختبار قوتك.
يدق يكون
تم حل هذه المشكلة بنسبة 40 ٪ الذين اجتازوا الإجابات.
يقوم مايكل بإنشاء
BitSet
آمن لمؤشر ترابط
BitSet
. إضافة تطبيق
setBit()
.
للبساطة ، يمكن اعتبار حجم
BitSet
ثابتًا.
public class ConcurrentBitSet { private final AtomicLongArray bits; public ConcurrentBitSet(int size) { assert size >= 0; int words = (size + 63) / 64; bits = new AtomicLongArray(words); } public void setBit(int index) {
قرارقد يبدو تطبيق باستخدام
updateAndGet()
/
getAndUpdate()
، المتاح مع Java 8 ، كما يلي:
public void setBit(int index) { int word = index >> 6; long mask = 1L << index; bits.updateAndGet(word, value -> value | mask); }
يبدو التنفيذ على
compareAndSet()
القديمة الجيدة
compareAndSet()
المماثلة:
public void setBit(int index) { int word = index >> 6; long mask = 1L << index; long oldValue; long newValue; do { oldValue = bits.get(word); newValue = oldValue | mask; } while (!bits.compareAndSet(word, oldValue, newValue)); }
التعداد ليس هو نفسه
تم حل هذه المشكلة بنسبة 45 ٪ الذين اجتازوا الإجابات.
تريد تاتيانا التحقق مما إذا كان كائنين ثوابت لنفس
enum
. ماذا لم تأخذ في الاعتبار؟
boolean sameEnum(Object o1, Object o2) { return o1.getClass().isEnum() && o1.getClass() == o2.getClass(); }
قراريكمن التلميح في وثائق أسلوب
Enum.getDeclaringClass () ، والذي يتم استخدامه ، على سبيل المثال ، في
Enum.compareTo():
public final Class<E> getDeclaringClass() { Class<?> clazz = getClass(); Class<?> zuper = clazz.getSuperclass(); return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper; }
بالنسبة إلى ثوابت التعداد ذات الأجسام غير الفارغة ، يتم إنشاء فئات متوسطة ، لذا قد تبدو الإجابة الصحيحة كما يلي:
boolean sameEnum(Object o1, Object o2) { return o1 instanceof Enum && o2 instanceof Enum && ((Enum) o1).getDeclaringClass() == ((Enum) o2).getDeclaringClass(); }
روابط غير مجمعة
تم حل هذه المشكلة من قبل 42 ٪ الذين اجتازوا الإجابات.
الواجهة التالية متاحة:
interface Link<T> { T next(); }
قم بتغيير التوقيع (ولكن ليس النص
getTail()
) لأسلوب
getTail()
) بحيث يتم تجميع التعليمات البرمجية دون أخطاء وتحذيرات.
Link getTail(Link head) { if (head.next() == null) { return head; } return getTail(head.next()); }
قرارهناك ثلاثة إجابات صحيحة فقط:
<T extends Link<T>> Link<T> getTail(Link<T> head) <T extends Link<T>> Link<T> getTail(T head) <T extends Link<T>> T getTail(T head)
مفارقة كما قد يبدو ، مثل هذا التوقيع صعب للغاية بالنسبة لمترجم Java:
<T extends Link<T>> T getTail(Link<T> head)
رسول
تم حل هذه المشكلة من قبل 14 ٪ الذين اجتازوا الإجابات.
Kostya تقوم بتطوير تطبيق المراسلة. وضح الأخطاء في طريقة إرسال الرسائل عبر الشبكة.
void send(SocketChannel ch, String message) throws IOException { byte[] bytes = message.getBytes(); ByteBuffer header = ByteBuffer.allocate(4); header.putInt(bytes.length); ch.write(header); ch.write(ByteBuffer.wrap(bytes)); }
قرارهناك ثلاثة أخطاء على الأقل في هذا الرمز:
قد يبدو هذا كنسخة ثابتة:
void send(SocketChannel ch, String message) throws IOException { byte[] bytes = message.getBytes(StandardCharsets.UTF_8); ByteBuffer header = ByteBuffer.allocate(4); header.putInt(bytes.length); header.flip(); while (header.hasRemaining()) { ch.write(header); } ByteBuffer body = ByteBuffer.wrap(bytes); while (body.hasRemaining()) { ch.write(body); } }
جافا في الحاوية
تم حل هذه المشكلة بنسبة 7.5 ٪ الذين اجتازوا الإجابات.
ما هي معلمات JVM التي يجب وصفها لـ Alexei لمنع نظام التشغيل Linux من قتل عملية Java بسبب تجاوز حد الذاكرة المخصص للحاوية؟
-Xmx
-XX:MaxMetaspaceSize
-XX:ReservedCodeCacheSize
-XX:+UseContainerSupport
-XX:MaxRAMPercentage
- لا يمكن أن تكون ذاكرة JVM محدودة
قرارالذاكرة التي تستهلكها عملية Java بعيدة عن أن تكون محدودة في الورك و Metaspace و Code Cache. تشغل العديد من هياكل JVM الأخرى الذاكرة أيضًا ، ولا يتم تنظيم جميعها حسب الإعدادات. بالإضافة إلى جهاز Java الظاهري ، يتم تخصيص الذاكرة الأصلية بواسطة مكتبة Class Java ورمز المستخدم من خلال Direct ByteBuffers و Mapped ByteBuffers.
UseContainerSupport
المعلمة
UseContainerSupport
مع
MaxRAMPercentage
على حجم الكومة فقط. وبالتالي ، لا توجد وسيلة مضمونة لتجنب تجاوز الحد الأقصى باستخدام علامات JVM فقط ، وستكون الإجابة الأخيرة هي الإجابة الصحيحة. لمزيد من المعلومات حول استخدام ذاكرة Java عن طريق عملية ، راجع تقرير Andrei Pangin في Joker 2018
" Shelf
Process Java Storage" .