java基础面试题
1.==和equles的区别?
答:==是比较变量的值是否相等,变量又可以分为基本数据变量和引用类型变量,基本数据类型比较的是值是否相等,而引用数据变量则比较的是引用内存的首地址是否相等
equles:用来检测两个对象是否相等,即两个对象的内容是否相等,区分大小写。
2.String和StringBuffer,StringBuider的区别?
答:String内容是不可以改变的,因为String的底层是一个不可以改变的数组,被final修饰的(final char[])
StringBuffer和StringBuider内容是可以改变的,因为StringBuffer和StringBuider的底层是一个可以改变的数组
StringBuffer是线程不安全的,效率较高,StringBuider是线程安全,因为使用了锁,所以效率较低。
3.讲述一下java中的集合?
答:java中的集合分为value,key-value两种(Conllection Map)
value集合分为:list,set
list: 是有序的,可以重复的
set:是无序的,不可以重复的,根据equals和hashCode来判断是否重复的,也就是说如果一个对象要存储在set中,
必须要重写equals和HashCode
4.ArrayList和LinkedList的区别?
List集合分为ArrayList和LinkedList,ArrayList底层为数组,LinkedList底层为链表。
ArrayList的查询效率高,删除和修改效率低。因为ArrayList的数组在内存中是一块连续的内存,删除和修改需要移动内
存。
LinkedList的查询效率低,删除和修改的效率高。因为LinkedList不要求内存地址是连续的,当前元素会指定上
一个或者下一个元素的地址,当查询的时候就会从头开始一个一个找,所以查询的效率低,插入的时候不需要移动内
存,只需要
改变引用指向即可。
5.HashMap和HashTable的区别?HashTable和CurrentHashMap?
相同点:HashMap和HashTable都是以key,value进行存储的
不同点:HashMap是线程不安全的,效率高,允许空值和空键
HashTable是线程安全的,效率低,不允许空值和空键
如果想要效率高,又想线程是安全的,可以使用CurrentHashMap
CurrentHashMap是将Map分解为N个segment,类似于(HashTable),可以提供相同的线程安全,效率提升N倍,默认的
是16倍
6.实现一个拷贝文件的工具类是字符流还是字节流?
我们要拷贝的文件不确定是只有字符流,像图片,录音,是视频等就是字节流,所以为了通用,使用字节流。
7.讲述一下线程的几种启动方式?
1.线程的实现方式有几种?
1.1 通过继承Thread类实现一个线程
1.2 通过实现Runable的接口去实现一个线程
通过继承Thread类这种方式,不容易扩展,因为java只支持单继承
2.如何启动?
1.1 Thread thread=new Thread(继承了/或者实现了一个Runable对象)
1.2 启动线程使用的是start方法,而启动之后执行的方法是run方法
3.如何区分线程?
通过Thread.setName(“线程名称”);去设置一个线程的名称
8.讲述一下什么是设计模式?常用的设计模式有哪些?
设计模式就是在设计过程中可以反复利用的,可以解决待定问题的设计方法。
1.1什么是单例模式?
单例模式属于创建形模式,这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被
创建
**1.2.常用的设计模式有哪些?
单例模式:
1.懒汉式(用到的时候在创建对象)
```
public class Person(){
private Person(){
}
private static Person instance=new Person();
public static Person getInstance(){
return instance;
}
public static void main(Stirng args[]){
Person.getInstance.toString();
}
```
2.双重加锁的懒汉式
```
public static Person(){
private Person(){
}
private volatile static Person instace;
public static synchronized Person getInstace(){
if(instace==null){
synchronized (Person.class){
if(instace==null){
instace=new Person();
}
}
}
return instance;
}
}
volatile关键字是一种类型修饰符,变量具有 synchronized 的可见性特性,但是不具备原子性。这就是说线程能够自动发现
volatile 变量的最新值,其他线程可以看到 3.饿汉式(页面加载时就会创建对象)
public static Person(){
private Person(){
}
private static Person Instance=null;
public synchronized static Person getInstance(){
if(Instance!=null){
Instance=new Person();
}
return Instance;
}
}
```