目录
8.switch能否作用在byte,long,string上?
10.Math.round(11.5)等于多少?Math.round(-11.5)多少?
13.访问修饰符 public,private,protected,默认 的区别
52. String str = "i" 与 String str = new String("i")一样吗?
54. 使用HashMap时,用String做key有什么好处?
55. String和StringBuffer,StringBuilder区别?为什么String不可变?
Java概述
1.什么是Java
- Java是一门面向对象编程语言,不仅吸收了C++的各种优点,还摒弃了C++里难以理解的多继承,指针等概念,因此Java语言具有功能强大和简单易用两个特征.Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程.
2.Jdk,Jre和Jvm的区别
jdk包含jre,jre包含jvm
- JVM(Java virtual Machine):
Java虚拟机,它能够将class文件中的字节码指令进行识别并且调用操作系统上的api完成动作,JVM是跨平台的核心.作用:保证Java语言跨平台 - JRE(Java Runtime Environment):
Java运行环境.包含JVM标准实现以及java核心类库.作用:Java程序的运行环境. - JDK(java Development Kit):
Java开发工具包.JDK是整个Java开发的核心,集成了Jre和一些工具.作用:Java程序的开发环境
3.什么是跨平台性,原理是什么
- 所谓跨平台性是指Java编写的程序,一次编译之后,可以在多个系统平台上运行.
- 实现原理:
java程序通过Java虚拟机在系统平台运行,只要该系统安装相应的java虚拟机,该系统就可以运行Java程序
4.什么是字节码,采用字节码的好处
- 字节码:Java源代码经过java虚拟机编译后产生的文件(.class文件),它面向虚拟机
- 采用字节码的好处:
Java语言通过字节码的方式,在一定程度上解决了传统解释性语言执行效率底的问题,同时又保留了解释性语言可移植的特点.所以Java程序运行比较高效,而且,由于字节码并不专对一种特定的机器,因此,无需重新编译即可在多种不同的计算机运行.
5.Java和C++的区别
- 都是面向对象语言,都支持继承,封装,多态.
- Java不提供指针来直接访问内存,程序内更加安全.
- java类是单继承,C++支持多继承;Java类不支持多继承,但是接口可以多继承.
- Java有自动内存管理机制,不需要程序员手动释放无用内存.
6.Oracle JDK和OpenJDK的区别
- OracleJDK版本每三年发布一次,而OpenJDK每三个月发布一次
- OpenJdk是完全开源的,而OracleJdk是OpenJdk的一个实现,不完全开源
- OracleJdk更加稳定,两者代码几乎相同,但OracleJdk有一些错误的修复.
- 在响应性和Jvm性能方面,更加推荐OracleJdk
- OracleJdk不会提供长期支持版本,用户必须更新到最新版本获得支持
基础
7.Java有哪些数据类型
定义:Java是强类型语言,对于每一种数据类型都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间
- 基本数据类型:
- 整数类型(byte(1字节),short(2字节),int(4字节),long(8字节))
- 浮点型(float(4字节),double(8字节))
- 字符型(char(2字节))
- 布尔型(boolean(1字节))
- 引用数据类型:
- 类(class):接口(interface),数组([])
8.switch能否作用在byte,long,string上?
- 在java5之前,switch(expr)中,expr只能byte,short,char,int.Java5开始,Java中引用枚举类型,expr也可以是枚举类型,从java7开始,expr可以是字符串(string),但是long目前在所有版本都是不可以的
9.用最有效率的方式计算2乘以8
- 2<<3(左移3位相当于2的3次方,右移三位相当于除以2的三次方)
10.Math.round(11.5)等于多少?Math.round(-11.5)多少?
- 前者返回值12,后者返回值-11
11.java采用何种编码方案?有何特点?
- Java采用Unicode编码标准,为每个字符制定了一个唯一的数值,因此在任何语言,平台,程序都可以放心使用
12.java注解
- 单行注释
- //注释文字
- 多行注释
- /* 注释文字*/
- 文档注释
- /** 注释文字 */
13.访问修饰符 public,private,protected,默认 的区别
- 定义:java中,可以使用访问修饰符来保护对类,变量,方法和构造方法的访问,java支持4种不同的访问权限.
- 分类
- private: 在同一类内可见.适用对象:变量,方法.不能修饰类
- default:什么都不写,同一个包可见,不使用任何修饰符.适用对象:类,接口,变量,方法
- protected:对同一包内的类和所有子类可见 适用对象:变量,方法.不能修饰外部类
- public:对所有类可见.适用对象:类,接口,变量,方法
14.&和&&的区别
- &运算符两边都为true结果才为true
- &&运算符第一个表达式为false,则不计算后面的表达式
- 注意:|运算符和||运算符也是如此
15.final有什么用?
- 被final修饰的类不能被继承
- 被final修饰的方法不能被重写
- 被funal修饰的变量不能被改变,被修饰的不可变的是变量的引用,而不是指向的内容,指向的内容是可以改变的
16.final finally finalize的区别
- final可以修饰类,变量,方法,修饰类表示该类不能被继承,修饰方法表示该方法不能被重写,修饰变量表示该变量不能被重新赋值
- finally一般作用try catch代码块中,处理异常时我们将一定执行的代码放在finally代码块中,表示无论是否出现异常,都会执行,一般存放关闭资源的代码
- finalize是一个方法,属于Object类的一个方法,而Object方法是所有类的父类,该方法一般由垃圾回收来调用,当我们调用System.gc()方法时,由垃圾回收调finalize(),回收垃圾,一个对象是否可以回收的最后判断.
17.this关键字的用法
- this是一个自身的对象,代表对象本身,可以理解为指向本身对象的指针
- this用法在Java中大概分为三种:
- 1. 普通的直接引用,相当于指向对象本身
- 2. 形参与成员名字重名,用this区分
public Person(String name, int age) { this.name = name; this.age = age; }
-
3. 引用本类的构造函数
class Person{ private String name; private int age; public Person() {} public Person(String name) { this.name = name;} public Person(String name, int age) { this(name); this.age = age;} }
18.super关键字的用法
- super可以理解为指向自己超(父)类对象的指针,而这个超类是离自己最近的一个父类
- super三种用法
- 直接引用
- 子类中的成员变量或方法与父类中的成员变量或方法同名,使用super区分
class Person{ protected String name; public Person(String name) { this.name = name; } } class Student extends Person{ private String name; public Student(String name, String name1) { super(name); this.name = name1; } public void getInfo(){ System.out.println(this.name); //Child System.out.println(super.name); //Father } } public class Test { public static void main(String[] args) { Student s1 = new Student("Father","Child"); s1.getInfo(); } }
- 引用父类的构造函数
19. this与super的区别
- super:引用当前对象的父类中的成员(用来访问父类中被隐藏的成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名,super.成员函数名(实参))
- this:代表当前对象名
- this与super类似,super是在子类中调用父类的构造方法,this在本类中调用本类的其他构造方法
- super()和this()均需要放在构造方法第一行
- this和super不能出现在一个构造器,this必然会调用其他构造器,其他构造器必然也会有super 的存在,同一个给灾区有相同的语句就失去了意义
- this和super都不能再status环境修饰 如:status变量,status方法,status语句块
- this是一个指向本对象的指针,而super是一个java关键字
20. static存在的意义
- static主要的意义是在于创建独立于具体对象的域的变量或者方法.以至于没有创建对象也能使用方法
- static关键字还有一个主要的作用,用来形成静态代码块以优化程序性能.static代码块可以放置在程序的任何地方.类中可以有多个static代码块.在类初次被加载时,会按照static代码块的先后顺序执行每个代码块,并且只会执行一次
- 为什么说static可以优化程序性能?因为它只会在类加载的时候加载一次.因此很多时候会将一些只需要进行一次的初始化操作放在static代码块中进行,
21.static的独特之处
- 被static修饰的变量或者方法是独立于任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享
- 在类第一次被加载的时候,就回去加载被static修饰的部分,而且只在类被第一次加载的时候进行初始化,注意是第一次用就要初始化,后面根据需要可以再次进行赋值.
- static变量在类加载的时候分配空间,以后创建类对象的时候不会再重新分配,赋值的话,可以被任意赋值
- 被static修饰的变量或者方法是优于对象存在的,也就是说当一个类加载完毕之后,即使没有创建对象,也可以进行访问.
22. static的应用场景
- 因为static是被类额实例对象所共享,因此如果某个成员变量是被所有的对象共享,那么这个成员变量就应该被定义为静态变量
- static常用的场景:
- 修饰成员变量
- 修饰成员方法
- 静态代码块
- 修饰类(只能修饰内部类,也就是静态内部类)
- 静态导包
23. static的注意事项
- 静态只能访问静态
- 非静态既可以访问非静态,也可以访问静态的
流程控制语句
24. break,continue,return的区别
- break:跳出总上层循环,不再执行循环(结束当前循环体)
- continue: 跳出本次循环,继续执行下次循环(结束正在执行的,进入下一个)
- return: 程序返回,不再执行下面的的代码(结束当前方法 直接返回)
25. 如何跳出多重嵌套循环
- 想要跳出多重循环,可以在外面定义一个标号 例如:
public static void main(String[] args) {
ok:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
System.out.println("i=" + i + ",j=" + j);
if (j == 5) {
break ok;
}
}
}
}
面向对象
26.面向对象与面向过程的区别
- 面向过程
- 优点
- 性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;例如单片机,嵌入式开发,Linux/Unix等一般采用面向过程开发,性能是最重要的因素.
- 缺点
- 没有面向对象易维护,易复用,易扩展
- 优点
- 面向对象
- 优点
- 易维护,易复用,易扩展,由于面向对象有封装,继承,多态性的特征,可以设计出低耦合的系统,使系统更加灵活,更易于维护
- 缺点
- 性能比面向过程低
- 优点
27. 面向对象特征
- 抽象: 抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面,抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么.
- 封装: 把一个对象的属性私有化,同时提供可以被外界访问到的属性的方法,如果属性不想被外界访问,那么这个类也没有什么意义
- 继承: 使用已经存在的类定义作为基础建立新类的技术,新类可以新增新的功能,也可以使用父类的功能,通过继承 我们可以复用代码
- 注意事项:
- 子类拥有父类非private的属性和方法
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展
- 子类可以用自己的方式实现父类的方法
- 多态: 父类或者接口定义的引用变量可以指向子类或者具体实现类的实例对象,提高了程序的扩展性.在Java中两种形式可以实现多态:继承(多个子类对同一个方法的重写)和接口(实现接口并覆盖接口中的同一方法)
28. 什么是多态机制?Java如何实现多态?
- 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须由程序运行期间才能决定,因为在程序运行时才确定类,这样,不用修改程序源代码就可以让引用变量绑定到各种不同的类实现上,从而导致该应用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行所绑定的具体代码,让程序可以有多个运行状态,这就是多态
- 多态分为编译时多态和运行时多态;编译时多态是静态的,主要指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态.而运行时多态是动态的,通过动态绑定来实现,也就是我们所说的多态性.
多态的实现:
- Java实现多态有三个必要的条件继承,重写,向上转型
- 继承: 在多态中必须存有继承关系的子类和父类
- 重写: 子类对父类的某些方法重新定义,再调用这些方法时就会调用子类的方法.
- 向上转型: 在多态中需要将子类的引用赋给父类对象,只有这样该引用才能具备技能调用父类的方法和子类的方法
类与接口
29. 抽象类和接口的对比
- 抽象类是用来捕捉子类通用特性的,接口是抽象方法的集合
- 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范
相同点:
- 接口和抽象类都不能被实例化
- 都位于继承的顶端,用于被其他类继承或实现
- 都包含抽象方法,子类必须复写抽象方法
不同点:
参数 | 抽象类 | 接口 |
声明 | 抽象类是用abstract关键字声明 | 接口使用interface关键字声明 |
实现 | 子类使用extends关键字来继承抽象类,如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现 | 子类用implement关键字实现接口.它需要提供接口中所有声明的方法的实现 |
构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
访问修饰符 | 抽象类中的方法可以是任意访问修饰符 | 接口方法默认修饰符是public,并且不允许定义为private或者protected |
多继承 | 一个类最多继承一个抽象类 | 一个类可以实现多个接口 |
字段声明 | 抽象类的字段声明是可以任意的 | 接口字段默认static和final的 |
备注:Java8中接口引入默认方法和静态方法,以来减少抽象类和接口之间的差异.
- 选择抽象类的情况:需要定义子类的行为,又要为子类提供通用的功能
- 应该通过接口而不是抽象类定义,优先选择接口,少用抽象类
30. 抽象类和普通类的区别?
- 普通类不能包含抽象方法,抽象类可以包含抽象方法.
- 抽象类不能直接实例化,普通类可以直接实例化
31. 创建对象用什么关键字?对象实例与对象引用有何不同?
- new关键字,new创建对象实例(对象实例在堆内存),对象引用指向对象实例(对象引用存放在栈内存中).一个对象引用可以指向0个或者1个对象;一个对象可以有n个引用
变量与方法
32. 成员变量和局部变量的区别有哪些?
- 变量: 在程序执行过程中,某个范围内其值可以任意发生改变的量.从根本上讲 变量其实是内存中的一小块区域
- 成员变量: 方法外部,类内部定义的变量
- 局部变量: 类的方法中的变量
成员变量和局部变量的区别:
- 作用域
- 成员变量: 针对整个类有效
- 局部变量: 只在某个范围内有效(一般指方法,语句体内)
- 存储位置
- 成员变量: 随着对象的创建而存在,随着对象的消失而消失,存储在堆内存
- 局部变量: 在方法被调用,或者语句被执行的时候存在,存储在栈内存.当方法调用完,或者语句结束,自动释放
- 生命周期
- 成员变量: 随着对象的创建而创建,随着对象的消失而消失
- 局部变量: 当方法调用完,或者语句结束后,自动释放
- 初始值
- 成员变量: 有默认初始值
- 局部变量: 没有默认初始值,必须赋值
33. 构造方法特性
- 名字与类名相同
- 没有返回值,不能使用void声明构造函数
- 生成类对象时自动执行,无需调用
34. 静态变量与普通变量的区别
静态变量是被所有的对象共享的,在内存中只有一个副本,仅在类初次加载才被初始化; 非静态变量是对象拥有的,创建对象时被初始化,存在多个副本;静态成员变量初始化的顺序是按照定义的顺序进行初始化
内部类
35. 什么是内部类?
Java中将一个类定义放在另一个类内部,这就是内部类;内部类分为:匿名内部类,静态内部类,局部内部类,成员内部类
36. 内部类的优点以及应用场景?
优点
- 一个内部类可以访问创建它的外部类的对象内容,包括私有数据;
- 内部类不被同一包的其他类所见,具有很好的封装性;
- 内部类有效的实现了多重继承,优化java单继承的缺陷
- 匿名内部类很方便的实现回调
应用场景
- 多算法场合
- 解决非面向对象的语句块
- 适当用内部类可以使代码更加灵活
重写(Overload)与重载(Override)
37. 构造器是否可以重写
构造器不能被继承,因此不能被重写,可以被重载
38. 重载和重写的区别
- 重载和重写都是实现多态的方式,区别在于前者是编译时的多态,重写是运行时多态
- 重载: 发生在同一个类中,方法名相同参数列表不同(参数类型不同,个数不同,顺序不同)与方法返回值和访问修饰符无关,方法的重载不能根据返回追类型区分
- 重写: 发生在父子类中,方法名,参数列表必须相同,返回值小于等于父类,抛出异常小于等于父类,访问修饰符大于等于父类;父类方法如果为private则子类就不是重写.
对象相等判断
39. ==和equals的区别
- ==: 它的作用是判断两个对象的地址是否相同,即判断两个对象是否为同一个对象(基本数据类型比较的是值,引用数据类型比的是地址)
- equals: 它的作用是判断两个对象是否相等.一般两种情况
- 情况1: 类没有覆盖equals方法.则通过equals方法比较两个对象,等价于==比较
- 情况2: 类覆盖了equals方法.一般我们都覆盖了equals方法来比较两个对象内容是否相等
40. 对象的相等与指向他们的引用相等,两者有何不同?
对象的相等比的是内存中存放的内容是否相等,而引用相等,比较的是他们指向的内存地址是否相等
Java包
41. JDK常用包有哪些
- java.lang: 系统基础类
- java.io: 输入输出的类,例如文件操作
- java.nio: 完善了io包中的功能
- java.net: 网络有关的类
- java.util: 系统辅助类,特别是集合类
- java.sql: 数据库操作类
42. import java和javax的区别
刚开始的时候 JavaAPI 所必需的包是 java 开头的包,javax 当时只是扩展 API 包来说使用。然而随 着时间的推移,javax 逐渐的扩展成为 Java API 的组成部分。但是,将扩展从 javax 包移动到 java 包将是太麻烦了,最终会破坏一堆现有的代码。因此,最终决定 javax 包将成为标准API的一部 分。实际上java和javax没有区别
IO流
43. java中io流分几种?
- 按照流的流向,分为输入流和输出流
- 按照操作单元划分,分为字节流和字符流
- 按照角色划分,节点流和处理流
44. Files的常用方法?
反射
45.什么是反射机制?
- 反射机制实在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个功能,都能调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能成为Java语言的反射机制
- 静态编译和动态编译
- 静态编译: 在编译时确定类型,绑定对象
- 动态编译: 运行时确定类型,绑定对象
46. 反射机制的优缺点
- 优点: 运行期类型的判断,动态加载类,提高代码灵活度
- 缺点: 性能瓶颈,反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的java代码慢
47. 反射的应用场景
- 反射是框架设计的灵魂
- 平时开发中很少用反射,实际很多设计,开发,都与反射机制有关,例如模块化开发,通过反射去调用对应的字节码;动态代理也用到了反射,还有spring等框架也用到大量的反射
-
举例:①我们在使用 JDBC 连接数据库时使用 Class.forName() 通过反射加载数据库的驱动程序;② Spring 框架也用到很多反射机制,最经典的就是 xml 的配置模式。 Spring 通过 XML 配置模式装 载 Bean 的过程: 1) 将程序内所有 XML 或 Properties 配置文件加载入内存中 ; 2)Java 类里面解析 xml或 properties 里面的内容,得到对应实体类的字节码字符串以及相关的属性信息 ; 3) 使用反射机 制,根据这个字符串获得某个类的Class 实例 ; 4) 动态配置实例的属性
48. Java获取反射的三种方法
1. 通过new对象实现反射机制
2. 通过路径实现反射机制
3. 通过类名实现反射机制
常用API
String相关
49. 字符型常量和字符串常量的区别
- 形式上: 字符常量是单引号引起的一个字符,字符串常量是双引号引起的若干个字符
- 含义上: 字符常量相当于一个整形值(ASCII值),可以参加表达式运算 字符串常量表示一个地址值(该字符串在内存中存放的位置)
- 占内存大小 字符常量只占一个字节 字符串常量占若干个字节
50. 什么是字符串常量池?
字符串常量池在堆内存中,专门用来存储字符串常量,可以提高内存的使用率,避免开辟多块空间存储相同的字符串,在创建字符串时JVM会首先检查字符串常量池,如果该字符串已经存在池中,则返回它的引用,如果不存在,则实例化一个字符串放到池中,并返回其引用
51. String有哪些特性
- 不变性: String是只读字符串,对它进行任何操作,都是创建一个新的对象,再把引用指向该对象.不变模式的主要作用在于当一个对象需要被多线程共享并频繁访问时,可以保证数据的一致性
- 常量池优化: String对象创建之后,会在字符串常量池中进行缓存,如果下次创建同样的对象时,会直接返回缓存的应用.
- final: 使用final来定义String类,表示String类不能被继承,提高了系统安全性
52. String str = "i" 与 String str = new String("i")一样吗?
不一样,内存分配方式不同,前者Java虚拟机会将其分配到常量池中,而后者会被分配到堆内存
53. String常用的方法?
indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
54. 使用HashMap时,用String做key有什么好处?
HashMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashcode被缓存下来,不需要再次计算,所以相比于其他对象更加快.
55. String和StringBuffer,StringBuilder区别?为什么String不可变?
可变性
- String类中使用字符数组保存字符串,privatefinal char value[],所以string对象不可变的.StringBuilder 与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的.
线程安全性
- String中的对象是不可以变得,可以理解为常量,线程安全.AbstractStringBuilder是StringBuilder和StringBuffer的公共父类,定义了一些字符串的基本操作,如append,insert,indexOf等StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程安全,StringBuilder没有加锁,所以非线程安全
性能
-
每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对 象。StringBuffffer 每次都会对 StringBuffffer 对象本身进行操作,而不是生成新的对象并改变对象引 用。相同情况下使用StirngBuilder 相比使用 StringBuffffer 仅能获得 10%~15% 左右的性能提升,但 却要冒多线程不安全的风险。
- 操作少量数据使用String
- 单线程操作字符串缓冲区 下操作大量数据:StringBuilder
- 多线程操作字符串缓冲区 下操作大量数据:StringBuffer
包装类
56. 自动装箱与自动拆箱
- 装箱: 将基本类型用他们对应的引用类型包装起来
- 拆箱: 将包装类型转换为基本数据类型
57. int和integer有什么区别
int的包装类就是integer,java5开始引入了自动装箱/拆箱,二者可以互相转换
int初始值0,integer初始值null