Java语言的特点
- 简单易学
- 面向对象(封装 继承 多态)
- 安全可靠
- 支持多线程
- 支持网络编程
- 平台无关
- 编译与解释并存
JVM
Java虚拟机(JVM)是用来运行Java字节码的,针对不同的系统有特定的实现 目的是为了使得相同的字节码在不同的系统上得到相同的结果
Java程序从源代码到二进制机器码经过三步:
源代码(.java) > 字节码 (.class) > 二进制机器码
第一步是通过javac编译成为.class 文件 在通过JVM解释成二进制机器码运行
因为JVM对字节码是逐行解释执行,所以效率比较低,后来引入了JIT编译器 ,当JIT编译器完成第一次编译之后,会将二进制机器码保存下来,下次可以直接使用。 根据二八定律 ,消耗大部系统资源的只有那一小部分的代码。执行得越多就越快。
Java与c++的区别
- Java有自动内存管理机制,c++需要手动释放
- 都是面向对象 Java是单继承 c++是多继承 不过Java可以使用接口来实现多继承
- Java不提供指针直接访问内存
- 在 C 语言中,字符串或字符数组最后都会有一个额外的字符’\0’来表示结束。但是,Java 语言中没有结束符这一概念。(Java里面是对象 在编译过程中 Java对象大小可以确定 所以不需要用’\0’来表示结束)
为什么说 Java 语言“编译与解释并存”?
Java程序从编写到运行需要经过三步,先通过javac编译成.class文件 在通过JVM来解释执行 所以我们认为 Java 语言编译与解释并存。
字符型常量和字符串常量的区别?
- 字符常量是以’‘引起的一个字符,字符串是“”引起的0个或者多个字符
- 字符常量可以看成是一个整型值(ASCII值) 字符串代表一个地址值
- 字符常量占2个字节 字符串占多个字节
- 标识符和关键字的区别是什么?
标识符是一个为类名 方法名 变量 常量 的取名,关键字是特殊的标识符,是在Java语言里面赋予了特殊的含义。
continue、break、和 return 的区别是什么?
- continue;结束这一次循环 继续下一次循环
- break:跳出循环
- return:跳出方法
Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?
Java 泛型:提供了编译时的类型安全检查机制。是一个伪泛型 ,因为Java在编译期间,会将所有的泛型信息擦除,通过字节码文件可以看到 在代码中一定的List 类型,在编译之后都会编程List,通过反射机制可以向List里面添加其他类型的数据,所以可以得出,泛型在Java编译期间类型擦除。
List<Integer> list = new ArrayList<>();
list.add(12);
//这里直接添加会报错
list.add("a");
Class<? extends List> clazz = list.getClass();
Method add = clazz.getDeclaredMethod("add", Object.class);
//但是通过反射添加,是可以的
add.invoke(list, "kl");
常用的通配符为: T,E,K,V,?
- T:一个Java类型
- ?:不确定的类型
- E:Element
- K V:键值对
**==和 equals 的区别
“==”对比的是两个对象的地址是否相同 或者是基本类型的值
equals 对比的是两个对象的的内容是否相同 不能用于比较基本数据类型的变量
如果没有覆盖equals()方法 那么对比的就是对象的地址值,反之,对比对象的内容
为什么重写 equals 时必须重写 hashCode 方法?
- 两个对象相等,则equals 相等 hashCode 也相等
- hashCode 相等不一定对象就相等
- 所以重写了equals 那么也要重写hashCode 才能使得对象相等
- hashCode 是在堆上生成一个独特的值
自动装箱与拆箱
8 种基本类型的包装类和常量池
- Boolean直接返回 True Or False
- Byte、Short、 Integer、Long的常量池都是[-128,127]
- Character 的常量池都是[0,127]
因为这些类型的值是可以确定个数的 但是Float Double不能确定一个范围的值,所以Float Double没有实现常量池
为什么说Java中只有值传递
- 值传递(pass by value)是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
- 引用传递(pass by
reference)是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。
值传递和引用传递之前的区别的重点是什么。
值传递和引用传递的区别并不是传递的内容。而是实参到底有没有被复制一份给形参。在判断实参内容有没有受影响的时候,要看传的的是什么,如果你传递的是个地址,那么就看这个地址的变化会不会有影响,而不是看地址指向的对象的变化。
Java中其实还是值传递的,只不过对于对象参数,值的内容是对象的引用。
重载和重写的区别
- 重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
- 重写就是当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,你就要覆盖父类方法
String StringBuffer 和 StringBuilder 的区别是什么? String 为什么是不可变的?
String StringBuffer线程安全 StringBuilder线程不安全
String 底层使用 final 修饰存储数据的byte[]
对于三者使用的总结:
- 操作少量的数据: 适用 String
- 单线程操作字符串缓冲区下操作大量数据: 适用 StringBuilder
- 多线程操作字符串缓冲区下操作大量数据: 适用 StringBuffer