java native 方法和修饰符

最近开始学习java基础工具等源码,还是得更耐心些,去体会精髓的地方。。


看到了ArrayList.java中的fastRemove方法:


java native 方法和修饰符_第1张图片


由于数组删除了中间一个元素,就必须把之后的元素向前移动一位。发现这边用的是System.arraycopy:


java native 方法和修饰符_第2张图片


之后就找不到它的实现源码了。查了native修饰符 才知道:


"A native method is a Java method whose implementation is provided by non-java code."


简单来说一个Native Method就是一个java调用非java代码的接口。


这个也比较好理解,因为java底层本来就是用c、c++去写的,所以当然有对应接口去直接调用C/C++写的方法;而且众所周知java对底层的操作远不如C/C++灵活,所以可以通过直接调用非java代码来实现对底层的操作。在java api中有很多这种方法,例如:


系统提供的数组拷贝方法public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);等


暂时看不到源码,就看到网上有人说这个方法的复制,居然是浅复制的!!


所以只能通过做一个测试来验证:


public class testMain {
    public static void main(String[] args) {

        Te[] t1 = new Te[1];
        t1[0] = new Te("a");
        Te[] t2 = new Te[1];
        System.out.println(t1[0]);
        //调用
        System.arraycopy(t1, 0, t2, 0, 1);
        System.out.println(t2[0]);

    }

    static class Te {
        String name;

        Te(String name) {
            this.name = name;
        }
    }
}


从输出中可以看出 指针指向了同一个地址:




然后再进行修改,发现因为指向了同一个地址,t2的值确实跟着一起改变了:


Te[] t1 = new Te[1];
        t1[0] = new Te("a");
        Te[] t2 = new Te[1];
        System.out.println(t1[0]);
        //调用
        System.arraycopy(t1, 0, t2, 0, 1);
        System.out.println(t2[0]);

        System.out.println("t1修改前:"+t1[0].name);
        System.out.println("t2修改前:"+t2[0].name);

        t1[0].name = "1";

        System.out.println("t1修改后:"+t1[0].name);
        System.out.println("t2:"+t2[0].name);


java native 方法和修饰符_第3张图片


对t1[0]进行修改,但是由于t1[0]和t2[0]引用了同一个对象,因此后者也会随之改变,在平时的使用中如果不注意的话会引起相当大的问题。
 
而且由于System.arraycoppy()是JDK中的native方法,JDK中有关于集合,数组操作的基本上都调用此方法,因此在使用这些的时候要注意。

你可能感兴趣的:(java进阶)