Các tham chiếu Java luôn trỏ đến một đối tượng. Đối tượng có một tiêu đề trong số những thứ khác xác định loại cụ thể (vì vậy phôi có thể thất bại vớiClassCastException
). Đối với các mảng, phần bắt đầu của đối tượng cũng bao gồm độ dài, dữ liệu sẽ xuất hiện ngay sau đó trong bộ nhớ (về mặt kỹ thuật, việc triển khai là tự do để làm những gì nó làm, nhưng nó sẽ không làm gì khác). Vì vậy, bạn không thể có một tham chiếu chỉ ra đâu đó thành một mảng.
Trong C con trỏ chỉ bất cứ nơi nào và bất cứ điều gì, và bạn có thể chỉ vào giữa một mảng. Nhưng bạn không thể sử dụng một cách an toàn hoặc tìm ra mảng dài bao nhiêu. Trong D, con trỏ chứa phần bù vào khối bộ nhớ và chiều dài (hoặc tương đương con trỏ đến cuối, tôi không thể nhớ việc thực hiện thực sự làm gì). Điều này cho phép D cắt các mảng. Trong C ++, bạn sẽ có hai vòng lặp trỏ đến điểm bắt đầu và kết thúc, nhưng C ++ hơi kỳ quặc như thế.
Vì vậy, quay trở lại Java, không có bạn không thể. Như đã đề cập, NIO ByteBuffer
cho phép bạn bọc một mảng và sau đó cắt nó, nhưng cung cấp một giao diện khó xử. Tất nhiên bạn có thể sao chép, có lẽ nhanh hơn rất nhiều so với bạn nghĩ. Bạn có thể giới thiệu sự String
trừu tượng giống như của riêng bạn , cho phép bạn cắt một mảng (triển khai Mặt trời hiện tại String
có char[]
tham chiếu cộng với độ lệch bắt đầu và độ dài, thực hiện hiệu suất cao hơn chỉ có char[]
). byte[]
ở mức độ thấp, nhưng bất kỳ sự trừu tượng hóa dựa trên lớp nào mà bạn đưa vào sẽ tạo ra một mớ hỗn độn khủng khiếp của cú pháp, cho đến khi JDK7 (có lẽ).