String Literal trong Java
mình có thắc mắc về việc cấp phát bộ nhớ cho các biến dùng kiểu String
> String s1 = “ab” ;
String s2 = "ab" ;
1 . Có phải s1 , s2 , chuỗi “ab” là cùng 1 địa chỉ phải không ? ( mình thử dùng 1 hàm để get address của đối tượng thì thấy cả 3 cùng 1 địa chỉ)
2 . vậy kiểu khai báo string literal là nó sẽ lấy thẳng địa chỉ của chuỗi “ab” luôn thay vì nó phải khai báo 1 biến ở stack rồi truyền tham chiếu của đối tượng ở heap cho biến đó phải không ( kiểu như biến tham chiếu bên C ấy 1 biến nhưng có nhiều bí danh )
3.có trường hợp nào mà hashcode() của 2 đối tượng khác nhau trả về value giống nhau không ??
String s = new String(“ab”) ;
có bao nhiêu vùng nhớ được cấp phát khi chạy câu lệnh trên
1 . Có phải s1 , s2 , chuỗi “ab” là cùng 1 địa chỉ phải không ? ( mình thử dùng 1 hàm để get address của đối tượng thì thấy cả 3 cùng 1 địa chỉ)
Đúng vì nó trỏ đến cùng 1 địa chỉ trong bộ nhớ heap gọi là String pool
2 . vậy kiểu khai báo string literal là nó sẽ lấy thẳng địa chỉ của chuỗi “ab” luôn thay vì nó phải khai báo 1 biến ở stack rồi truyền tham chiếu của đối tượng ở heap cho biến đó phải không ( kiểu như biến tham chiếu bên C ấy 1 biến nhưng có nhiều bí danh )
Java không hỗi trợ con trỏ
3.có trường hợp nào mà hashcode() của 2 đối tượng khác nhau trả về value giống nhau không ??
hashcode có thể override bạn. Nên có thể có trường hợp đó
4.
String s = new String(“ab”) ;
có bao nhiêu vùng nhớ được cấp phát khi chạy câu lệnh trên
Tham số s ở bộ nhớ Stack
Đối tượng “ab” sẽ ở vùng nhớ heap nhé (Vùng nhớ không phải String pool nữa ) không phải trỏ về
String s1 = “ab” ;
String s2 = “ab” ;
nữa
Đọc tham khảo thêm topic này:
https://daynhauhoc.com/t/string-literal-va-new-string-trong-java/34541
chỗ này đầu tiên nó sẽ tạo ra đối tượng trên vùng nhớ string pool sau đó sẽ khởi tạo đối tượng String với tham số đầu vào là đối tượng được tạo trên vùng string pool…