Java基础总结
String类能被继承吗?为什么?
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的,实现细节不允许改变。
sleep()和wait()的区别?
- sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,把执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
- wait是Object类的方法,对此对象
- 调用sleep不会释放对象锁。
- 调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。
简述synchronized和java.util.concurrent.locks.lock的区别?
- 主要相同点:Lock能完成synchronized所实现的所有功能
- 主要不同点:Lock有比synchronized更精确的线程语义和更好的性能。synchronized会 自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。
InputStream,outputStream,Reader,Write类的区别?
①Reader和writer是字符流,InputStream/OutputStream是字节流
②Reader和write用于读取文本文件,InputStream/OutputStream由于读取二进制文件
③ InputStream、Reader是输入流;OutputStream、write是输出流
④Reader和write支持16位的Unicode字符输出,InputStream/OutputStream支持8位的字符输出
⑤字节流可以用字符流形式读取
进程和线程的区别?
①进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1–n个线程。
②线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。
③线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
④多进程是指操作系统能同时运行多个任务(程序)。
⑤多线程是指在同一程序中有多个顺序流在执行。
⑥在java中要想实现多线程,有三种手段,一种是继承Thread类,另外一种是实现Runable接口,还有就是实现Callable接口。
final, finally, finalize的区别?
- final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
- finally是异常处理语句结构的一部分,表示总是执行。
- finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。
HashMap和Hashtable的区别。
(1)HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key)。
(2)由于非线程安全,效率上可能高于Hashtable。
(3)HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
(4)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
(5)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
集合和数组的区别
- 数组的长度是固定的,而集合长度是可变的
- 数组值可以存储对象,还可以存储基本数据类型;而集合只能够只能存储对象
- 数组存储的数据类型是固定的,而集合存储的数据类型不固定
ArrayList和LinkedList、vector
ArrayList 内部借助于数组实现元素的存储。
ArrayList 是线程不安全的,相对于线程安全的Vector来说可能效率较高。
ArrayList 内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
ArrayList 内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 )
LinkedList 内部基于链表实现元素的存储。
LinkedList是线程不安全的。
LinkedList内部基于链表实现数据存储,因此随机访问效率较低。( 需要逐个遍历链表中的结点 )
LinkedList内部基于链表实现数据存储,因此增删元素速度较快。( 增删元素只需要修改相邻两个节点的指针 )
vector线程安全,借助于数组存储数据
Vector类和Stack类
-
Vector 内部借助于数组实现元素的存储。
Vector是线程安全的,相对于线程不安全的ArrayList来说可能效率较低。
Vector内部基于数组实现数据存储,因此随机访问效率较高。( 可以使用索引直接访问数组中的元素 )
Vector内部基于数组实现数据存储,因此增删元素速度较慢。( 增删元素可能需要挪动数组中大量元素 ) -
Stack 类是 Vector 类的子类。
push 将元素压入栈顶
peek 检查栈顶元素(不弹出元素)
pop 弹出栈顶元素
search 从栈顶开始搜索元素( 基数从 1 开始 )
empty 判断当前栈是否为空
线程的五种状态:
1、 新建状态:new Thread();
2、 就绪状态:t.starts();等待获得CPU
3、 运行状态:获得CPU,实现run方法
4、 阻塞状态:执行了Thread.sleep方法、发生了IO操作、或者调用了同步锁的外套方法
5、 死亡状态:代码执行完毕。
sleep 和 yield 的区别:
-
sleep 不考虑线程优先级 ( 一个线程睡眠后其它线程都有机会获得CPU ),yield 要考虑线程优先级 ( 仅让位给 跟自己同等优先级或优先级比自己高的线程 )
-
sleep 可能抛出 InterruptedException ,而 yield 不会抛出异常
-
sleep 导致运行状态的线程进入到阻塞状态,而 yield 会导致运行状态的线程进入就绪状态
String、StringBuffer、StringBuilder的区别
- String:字符串常量,字符串长度不变,是被声明程final的,一次赋值不可改变
- StringBuffer:字符串变量,线程安全,如果需要频繁的对字符串内容进行修改,处于效率考虑最好使用StringBuffer;
- StringBuilder:字符串变量,非线程安全,与StringBuffer的区别是StringBuilder它是在单线程环境下使用的,所以效率要比StringBuffer
int和Integer的区别
- Integer是引用数据类型,是int提供的封装类,。int是基本数据类型中的一种。
- Integer定义的数组初始值为null。int定义的数组初始值为0
- Integer是一个对象,需要一个引用来指向这个对象,int是基本数据类型, 直接存储在内存中。
抽象类与接口的异同
抽象类有代码块而接口没有代码块
抽象类和接口都不能直接实例化
抽象类和接口都用extends继承父类
类(抽象类)是单继承,接口是多继承
接口是设计的结果 ,抽象类是重构的结果
如果一个类里有抽象方法,那么这个类只能是抽象类
抽象类可以有具体的方法 和属性(不能用abstract定义), 接口只能有抽象方法和不可变常量
抽象类用abstract声明,接口用interface声明
异常处理机制
-
当程序发生异常时会产生一个代表该异常的对象
-
同时当前程序会把这个异常对象交给运行时系统
-
运行时系统根据接受到的异常对象寻找相应代码来处理该异常。
-
处理异常的方式有两种,一种是 捕获异常 ,另外一种是 抛出异常。
受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的区别
-
运行时异常是指 直接 或 间接 继承了 java.lang.RuntimeException 类的那些 异常类,
而 受检查异常 是指从来都没有继承过 java.lang.RuntimeException 类的那些 异常类 。 -
对于受检查异常来说,必须在编译之前就显式书写异常的处理代码,
可以是通过 try … catch … finally 语句捕获并处理异常,
也可以通过为 相应的方法 添加 throws 声明 来 声明抛出的异常类型。 -
对于运行时异常来说,在编译阶段可以不显式书写任何跟异常处理有关的代码。
受检查异常( checked-exception ) 和 运行时异常 ( runtime-exception ) 的相同点
- 都是异常( 都是 Exception 的子类型,不是 Error 的子类型 )
- 都可以被 捕获 ( try … catch … finally ) 或 抛出 ( throw )
十种常见的异常
IOException
FileNotFoundException
RunnTimeException
ArithmeticException
lllegalArgumentException
ArrayIndexOutOfBoundsException
NullPointerException
ArrayStoreException
ClassCastException
NumberFormatException
Mysql和ORACLE的区别
- Oracle是大型数据库而Mysql是中小型数据库 Mysql是开源的而Oracle价格非常高
- Oracle支持大并发,大访问量
- Oracle也Mysql操作上的一些区别
- 主键 Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;
- Oracle没有自动增长类型,主键一般使用的序列,插入记录时将***的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可。
- 单引号的处理 MYSQL里可以用双引号包起字符串,
ORACLE里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号。
单列的特点和作用
特点:
- 单例类确保自己只有一个实例。
- 单例类必须自己创建自己的实例。
- 单例类必须为其他对象提供唯一的实例
作用: - 控制资源的使用,通过线程同步来控制资源的并发访问;
- 控制实例产生的数量,达到节约资源的目的。
- 作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信
懒汉式:
public class Sun{
private static Sun s;//定义一个私有的静态成员变量用来存储那个唯一的实例
private Sun(){
super();
System.out.println("private Sun");
}
public static Sun getInstance(){//定义一个非私有的静态成员方法
if(s==null){
s=new Sun;
}else{
return s;
}
}
}
饿汉式
public class Earth{
private static Earth EARTH=new Earth();
private Earth(){
super();
System.out.println("private Earth");
}
public static Earth getInstance(){
return EARTH;
}
}
上一篇: 联想扬天S15酷睿版值得入手吗 联想扬天S15酷睿版详细评测
下一篇: php 浮点数之间比较