You are never a loser until you quit trying!

Tham trị (pass-by-value) và tham chiếu (pass-by-reference) trong Java




Chào bạn đến với phanlamcoder.blogspot.com!

Ở bài viết này chúng ta sẽ tìm hiểu về Tham trị (pass-by-value) và tham chiếu (pass-by-reference) trong Java


 pass by value java


Khi thao tác vi các hàm trong Java, vi nhng người mi bt đu s thường lúng túng vi vic truyn tham s vào cho các hàm. Ti sao mt s trường hp khi truyn tham s vào cho hàm xong khi thoát ra khi hàm giá tr ca tham s lúc thì b thay đi theo logic ca hàm, lúc thì không thay đi gì? Vn đ đây chính là s khác nhau ca các loi tham s được truyn vào hàm mà đôi lúc người lp trình không đ ý đến. Các loi tham s này được chia làm 2 kiu là truyn giá tr và truyn tham chiếu.
·         Truyn tham tr là gì? Truyn tham chiếu là gì?
Mình tm áp dng mt cách nh có v hơi thô thin ca mình đ tránh nhm ln trong trường hp này: tham tr là cùng giá tr, tham chiếu là cùng chiếu đến mt vùng nh.

1.      Truyn tham tr

 là truyn / copy giá tr ca mt biến (A) vào mt biến khác (B) đ s dng trong phm vi ca mt hàm. đây mình nói đến t copy dùng đ nhn mnh giá tr được truyn vào là mt bn sao và lúc này (A) và (B) hoàn toàn đc lp nhau, vic dùng (B) đ x lý trong hàm hoàn toàn không nh hưởng gì đến biến ban đu (A).

2.     Truyn tham chiếu

 là làm biến (B) thành mt alias (bí danh) ca (A), lúc này (A) gn như là (B) và (B) gn như là (A) vì c 2 đu tham chiếu đến cùng mt đi tượng, mi thay đi trên (B) thc tế cũng là thay đi trên (A)  (vic ti sao li nói (A) va (B) lúc này gn như nhau s được gii thích rõ hơn phn dưới). T đó, sau khi thoát ra khi hàm, d liu trên vùng nh được (A) tham chiếu ti s b thay đi theo các thao tác mà ta đã dùng đ thay đi d liu trên vùng nh được (B) tham chiếu ti.
·         Làm sao xác đnh đâu là tham chiếu, đâu là tham tr trong Java?
Sau mt hi ging gii dài dòng trên, có th bn s nói mình khùng khi mình phát biu tiếp câu này:
Java ch truyn tham tr, không truyn tham chiếu.
Thêm mt câu khng đnh li:
Phát biu trên luôn đúng và không có ngoi l!
Mình không khùng đâu, cái này tng là lm tưởng ca mình trong mt thi gian dài và lm tưởng này nó ph biến đến mc có th xếp vào hàng nhng lm tưởng ph biến nht đi vi các lp trình viên Java. Lm tưởng đó thường được phát biu như sau:Kiu d liu cơ s được truyn theo tham tr, kiu object được truyn theo tham chiếu.
Gii thích tiếp Java ch truyn tham tr, vy nó truyn tham tr như thế nào trong trường hp vi kiu d liu cơ s và kiu object.
1.      Kiu d liu cơ s: đi vi kiu d liu cơ s, Java đơn gin là copy giá tr ca biến đ gán vào tham s. Và như đã nói trên, lúc này biến và tham s s dng trong hàm là riêng bit, khi thoát ra khi hàm biến không b thay đi giá tr.
2.     Kiu object: khi truyn mt biến có kiu object vào mt hàm thì lúc đó có nghĩa ta đã truyn giá tr ca biến đó đ s dng trong hàm, ch không phi truyn đi tượng được biến đó tham chiếu ti. Vy giá tr ca mt biến kiu object là gì??? Nói có v hơi l nhưng có th nói giá tr ca biến kiu object là đa ch ca object mà biến đó tham chiếu đến đến. Cho nên lúc này vic thay đi giá tr ca biến kiu object này bng cách gán cho mt biến kiu object khác thì object được tham chiếu đến lúc đu không b nh hưởng, ch khi s dng các method ca chính các object được tham chiếu này thì d liu ca object mi được thay đi sau khi ra khi hàm.
 Chúc các bạn học tốt!
Góp ý tại mục bình luận bên dưới 💓

Phân biệt toán tử == và phương thức equals() trong java

Tôi nghĩ vấn đề này trong Java vẫn còn nhiều bạn chưa phân biệt rõ sự khác nhau giữa toán tử “==” và phương thức equal() trong Java, đặc biệt là khi so sánh chuỗi String trong Java. Hôm nay mình viết bài này để mọi người tham khảo và góp ý.
VD1: Giả sử tôi có đoạn code như sau:
String a = new String(“abc”);
String b = new String(“abc”);
System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?false
System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true
Vậy tại sao kết quả lại khác nhau?
Trong JAVA, có 2 kiểu biến: biến tham trị và tham chiếu.
Biến kiểu tham trị bao gồm các kiểu nguyên thủy của JAVA như: int, long, double…
Biến kiểu tham chiếu bao gồm: String, array, kiểu đối tượng…
Khi sử dụng biến kiểu tham trị, JAVA chỉ cho phép bạn sử dụng toán tử so sánh “==”.
Khi sử dụng biến kiểu tham chiếu, JAVA cho phép sử dụng cả toán tử “==” và equals(). Tuy nhiên, khi sử dụng toán tử “==”, bộ xử lý của JAVA sẽ so sánh xem 2 biến tham chiếu này có trỏ đến cùng một đối tượng hay không, còn nếu bạn sử dụng phương thức equals(), bộ xử lý JAVA sẽ so sánh giá trị của 2 biến tham chiếu đó. Điều này lý giải tại sao ở ví dụ trên, khi sử dụng phép toán: a.equals(b) => kết quả trả về bằng true, trong khi a==b => kết quả trả về lại bằng false.
Để hiểu hơn, tôi xét thêm một ví dụ nữa:
String a = new String(“abc”);
String b = a;
System.out.println(“a==b ? ”+ (a==b));// kết quả: a==b?true
System.out.println(“a.equals(b)?” + a.equals(b));// kết quả e.quals(b)?true


Chúc các bạn học tốt!
Góp ý tại mục bình luận bên dưới 💓

Bài tập string trong java



Chào bạn đến với phanlamcoder.blogspot.com!

Ở bài viết này chúng ta sẽ cùng test lại những câu lệnh cơ bản nhé!
Ôn tập lại kiến thức về String trong JAVA!

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package stringjava;

import java.util.Locale;

/**
 *
 * @author Nhu Y
 */
public class StringJava {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String s1 = "Toi dep trai nhat, toi biet toi dep trai";

        //VI TRI XUAT HIEN CUOI CUNG TRONG CHUOI

        System.out.println(s1.lastIndexOf("toi"));
        

        //XOA MOT KY TU

        System.out.print(removeCharAt(s1, 2));
        

        //THAY THE CHUOI CON TRONG CHUOI CHA

        System.out.print(s1.replaceFirst("dep trai", "thong minh"));
        

        //HAI CACH DAO CHUOI

            //cach 1
        s1 = new StringBuffer(s1).reverse().toString();
            //cach 2
        String temp = "";
        for(int i = s1.length()-1;i>-1;i--)
        {
            temp += s1.substring(i);
            s1 = s1.substring(0,i);
        }
        s1 = temp;
        System.out.print(s1);
        

        //TIM MOT TU TRONG CHUOI

        s1 = "hoc-lap-trinh-java";
        
        System.out.print(s1.indexOf("java"));

        //CHIA NHO CHUOI, VONG LAP FOREACH

        
        String[] arrStr = s1.split("-");
        for(String s : arrStr)
        {
            System.out.print(s+" ");
        }

        //SO SANH HAI VUNG CUA CHUOI

        //str1[14-17] == str2[3,6] ???
        String str1 = "Welcome to my blog";
        String str2 = "My blog is lovely";
        //str1[14-17] = "blog"
        //Vung cua chuoi str1: tu vi tri 14
        //Vung cua chuoi str2: tu vi tri 3, co 4 ki tu ("blog")
        //tra ve true or false
        System.out.print(str1.regionMatches(14, str2, 3, 4));

        //SO SANH THOI GIAN THUC THI CAU LENH

        long startTime = System.currentTimeMillis();
      for(int i=0;i<50000;i++){
         String strF = "hello";
         String strL = "hello"; 
      }
      long endTime = System.currentTimeMillis();
      System.out.println("Time taken for creation" 
      + " of String literals : "+ (endTime - startTime) 
      + " milli seconds" );       
      long startTime1 = System.currentTimeMillis();
      for(int i=0;i<50000;i++){
         String strF1 = new String("hello");
         String strL1 = new String("hello");
      }
      long endTime1 = System.currentTimeMillis();
      System.out.println("Time taken for creation" 
      + " of String objects : " + (endTime1 - startTime1)
      + " milli seconds");
        

    //FORMAT()

    double e = 2.25874;
    System.out.format(Locale.GERMANY,"%1.4f%n%n", e);
    

        //LAY KI TU UNICODE

    System.out.print(s1.codePointAt(2));

    }
   
    
    public static String removeCharAt(String s, int i)
    {
        return s = s.substring(0,i) + s.substring(i+1);
    }
    
}






Chúc các bạn học tốt!
Góp ý tại mục bình luận bên dưới 💓