
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) {
SolusiImplementasi 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(); }
SolusiPetunjuknya 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()); }
SolusiHanya 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)); }
SolusiSetidaknya 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
SolusiMemori 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" .