讲一下快速排序算法
通过一次排序将数列分为两部分,一部分比另一部分数字都小
时间复杂度O(nlogn)
空间复杂度O(1)
先确定一个中间比较值,确定一个左指针(从头开始),右指针(从尾部开始)
while循环左子针一直往右找,右指针一直往左找,一直到二者有交集,就会退出循环,说明没有找到,若是在退出循环前找到了,则交换二者的位置
// 交换完毕 如果该值 等于中轴值 则需 将右下标往前推进
if (arr[l] == pivot) {r -= 1;}// 交换完毕 如何该值 等于中轴值 则需 将左下标往后推进if (arr[r] == pivot) {l += 1;}
之后,再递归左遍历,右遍历
JDK、JRE、JVM的区别
jdk:包含jre,编译java代码,监控jvm的一些工具java Development kit ,java开发工具,javac.exe 打包工具jar.exe
jre 大部分都是C和C++语言编写的,是编译java是所需要的基础类库,java runtime environment包括java虚拟机和java程序所需的核心类库等,java.lang包,包含运行java程序必不可少的系统类,基本数据类型,基本数学函数,字符串的处理等
jvm:java的虚拟机平台,java程序需要在此平台运行,可以跨平台使用
什么是跨平台性
所谓跨平台性,是指java语言编写的程序,一次编译后,可以在多个系统平台上运行。
java和C++的区别
都是面向对象的语言,都支持封装、继承和多态
Java不提供指针来直接访问内存,程序内存更加安全
Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
Java有自动内存管理机制,不需要程序员手动释放无用内存
Java有哪些数据类型
- 引用型 类,接口,数组
- 基本数据类型
整型 int short long byte
浮点类型 float double
字符型 char
布尔型 boolean
最有效的方法去计算 2 乘以 8
2 << 3(左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。
System.out.println(2 << 3 == 2 * 2 * 2 *2);System.out.println(1 << 2 == 1 * 2 * 2 );System.out.println(9 >> 3); // 1System.out.println(27 >> 3);// 3
访问修饰符 public,private,protected,以及不写(默认)时的区别
- private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
- default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。
使用对象:类、接口、变量、方法。 - protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类
(外部类)。 - public : 对所有类可见。使用对象:类、接口、变量、方法
&和&&的区别
- &运算符有两种用法:(1)按位与;(2)逻辑与。
- &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true 整个表达式的值才是 true。&&之所以称为短路运算,是因为如果&&左边的表达式的值是 false,右边的表达式会被直接短路掉,不会进行运算。
java对象的三大特性
-
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问。
-
继承:使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承类。通过使用继承我们能够非常方便地复用以前的代码。
- 子类拥有父类非 private 的属性和方法。
- 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
-
父类或接口定义的引用变量可以指向子类或具体实现类的实例对象。提高了程序的拓展性。在Java中有两种形式可以实现多态:继承(多个子类对同一方法的重写)和接口(实现接口并覆盖接口中同一方法)。
什么是多态机制?Java语言是如何实现多态的?
- 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
- 多态分为编译时多态和运行时多态。其中编辑时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的函数,通过编辑之后会变成两个不同的函数,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是我们所说的多态性。
多态的实现
- Java实现多态有三个必要条件:继承、重写、向上转型。
- 继承:在多态中必须存在有继承关系的子类和父类。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才能够具备技能调用父类的方法和子类的方法。
方法的重载和重写
重写 父子类之间涉及方法的重写,继承父类除了private的所有的属性和方法
方法返回类型不能改变,
重载 在同一个类中出现,返回值类型更改,入参也有改变
抽象类和接口的区别
抽象类
方法都抽象的,但是抽象的方法并不一定都都是抽象类,可以为任何类型,一个类只能继承一个抽象类,把具有共同属性的事物抽象,比如动物类
接口
可以定义构造器,修饰属性必须为public,有共同的动作,比如说,吃饭的动作,eat(),一类可以实现多个接口
int和Integer的区别
- Integer是int的包装类,int则是java的一种基本数据类型
- Integer变量必须实例化后才能使用,而int变量不需要
- Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
- Integer的默认值是null,int的默认值是0