文章目录
- 第一阶段面试题01
- 简述 static 和 final 的用法
- 写出冒泡排序的算法
- abstract class 和 interface 有什么区别
- 类有哪三个基本特性?各特性的优点?
- Error 和 Exception 有什么区别?列出你见过得 Exception 并简要说明
- Java中会存在内存泄露吗?请简单描述
- 多线程有几种实现方法,都是什么?同步有几种方法,都是什么?
- sleep() 和 wait() 有什么区别?
- 谈谈 Java 跟你所知道的其他语言相比, 有什么优点?
- 谈谈你对面向对象的理解?
- 简单讲一下java的跨平台原理
- 有了基本数据类型,为什么还需要包装类型?
- 说一下"=="和equals方法究竟有什么区别?
- 讲一下java中的集合
- ArrayList和LinkedList的区别?
- 讲一下HashMap和HashTable的区别?
- 请说出集合类中List、Map、Set的区别
- Collection 和 Collections的区别?
第一阶段面试题01
简述 static 和 final 的用法
static: 修饰属性, 方法, 代码块
- 静态属性: 也可叫类变量 类名.属性名 来访问
(共有的类变量与对象无关,只和类有关)
注意:类中的实例变量是在创建对象时被初始化的,被static修饰的属性,也就是类变量,是在类加载时被创建并进行初始化,类加载的过程是进行一次。也就是类变量只会被创建一次。 - 静态方法: 类名.方法名 直接访问
注意:static 修饰的方法,不能直接访问本类中的非静态(static)成员(包括方法和属性)
本类的非静态方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法。
修饰变量,方法,类
final: 修饰变量, 类, 方法
- 修饰变量
被fianl修饰的成员变量就是常量(常量名大写),一旦赋值不能改变
修饰局部变量:
修饰基本数据类型 -> 变量的值不能改变
修饰引用 -> 引用只能指向固定的对象
修饰实例变量:默认值不生效,可以再赋值 - 修饰方法: 不能被子类覆盖
- 修饰类: 不能被继承
在一个final类中的所有方法,默认都是final的
注意:final,不能用来修饰构造方法。
写出冒泡排序的算法
for(int i=0;i<arr.length-1;i++){ //控制轮数
for(int j=0;j<arr.length-1-i;j++){ //控制每一轮的次数
if(arr[j]>arr[j+1]){ //每次都是和它下一个元素比
int t=arr[j];
arr[j]=arr[j+1];
arr[j+1]=t;
}
}
}
abstract class 和 interface 有什么区别
abstract class | interface | |
---|---|---|
实例化 | 不能 | 不能 |
类 | 一种继承关系,一个类只能使用一次继承关系。可已通过实现多个接口 | 一个可以实现多个 interface |
数据成员 | 可有自己的 | 静态的不能被修改,即必须是 static final,一般不在此定义 |
方法 | 可私有的,非 abstract 方法,必须实现 | 不能有私有的,默认 public,abstract 类型 |
变量 | 可有私有的,变量有默认的类型,其值可以在子类中重新定义,也可以重新赋值 | 不可有私有的,默认是 public static final 型,必须给其赋初始值,实现类中不能重新蒂尼,不能改变其值 |
设计理念 | 表示是“is-a”关系 | 表示的是“like-a”关系 |
实现 | 需要继承,要用 extends | 要用 implements |
相同点
- 两者都是抽象类,都不能实例化
- interface实现类及abstract class的子类都必须要实现已经声明的抽象方法。
不同点
- interface需要实现,要用 implements,而 abstract class 需要继承,要用 extends。
- 一个类可以实现多个 interface,但只能继承一个 abstract class。
- interface强调特定功能的实现,而 abstract class 强调关系所属
- 尽管interface实现类及abstract class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface 中的每一个方法,都只是声明的(declaration,没有方法体),实现类必须要实现。而 abstract class 的子类可以有选择的实现。
类有哪三个基本特性?各特性的优点?
- 类具有封装性、继承性、多态性。
- 封装性:类的封装性为类的成员提供公有、缺省、保护和私有等访问权限,目的是隐藏类中的私有变量和类中方法的实现细节。
- 继承性:允许通过继承原有类的某些特性或全部特性而产生全新的类,原有的成为父类,产生的新类称为子类。子类不仅可以继承父类的共性,而且可以创建它特有的个性。
- 多态性:是指在基类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同行为,多态性有两种表现形式:重载和覆盖。
Error 和 Exception 有什么区别?列出你见过得 Exception 并简要说明
- error 表示系统级的错误和程序不必处理的异常,是恢复不是不可能但是很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的情况;
- exception 表示需要需要捕捉或者需要程序处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。
- 常见异常有:
NullPointerException:当操作一个空引用时会出现此错误。
NumberFormatException:数据格式转换出现问题时出现此异常。
ClassCastException:强制类型转换类型不匹配时出现此异常。
ArrayIndexOutOfBoundsException:数组下标越界,当使用一个不存在的数组下标时出现此异常。
Java中会存在内存泄露吗?请简单描述
答:
内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩溃。Java 存在内存泄露。
Java 中的内存泄露当然是指:存在无用但是垃圾回收器无法回收的对象。而且即使有内存泄露问题存在,也不一定表现出来。自己实现实现堆栈的数据结构时有可能会出现内存泄露。
多线程有几种实现方法,都是什么?同步有几种方法,都是什么?
答:
多线程有两种实现方法:继承 Thread 类或者实现 Runnable 接口。
实现同步也有两种方法:一种是同步方法,一种是同步代码块。
同步方法是在方法的返回值类型前面加上 synchronzed 关键字
同步代码块是 synchronized (这里写需要同步的对象) {…}
sleep() 和 wait() 有什么区别?
- Thread 类的方法:sleep(),yield()等
Object 的方法:wait() 和 notify()等- 每个对象都有一个锁来控制访问。Synchronized 关键字可以和对象的锁交互,来实现线程的同步。
sleep 方法没有释放锁;
wait 方法释放了锁,使得其它线程可以使用同步控制块或者方法。- wait ,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep可以在任何地方使用。
- sleep 必须捕获异常,而 wait,notify 和 notifyAll 不需要捕获异常
谈谈 Java 跟你所知道的其他语言相比, 有什么优点?
Java 是一种可以撰写快平台应用的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
Java 是功能完善的通用程序设计语言,可用来开发可靠的、要求严格的应用程序。
Java 是纯面向对象开发,功能强大,分支众多,没有 Java 不能做的软件。 C/S 也好 B/S 也好。从功能上讲, 没有语言可以和 Java 相比。
C是面向过程编程的,这样往往会导致所谓的单一程序,既所有的功能只能包含在几个(通常是一个)代码模块中。当然,C语言也有自身的不足,比如:C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数族下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
谈谈你对面向对象的理解?
Java面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节
所谓的面向对象就是将我们的程序模块化,对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类里面,这就是封装。封装是我们所说的面相对象编程的特征之一。除此之外还有继承和多态。继承有点类似与我们生物学上的遗传,就是子类的一些特征是来源于父类的,儿子遗传了父亲或母亲的一些性格,或者相貌,又或者是运动天赋。有点种瓜得瓜种豆得豆的意思。面向对象里的继承也就是父类的相关的属性,可以被子类重复使用,子类不必再在自己的类里面重新定义一回,父类里有点我们只要拿过来用就好了。而对于自己类里面需要用到的新的属性和方法,子类就可以自己来扩展了。当然,会出现一些特殊情况,就是我们在有一些方法在父类已经定义好了,但是子类我们自己再用的时候,发现,其实,我们的虽然都是计算工资的,但是普通员工的工资计算方法跟经理的计算方法是不一样的,所以这个时候,我们就不能直接调用父类的这个计算工资的方法了。这个时候我们就需要用到面向对象的另一个特性,多态。对,就是多态,我们要在子类里面把父类里面定义计算工资的方法在子类里面重新实现一遍。多态包含了重载和重写。重写很简单就是把子类从父亲类里继承下来的方法重新写一遍,这样,父类里相同的方法就被覆盖了,当然啦,你还是可以通过super.CaculSalary方法来调用父类的工资计算方法。而重载就是类里面相同方法名,不同形参的情况,可以是形参类型不同或者形参个数不同,或者形参顺序不同,但是不能使返回值类型不同。
简单讲一下java的跨平台原理
java源程序(.java文件)通过编译器编译成为Class文件(字节码文件),而它的class文件是基于字节码(以byte为单位存储的文件)的,而字节码文件是描述程序要运行的的虚指令的集合,这些虚指令的集合与任何的平台无关,Java虚拟机认识它(只要在不同的平台下部署相应的jre,运行jvm!就可以了)
有了基本数据类型,为什么还需要包装类型?
我们知道Java是一个面相对象的编程语言,基本类型并不具有对象的性质,为了让基本类型也具有对象的特征,就出现了包装类型(如我们在使用集合类型Collection时就一定要使用包装类型而非基本类型),它相当于将基本类型“包装起来”,使得它具有了对象的性质,并且为其添加了属性和方法,丰富了基本类型的操作。
另外,当需要往ArrayList,HashMap中放东西时,像int,double这种基本类型是放不进去的,因为容器都是装object的,这是就需要这些基本类型的包装器类了。
说一下"=="和equals方法究竟有什么区别?
== 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用 == 操作符。
equals 方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。
讲一下java中的集合
set(集)、list(列表)和map(映射)。
区别嘛 HashMap 只有 key 和 value 值对应的。
set 是可以自动清除相同的元素
list是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
ArrayList和LinkedList的区别?
- ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
讲一下HashMap和HashTable的区别?
在Java 2以前,一般使用Hashtable来映射键值和元素。为了使用Java集合框架,Java对Hashtable进行了重新设计,但是,为了向后兼容保留了所有的方法。Hashtable实现了Map接口,除了Hashtable具有同步功能之外,它与HashMap的用法是一样的。·
在使用时一般是用ArrayList代替Vector,LinkedList代替Stack,HashMap代替HashTable,即使在多线程中需要同步,也是用同步包装类。
请说出集合类中List、Map、Set的区别
- List和Set继承了Collection接口,而map不是;
- List中存放元素有顺序并且可以重复;
- set中存放的元素是无序并且是不可能重复的;
- Map中存放是键值对。
Collection 和 Collections的区别?
Collection是java.util下的接口,它是各种集合的父接口,继承于它的接口主要有Set 和List;Collections是个java.util下的类,是针对集合的帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
HashSet :内部封装了HashMap和TreeMap,数据保存在键这一列
LinkedHashMap(哈希表,存放数据以链表来连接,数组存放无序但链表连接有序,可看做一个有序的HashMap),既可快速定位,查找数据,又可以使数据存放有序
ConcurrentHashMap(分段加锁)Concurrent-同步