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

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

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

之后就找不到它的实现源码了。查了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);

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

java native 方法和修饰符相关推荐

  1. java域的控制修饰符可分为_Java中的类和方法的修饰符

    java 中的类和方法的修饰符Java程序在定义类时,除了使用class关键字标识之外,还可以在class之前增加若干类的修饰符来修饰限定所定义的类的特性.类的修饰符分为访问控制符和非访问控制符两大类 ...

  2. java修饰方法有哪些,探讨Java语言中那些修饰符

    一.在java中提供的一些修饰符,这些修饰符可以修饰类.变量和方法,在java中常见的修饰符有:abstract(抽象的).static(静态的).public(公共的).protected(受保护的 ...

  3. java中的类修饰符、成员变量修饰符、方法修饰符。

    类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. fin ...

  4. java方法和变量修饰符有哪些_死磕Java基础---类,变量和方法的修饰符

    欢迎关注微信公众号:一个自学的程序员 类修饰符 对于类的修饰符,毫无疑问是用来修饰类的,那么,修饰类的修饰符都有哪些? 有如下这些: 1. abstract 2. final 3. private 4 ...

  5. Java中的反射和Java中的访问修饰符

    什么是反射? ①在运行状态中,对于任何一个类,我们都能够知道这个类有哪些方法和属性 ②对于任何一个对象,我们都能够对它的方法和属性进行调用 总而言之:它反射Java语言中的一种机制,通过这种机制可以动 ...

  6. Java本地方法/Java native方法/JNI

    一.什么是JNI? JNI是 Java Native Interface的缩写,又叫Java本地方法/Java native方法.用于Java代码和其他语言写的代码进行交互.使用java与本地已编译的 ...

  7. Java常见的各种修饰符

    Java常见的各种修饰符 目录 Java常见的各种修饰符 修饰符的分类 一.访问权限修饰符 二.非访问权限修饰符 修饰符的使用 一.类修饰符 1.外部类修饰符 2.内部类修饰符 二.方法修饰符 三.变 ...

  8. java中的访问修饰符

    对Java中的修饰符一直记不住,现在结合网上的一些资料进行总结,并重点说明一下protected修饰符. 一. Java中的访问修饰符 Java面向对象的基本思想之一是封装细节并且公开接口.Java语 ...

  9. Java final修饰符的作用,Java中的final修饰符

    1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...

  10. [转载] 基本概念:java中的访问修饰符

    参考链接: Java中类或接口的访问说明符 转自:https://www.cnblogs.com/tjudzj/p/4443066.html 对Java中的修饰符一直记不住,现在结合网上的一些资料进行 ...

最新文章

  1. 当 AI 闯入法律界,第一步是当律师的得力助手
  2. 蚂蚁森林最高效的合种团队—招募队友云植树,最快1天1颗树
  3. Intellij IDEA自动部署项目至远程FTP服务器
  4. Failed building wheel for netifaces
  5. 1.2.2 OSI参考模型(1)
  6. Mysql存在则更新,不存在则插入
  7. mysql 镜像备份_手动构建percona-xtrabackup Docker镜像,并实现mysql数据备份
  8. 【七】zuul路由网关
  9. iOS中实现plist中读取数据实现Cell的显示(字典转模型,实现按序分组)修改图片的尺寸...
  10. 罗永浩重新定义直播带货
  11. Falcon(一)——数据集管理和数据处理平台
  12. 英国essay与澳洲essay写作区别以及注意事项
  13. how-to-solve-the-specific-problem,learn-this,imitate-this
  14. 愤怒的小鸟 高清完整版下载
  15. Win10中无法加载 .iso文件的问题一例
  16. 导致我们形不成「自律」的「罪魁祸首」
  17. MySQL数据库30条规范解读
  18. 中文命名实体识别(ner)迁移学习
  19. CAS实现的单点登录系统
  20. Python Leetcode(905.按奇偶排序数组)

热门文章

  1. html怎么让一行文字有滚动的效果,HTML标签marquee实现滚动效果
  2. phpcms v9模板制作教程
  3. Qt视频直播软件--项目实战(Day7)
  4. SketchUp Pro 2018 Mac OS X/Windows 64/32位产品下载
  5. 什么是数据中心虚拟化?
  6. ubuntu等linux系统如何阅读caj文档
  7. 有趣的github项目
  8. 词法分析器java语言_Java 实现词法分析器
  9. Xshell5:Xshell下载和安装教程
  10. java p12证书,如何使用已安装的.p12 证书在 Mac OS X 上签名 jar?