1、八种基本数据类型有哪些?
- 整数数据类型
byte:1个字节,8位,256种状态,取值范围为【-128,127】
short:2个字节,16位,65536种状态,取值范围为【-32768,32767】
int:4个字节,32位,整数类型默认是int类型,取值范围约21亿
long:8个字节,64位,long类型表示long类型常量,要加L或者l,建议加L- 小数数据类型
float:4个字节,32位,单精度,能精确到6~7位,声明一个小数类型,要加F或者f,建议加F
double:8个字节,64位,双精度,能精确到15~16位,小数类型默认是double类型- 字符数据类型
char:2个字节,16位,字符表示Unicode(万国码)编码表中的每一个符号,每个符号使用单引号引起来,其中前128个符号和ASCII表相同- 布尔数据类型
boolean:占1位,有true和false2个值,一个表示真,一个表示假,一般用于表示逻辑运算
2、&&和&的区别 |和||的区别
&是将两个二进制的数逐位相与,结果是相与之后的结果;&&就是判断两个表达式的真假性,只有两个表达式同时为真才为真,有一个为假则为假,具有短路性质。
|、|| 同理
3、数组的优点和缺点 特点
(一)优点:
1、按照索引查询元素速度快;
2、能存储大量数据;
3、按照索引遍历数组方便;
4、数组定义简单,而且访问很方便;
5、可以随机访问其中的元素。
(二)缺点:
1、根据内容查找元素速度慢;
2、数组的大小一经确定不能改变,不适合动态存储;
3、数组智能存储一种类型的数据;
4、增加、删除元素效率慢;
5、未封装任何方法,所有操作都需要用户自己定义;
6、数组的空间必须是连续的,这就造成数组在内存中分配空间时必须找到一块连续的内存空间。所以数组不可能定义的太大,因为内存中不可能有那么多大的连续的内存空间,而解决这个问题的方法就是使用链表。
4、冒泡排序手写
5、快速排序手写
6、面向对象三大特征
7、权限访问修饰符有哪些?作用域是什么?
1,public 共有修饰符,所有类都可以访问,可以修饰类、数据成员、构造方法及方法成员
2,private 私有修饰符,只有在当前类中可以调用,可以修饰数据成员、构造方法及方法成员,不可以修饰类
3,protected 保护修饰符,只有子类可以调用,可以修饰数据成员、构造方法和方法成员,不可以修饰类
4,默认修饰符,只能被当前类或同包下被调用,类、方法、成员都可以使用默认权限,即不被private、protected,public修饰
8、封装的好处?
- 提高代码的安全性。
- 提高代码的复用性。
- “高内聚”:封装细节,便于修改内部代码,提高可维护性。
- “低耦合”:简化外部调用,便于调用者使用,便于扩展和协作。
9、this和super指针的区别?
1、this是一个指向本对象的指针,而super是一个java的关键字
2、this和super不能同时出现在同一个构造方法中
3、this出现在构造方法中表示调用本类的其它构造方法,super出现在构造方法中表示调用父类的构造方法
4、this出现在普通方法中表示对象调用者,super出现在普通方法中表示调用父类中被覆盖的同名方法
5、this和super出现在类的构造方法中都必须写在第一行。
6、每个子类的构造方法中都隐含地调用父类的默认构造方法
10、重写和重载的区别
1、重载发生在本类,重写发生在父类与子类之间;
2、重载的方法名必须相同,重写的方法名相同且返回值类型必须相同;
3、重载的参数列表不同,重写的参数列表必须相同。
11、抽象类和接口的区别
抽象类和接口都是Java中的重要概念,它们都可以用来定义抽象的数据类型。但是它们之间有一些区别,具体如下:
-
抽象类可以包含非抽象方法,而接口只能包含抽象方法。
-
类只能继承一个抽象类,但可以实现多个接口。
-
抽象类可以有构造方法,而接口不能有构造方法。
-
抽象类可以有成员变量,而接口只能有常量。
-
抽象类的方法可以有public、protected和default访问修饰符,而接口的方法只能有public访问修饰符。
-
抽象类的子类必须实现所有抽象方法,而实现接口的类必须实现所有接口中的方法。
-
抽象类可以有普通方法,而接口不能有普通方法。
总之,抽象类和接口都是用来定义抽象的数据类型,但是它们的使用场景和语法有所不同。抽象类适合用于定义一些具有共性的类,而接口适合用于定义一些具有相似功能的类。在实际开发中,我们需要根据具体的需求来选择使用抽象类还是接口。
12、final关键字有什么作用
final关键字可以修饰类、方法和属性。
- 当final修饰类的时候,表明这个类不能被继承。final 类中的所有成员方法都会被隐式地指定为 final方法。
- 当final修饰方法的时候,表明这个方法不能被重写。
- 当final修饰属性的时候,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
13、static关键字有什么作用
-
为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。
-
实现某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。
static 主要有 4 种使用情况:成员变量、成员方法、代码块和内部类。
14、多态的三个前提条件
1、必须有继承关系(继承的好处第三点作为多态的前提条件)
如果没有继承谈不上多态
2、方法重写,子类继承父类,将父类的功能覆盖掉,使子类最具体的功能
3、父类引用指向子类对象
15、编译时多态和运行时多态
编译时多态
- 方法的重载
方法重载就是在同一个类中,出现了多个同名的方法,他们的参数列表(方法签名)不同 (参数列表的个数不同,参数列表的数据类型不同,参数列表的顺序不同)
根据实际参数的数据类型、个数和次序,Java在编译时能够确定执行重载方法中的哪一个。 - 方法重写时的编译时多态:
除了重载,重写也表现出两种多态性。当一个对象的引用指向的是当前对象所属类的对象时,为编译时多态,其他则为运行时多态。
运行时多态
当父类引用指向子类对象时:
-
父类只能执行那些在父类中声明、被子类覆盖了的子类方法,而不能执行子类新增加的成员方法。在编译时期,首先会去查看父类里面有没有这个方法,如果没有的话向上继续查找,直到找到Object类如果还没有的话就报错,如果有的话,到运行阶段,再去看一下子类中有没有覆盖该方法,如果覆盖了,则执行子类覆盖的方法。如果没有则执行父类中原本的方法。
-
当子类和父类有相同属性时,父类还是会执行自己所拥有的属性,若父类中没有的属性子类中有,当父类对象指向子类引用时(向上转型),在编译时期就会报错
-
对于static方法还是会执行父类中的方法,这是由于在运行时,虚拟机已经认定static方法属于哪个类。“重写”只能适用于实例方法,不能用于静态方法。对于静态方法,只能隐藏,重载,继承子类会将父类静态方法的隐藏(hide),但子类的静态方法完全体现不了多态,就像子类属性隐藏父类属性一样,在利用引用访问对象的属性或静态方法时,是引用类型决定了实际上访问的是哪个属性,而非当前引用实际代表的是哪个类。因此,子类静态方法不能覆盖父类的静态方法
16、equals()和hashcode()方法的区别
equals和hashCode方法主要的区别在于:性能,可靠性;
- equals方法:因为hashCode并不是完全可靠的,有时候不同的对象生成的hashCode也可能一样(生成hashCode值的公式可能存在问题),所以hashCode并不是完全可靠的,只能通过equals保证两个对象确实相等。
- hashCode方法:因为重写equals方法比较复杂,调用equals方法比较对象是否相等的效率比较低,而利用hashCode进行对比,只需要生成一个hash值进行比较就可以,效率较高。
实际应用:对于需要大量并且快速对比,如果都用equals比较效率太低,所以每当需要对象比较时,先用hashCode对比,如果hashCode值不一样,两对象肯定不相等,也就没必要再用equals比较,如果hashCode相等,再用equals对比,euqals相同则表示这两个对象确实相同,既提高了执行效率也保证了可靠性。
17、equals()和==的区别
==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同
==是指对内存地址进行比较 , equals()是对字符串的内容进行比较
==指引用是否相同, equals()指的是值是否相同
18、instanceof关键字的作用
判断左边对象是否是右边类(这里有很多人说是对象,所以注意这里是类,并不是对象)的实例(通俗易懂的说就是:子类对象,或者右边类本身的对象)返回的boolean类型,true和false。
19、String类的常用API
方法名 | 方法说明 |
---|---|
length() | 获取字符串的长度 |
equals(String s) | 判断两个字符串内容是否相同 |
equalsIgnoreCase(String s) | 不区分大小写判断两个字符串内容是否相同 |
charAt(int index) | 返回下标所在的cha值(字符) |
indexOf(String s) | 返回字串第一次出现的位置,没出现则返回-1 |
lastIndexOf(String s) | 返回字串最后一次出现的位置,没出现返回-1 |
starstWith(String prefix) | 判断字符串是否以prefix为前缀开头 |
endsWith(String suffix) | 判断字符串是否以suffix为后缀结尾 |
toLowerCase() | 返回字符串的小写形式 |
toUpperCase() | 返回字符串的大写形式 |
substring(int startindex,int endindex) | 返回从startindex开始到endindex结束的字串 |
contains(String s) | 判断是否包含字串s |
concat(String s) | 字符串拼接,相当于+ |
replaceAll(String oldSrt,String newSrt) | 替换原有字符串中的字串为目标字串 |
split(String split) | 以指定字符串分割后返回字符串数组 |
getBytes() | 返回字符串的字节数组 |
tocharArray() | 将此字符串转换为一个新的字符数组 |
tirm() | 返回字符串两边消除空格后的字符串 |
isEmpty() | 判断字符串是否为空 |
compareTo | 将字符串与另一个对象进行比较 |
hashCode() | 返回字符串的哈希值 |
20、String、StringBuffer、StringBuilder的区别
执行速度由快到慢:StringBuilder > StringBuffer > String
21、异常的分类
- 1、 Error(错误):
是程序无法处理的错误,表示运行应用程序时出现的较严重的问题,大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java虚拟机)出现的问题 - 2、 Exception(异常):
是程序本身可以处理的异常 - 3、可查异常(checked exceptions):
是编译器要求必须处置的异常,正确的程序在运行过程中,很容易出现情理可容的异常状况。 - 4、不可查异常(unchecked exceptions):
编译器不要求强制处置的异常,包括运行时异常,即RuntimeException与其子类和错误(Error)。 - 5、 运行时异常:
都是RuntimeException类及其子类异常,如空指针异常、下标越界异常等,这些异常是不可查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。 - 6、 非运行时异常(编译异常):
是RuntimeException以外的异常,类型上也属于Exception类及其子类。从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
22、try、catch、finally代码块是什么意思
- try块:
- 用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
- 负责存放程序逻辑代码
- catch块:
- 用于处理try捕获到的异常
- finally块:
- 无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return 语句时,finally 语句块将在方法返回之前被执行。
23、throw和throws区别
- throw:
- 用于在代码中抛出一个已知的异常
- 一般是在代码块的内部,出现在函数体,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常
- 一定抛出了某种异常对象
- throws:
- 当某个方法可能会抛出某种异常时用于throws 声明可能抛出的异常类型,然后交给上层调用它的方法程序处理
- 出现在方法函数头
- 表示出现异常的一种可能性,并不一定会发生这些异常
24、常见的异常(5-10个)
- 1、NullPointerException (空指针异常)
操作一个 null 对象的方法或属性时会抛出这个异常。 - 2、OutofOutofMemoryError (内存出现异常的一种异常)
这不是程序能控制的,是指要分配的对象的内存超出了当前最大的堆内存,需要调整堆内存大小(-Xmx)以及优化程序。 - 3、IOException (IO异常)
即:input, output,我们在读写磁盘文件、网络内容的时候经常会生的一种异常,这种异常是受检查异常,需要进行手工捕获。
如文件读写会抛出 IOException: - 4、FileNotFoundException (文件找不到异常)
如果文件不存在就会抛出这种异常。
FileNotFoundException 其实是 IOException 的子类,同样是受检查异常,需要进行手工捕获。
如定义输入输出文件流,文件不存在会报错: - 5、ClassNotFoundException (类找不到异常)
Java开发中经常遇到,是不是很绝望?这是在加载类的时候抛出来的,即在类路径下不能加载指定的类。它是受检查异常,需要进行手工捕获。 - 6、ClassCastException (类转换异常)
将一个不是该类的实例转换成这个类就会抛出这个异常。
这是运行时异常,不需要手工捕获。 - 7、IndexOutOfBoundsException (索引越界异常)
当操作一个字符串或者数组的时候经常遇到的异常。它是运行时异常,不需要手工捕获。
例:一个ArrayList数组中没有元素,而你想获取第一个元素,运行是就会报此类型的错误。 - 8、ArithmeticException (算术异常)
发生在数字的算术运算时的异常,如一个数字除以 0 就会报这个错。 - 9、NumberFormatException (数字格式异常)
当试图将一个String 转换为指定的数字类型,而该字符串确不满足数字类型要求的格式时,抛出该异常。 - 10、StringIndexOutOfBoundsException (字符串索引越界异常)
当使用索引值访问某个字符串中的字符,而该索引值小于0或大于等于序列大小时,抛出该异常.