190801

吃可爱长大的小学妹 提交于 2019-11-27 05:27:43

1. 数组在Java和C++中的不同?

  Java:首先应该明确的是,Java中的数组是对象,并且都是一维数组。二维数组和多维数组呢?其实二维数组中存放的是一维数组的引用,也是一个一维数组,多维数组也是如此,下面通过一个例子来证明这一观点:

首先,我们创建一个三维数组arr3D

 int[][][] arr3D = new int [5][][];

 System.out.println(Arrays.deepToString(arr3D));

输出:

[null, null, null, null, null]

说明三维数组里存放着五个元素,都是空引用null

然后初始化一个元素

arr3D[2] = new int[3][];

输出:

[null, null, [null, null, null], null, null]

可以观察到,三维数组中索引为2的位置变成了一个充满三个null的一维数组(这里使用new关键字,创建了一个一维数组,然后三维数组原来的null引用变成了指向这个新建立的一维数组的新引用),不过还没有出现数字,那么再添加一个试试:

arr3D[2][2] = new int[7];

输出:

[null, null, [null, null, [0, 0, 0, 0, 0, 0, 0]], null, null]

可以发现,在上一步新建立的一维数组中索引为2的位置,又新建立了一个一维数组,不过这个一维数组有7个元素,都是默认初始化的0。

现在可以知道,其实Java中所谓的多维数组,也不过都是一维数组而已。那么,在C++中又有什么不同呢?

  C++:首先,在定义的时候,C++需要给出明确的行列个数,以便在内存中开辟一段连续的空间用来存放数据,不然编译器会报错。其次,如果想要使用动态数组,需要借助指针来指向存放数组所在的内存块,比如:

int (*mm_array)[5][3];

如果在声明的时候没有指明必要的行列个数,比如

int (*mm_array)[][];//非法的!

不知道数组具体的行列数,编译器无法为数组分配内存,也就无法创建这个数组,所以会报错。

  总的来说,Java的多维数组存储的是引用,C++的多维数组存储的是指针。如果想要实现不同长度的多维数组,Java相对来说比较方便,而C++需要明确地借助指针。Java会对边界条件进行检查,而C++却不会,所以Java使用起来更安全。

参考:https://stackoverflow.com/questions/32767077/c-and-java-array-declaration-definition-differences

https://anandabhisheksingh.me/two-dimensional-array-java/

2. Java中instanceof关键字的作用?

  instanceof是一个用于检查时间变量是否属于某个对象类型的关键字。比如:A instanceof B 表示A 是否属于B类型。是,返回true;否,返回false。

  参考:https://www.geeksforgeeks.org/java-instanceof-and-its-applications/

3. Java类型转换

char c = '1';
int a = Character.getNumericValue(c);

  hint:在intellij IDEA里面打出Character.即可出现关于char相关操作。

4. Java版本号的含义

  首先,Java = JDK,Java包含三个版本,分别是JavaSE,JavaEE,JavaME,分别适用的场景不同,初学者学的一般都是JavaSE。那么常说的Java 8和Java 1.8什么关系呢?其实是相同的。早起适用1.x版本,后来在Java SE1.5发布的时候,为了表示该版本的重要性,JavaSE 1.5更名为Java SE5.0(内部版本号为1.5.0),那么后面的Java版本就形成了两种命名方式。

  在Linux下安装Java的时候,还会遇到Sun/OracleJDK和OpenJDK两个版本,这两个版本有什么区别呢?首先,这两个版本的使用区别不大,对于初学者来说,使用哪个版本都可以。OpenJDK是Oracle JDK中JavaSE版本的开源和免费实现,比Oracle JDK拥有更多的特性,并且更新较快,Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次。但是OpenJDK不如Oracle JDK稳定,所以一般大型的公司使用Oracle JDK较多,而想要更多更新的特性支持则使用OpenJDK。

  JRE 是 Java运行时环境;  JDK是Java Development Kit。

5. ArrayList和LinkedList的区别?

底层数据结构:ArrayList使用的是object数组,LinkedList使用的双向链表

6. String,StringBuilder,StringBuffer的总结:

  • 操作少量的数据: 适用String
  • 单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer

7. StringBuilder和StringBuffer的区别?

  StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。

8. implements和extends的区别?

  implements是实现接口(interface)的关键字,而extends是实现继承的关键字。

另外,java不支持多重继承,但是可以通过多重接口(interface)实现。

9. override和overload的区别?

  • 重载(overload): 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。   
  • 重写(override): 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 则子类就不能重写该方法。外壳不变,核心重写。
  • 重载只改变核心,重写只有方法名相同,调用的时候使用动态绑定(具体要使用那个方法,编译器做选择),已实现多态。

10. 为什么Java是编译与解释共存的语言?

  .class->机器码 这一步。在这一步 JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度会相对比较慢。而且,有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器(JIT编译器,英文写作Just-In-Time Compiler,中文意思是即时编译器。),而JIT 属于运行时编译。当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。而我们知道,机器码的运行效率肯定是高于 Java 解释器的。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!