JPoint 2019 parsing

gambar

Halo semuanya!

JPoint 2019, salah satu konferensi Jawa paling hardcore, berakhir, diadakan untuk ketujuh kalinya dan, seperti biasa, memecahkan rekor kehadiran, kali ini acara tersebut menarik lebih dari 1700 spesialis di bidang pembangunan Jawa.

Odnoklassniki berpartisipasi dalam semua konferensi JPoint. Sejak 2013, kami telah secara aktif mendukung JPoint dan di stan kami, kami telah menyelenggarakan berbagai kegiatan pengujian pengetahuan Jawa untuk para peserta kami. Tahun ini kami memiliki tugas "tidak terpecahkan" yang terkenal dari pengembang OK.ru terkemuka. Peserta konferensi yang menjawab pertanyaan dengan benar menerima hadiah.

Dalam keadilan, saya harus mengatakan bahwa dari 600 selebaran dengan tugas yang kami bagikan, kurang dari 100 dikembalikan, skor rata-rata sekitar 0,25.

Solusi terbaik adalah, mencetak 4 poin dari 5 kemungkinan.

Kami menerbitkan tugas dan solusinya sehingga Anda dapat menguji kekuatan Anda.

Beats be


Masalah ini diselesaikan oleh 40% yang lulus jawaban.

Michael menciptakan analog BitSet -safe yang aman. Tambahkan implementasi metode setBit() .

Untuk kesederhanaan, ukuran BitSet dapat dianggap konstan.

 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) { // TODO: Implement me! } } 

Solusi
Implementasi menggunakan updateAndGet() / getAndUpdate() , tersedia dengan Java 8, mungkin terlihat seperti ini:

 public void setBit(int index) { int word = index >> 6; long mask = 1L << index; bits.updateAndGet(word, value -> value | mask); } 

Implementasi pada compareAndSet() lama yang baik terlihat mirip:

 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)); } 


Enum tidak sama


Masalah ini diselesaikan oleh 45% yang lulus jawaban.

Tatiana ingin memeriksa apakah dua objek adalah konstanta dari enum sama. Apa yang tidak dia perhitungkan?

 boolean sameEnum(Object o1, Object o2) { return o1.getClass().isEnum() && o1.getClass() == o2.getClass(); } 

Solusi
Petunjuknya terletak pada dokumentasi untuk metode Enum.getDeclaringClass () , yang digunakan, misalnya, di Enum.compareTo():

 public final Class<E> getDeclaringClass() { Class<?> clazz = getClass(); Class<?> zuper = clazz.getSuperclass(); return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper; } 

Untuk konstanta enum dengan tubuh non-kosong, kelas menengah dibuat, sehingga jawaban yang benar mungkin terlihat seperti ini:

 boolean sameEnum(Object o1, Object o2) { return o1 instanceof Enum && o2 instanceof Enum && ((Enum) o1).getDeclaringClass() == ((Enum) o2).getDeclaringClass(); } 


Tautan Tidak Dikompilasi


Masalah ini diselesaikan oleh 42% yang lulus jawaban.

Antarmuka berikut tersedia:

 interface Link<T> { T next(); } 

Ubah tanda tangan (tetapi bukan tubuh) metode getTail() ) sehingga kode dikompilasi tanpa kesalahan dan peringatan.

 Link getTail(Link head) { if (head.next() == null) { return head; } return getTail(head.next()); } 

Solusi
Hanya ada tiga jawaban minimum yang benar:

 <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) 

Paradoksikal seperti yang terlihat, tanda tangan seperti itu terlalu sulit untuk kompiler Java:

 <T extends Link<T>> T getTail(Link<T> head) 


Messenger


Masalah ini diselesaikan oleh 14% yang lulus jawaban.

Kostya sedang mengembangkan aplikasi pengiriman pesan. Tunjukkan kesalahan dalam metode untuk mengirim pesan melalui jaringan.

 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)); } 

Solusi
Setidaknya ada tiga kesalahan dalam kode ini:


Ini mungkin terlihat seperti versi tetap:

 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); } } 


Java dalam wadah


Masalah ini diselesaikan oleh 7,5% yang lulus jawaban.

Apa parameter JVM yang harus diresepkan untuk Alexei untuk mencegah Linux membunuh proses Java karena melebihi batas memori yang dialokasikan untuk wadah?

  • -Xmx
  • -XX:MaxMetaspaceSize
  • -XX:ReservedCodeCacheSize
  • -XX:+UseContainerSupport
  • -XX:MaxRAMPercentage
  • Memori JVM tidak dapat dibatasi

Solusi
Memori yang dikonsumsi oleh proses Java jauh dari terbatas pada pinggul, Metaspace dan Code Cache. Banyak struktur JVM lain juga menempati memori, dan tidak semuanya diatur oleh pengaturan. Selain mesin Java virtual, memori asli dialokasikan oleh Java Class Library dan kode pengguna melalui Direct ByteBuffers dan Mapped ByteBuffers.

Parameter UseContainerSupport bersama dengan MaxRAMPercentage hanya memengaruhi ukuran heap. Dengan demikian, tidak ada cara dijamin untuk menghindari melebihi batas menggunakan hanya bendera JVM, dan jawaban terakhir akan menjadi yang benar. Untuk informasi lebih lanjut tentang penggunaan memori Java oleh suatu proses, lihat laporan oleh Andrei Pangin di Joker 2018 " Shelf Process Java Storage" .

Source: https://habr.com/ru/post/id447218/


All Articles