史上最全Java面试题(带全部答案)
相关概念
面向对象的三个特征
封装,继承,多态,这个应该是人人皆知,有时候也会加上抽象。
多态的好处
允许不同类对象对同一消息做出响应,即同一消息可以根据发送对象的不同而采用多种不同的行为方式(发送消息就是函数调用)。主要有以下优点:
可替换性:多态对已存在代码具有可替换性
可扩充性:增加新的子类不影响已经存在的类结构
接口性:多态是超类通过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的。
灵活性
简化性
代码中如何实现多态
实现多态主要有以下三种方式:
1. 接口实现
2. 继承父类重写方法
3. 同一类中进行方法重载
虚拟机是如何实现多态的
动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法。
接口的意义
接口的意义用三个词就可以概括:规范,扩展,回调。
抽象类的意义
抽象类的意义可以用三句话来概括:
为其他子类提供一个公共的类型
封装子类中重复定义的内容
定义抽象方法,子类虽然有不同的实现,但是定义时一致的
接口和抽象类的区别
比较 | 抽象类 | 接口 |
---|---|---|
默认方法 | 抽象类可以有默认的方法实现 | java 8之前,接口中不存在方法的实现. |
实现方式 | 子类使用extends关键字来继承抽象类.如果子类不是抽象类,子类需要提供抽象类中所声明方法的实现. | 子类使用implements来实现接口,需要提供接口中所有声明的实现. |
构造器 | 抽象类中可以有构造器, | 接口中不能 |
和正常类区别 | 抽象类不能被实例化 | 接口则是完全不同的类型 |
访问修饰符 | 抽象方法可以有public,protected和default等修饰 | 接口默认是public,不能使用其他修饰符 |
多继承 | 一个子类只能存在一个父类 | 一个子类可以存在多个接口 |
添加新方法 | 想抽象类中添加新方法,可以提供默认的实现,因此可以不修改子类现有的代码 | 如果往接口中添加新方法,则子类中需要实现该方法. |
父类的静态方法能否被子类重写
不能。重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,我们一般称之为隐藏。
什么是不可变对象
不可变对象指对象一旦被创建,状态就不能再改变。任何修改都会创建一个新的对象,如 String、Integer及其它包装类。
静态变量和实例变量的区别?
静态变量存储在方法区,属于类所有。实例变量存储在堆当中,其引用存在当前线程栈。
能否创建一个包含可变对象的不可变对象?
当然可以创建一个包含可变对象的不可变对象的,你只需要谨慎一点,不要共享可变对象的引用就可以了,如果需要变化时,就返回原对象的一个拷贝。最常见的例子就是对象中包含一个日期对象的引用。
java 创建对象的几种方式
采用new
通过反射
采用clone
通过序列化机制
前2者都需要显式地调用构造方法。造成耦合性最高的恰好是第一种,因此你发现无论什么框架,只要涉及到解耦必先减少new的使用。
switch中能否使用string做参数
在idk 1.7之前,switch只能支持byte, short, char, int或者其对应的封装类以及Enum类型。从idk 1.7之后switch开始支持String。
switch能否作用在byte, long上?
可以用在byte上,但是不能用在long上。
String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4请问s5==s2返回什么?
返回false。在编译过程中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被创建在堆区,相当于s5=new String(“ab”);
你对String对象的intern()熟悉么?
intern()方法会首先从常量池中查找是否存在该常量值,如果常量池中不存在则现在常量池中创建,如果已经存在则直接返回。
比如
String s1=”aa”;
String s2=s1.intern();
System.out.print(s1==s2);//返回true
Object中有哪些公共方法?
equals()
clone()
getClass()
notify(),notifyAll(),wait()
toString
java当中的四种引用
强引用,软引用,弱引用,虚引用。不同的引用类型主要体现在GC上:
强引用:如果一个对象具有强引用,它就不会被垃圾回收器回收。即使当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。如果想中断强引用和某个对象之间的关联,可以显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。
软引用:在使用软引用时,如果内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。
弱引用:具有弱引用的对象拥有的生命周期更短暂。因为当 JVM 进行垃圾回收,一旦发现弱引用对象,无论当前内存空间是否充足,都会将弱引用回收。不过由于垃圾回收器是一个优先级较低的线程,所以并不一定能迅速发现弱引用对象。
虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。
更多了解参见深入对象引用:
http://blog.csdn.net/dd864140130/article/details/49885811
WeakReference与SoftReference的区别?
这点在四种引用类型中已经做了解释,这里简单说明一下即可:
虽然 WeakReference 与 SoftReference 都有利于提高 GC 和 内存的效率,但是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能阻止被回收,但是可以延迟到 JVM 内存不足的时候。
为什么要有不同的引用类型
不像C语言,我们可以控制内存的申请和释放,在Java中有时候我们需要适当的控制对象被回收的时机,因此就诞生了不同的引用类型,可以说不同的引用类型实则是对GC回收时机不可控的妥协。有以下几个使用场景可以充分的说明:
利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题.
通过软引用实现Java对象的高速缓存:比如我们创建了一Person的类,如果每次需要查询一个人的信息,哪怕是几秒中之前刚刚查询过的,都要重新构建一个实例,这将引起大量Person对象的消耗,并且由于这些对象的生命周期相对较短,会引起多次GC影响性能。此时,通过软引用和 HashMap 的结合可以构建高速缓存,提供性能。
java中==和eqauls()
的区别,equals()
和`hashcode的区别
==是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和==的结果一样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,如果需要比较对象内容,需要重写equal方法。
equals()
和hashcode()
的联系
hashCode()
是Object类的一个方法,返回一个哈希值。如果两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值。
如果两个对象根据eqaul()方法比较不相等,那么产生的哈希值不一定相等(碰撞的情况下还是会相等的。)
a.hashCode()有什么用?与a.equals(b)有什么关系
hashCode() 方法是相应对象整型的 hash 值。它常用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,使用 equal() 方法来判断两个相等的对象,必须具有相同的 hashcode。
将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合。如果hashcode相等,然后通过equal()方法判断要放入对象与集合中的任意对象是否相等:如果equal()判断不相等,直接将该元素放入集合中,否则不放入。
有没有可能两个不相等的对象有相同的hashcode
有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为什么在 hashmap 中会有冲突。如果两个对象相等,必须有相同的hashcode 值,反之不成立。
可以在hashcode中使用随机数字吗?
不行,因为同一对象的 hashcode 值必须是相同的
a==b与a.equals(b)有什么区别
如果a 和b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,所以通常需要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,所以可以用于两个不同对象,但是包含的字母相同的比较。
3*0.1==0.3
返回值是什么
false,因为有些浮点数不能完全精确的表示出来。
a=a+b与a+=b有什么区别吗?
+=操作符会进行隐式自动类型转换,此处a+=b隐式的将加操作的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换。如:
byte a = 127;
byte b = 127;
b = a + b; // error : cannot convert from int to byte
b += a; // ok
(译者注:这个地方应该表述的有误,其实无论 a+b 的值为多少,编译器都会报错,因为 a+b 操作会将 a、b 提升为 int 类型,所以将 int 类型赋值给 byte 就会编译出错)
short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改?
有错误,short类型在进行运算时会自动提升为int类型,也就是说s1+1
的运算结果是int类型。
short s1= 1; s1 += 1; 该段代码是否有错,有的话怎么改?
+=操作符会自动对右边的表达式结果强转匹配左边的数据类型,所以没错。
& 和 &&的区别
首先记住&是位操作,而&&是逻辑运算符。另外需要记住逻辑运算符具有短路特性,而&不具备短路特性。
public class Test{
static String name;
public static void main(String[] args){
if(name!=null&userName.equals("")){
System.out.println("ok");
}else{
System.out.println("erro");
}
}
}
以上代码将会抛出空指针异常。
一个java文件内部可以有类?(非内部类)
只能有一个public公共类,但是可以有多个default修饰的类。
如何正确的退出多层嵌套循环?
使用标号和break;
通过在外层循环中添加标识符
内部类的作用
内部类可以有多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立.在单个外围类当中,可以让多个内部类以不同的方式实现同一接口,或者继承同一个类.创建内部类对象的时刻不依赖于外部类对象的创建。内部类并没有令人疑惑的”is-a”管系,它就像是一个独立的实体。
内部类提供了更好的封装,除了该外围类,其他类都不能访问。
final, finalize和finally的不同之处
final 是一个修饰符,可以修饰变量、方法和类。如果 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收之前调用的方法,给对象自己最后一个复活的机会,但是什么时候调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一起用于异常的处理。finally 块一定会被执行,无论在 try 块中是否有发生异常。
clone()是哪个类的方法?
java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。并且需要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其他本地语言实现的。
深拷贝和浅拷贝的区别是什么?
浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。
深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。
static都有哪些用法?
几乎所有的人都知道static关键字这两个基本的用法:静态变量和静态方法。也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享。
除了静态变量和静态方法之外,static也用于静态块,多用于初始化操作:
public calss PreCache{
static{
//执行相关操作
}
}
此外static也多用于修饰内部类,此时称之为静态内部类。
最后一种用法就是静态导包,即import static
.import static是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名。资源名,可以直接使用资源名,比如:
import static java.lang.Math.*;
public class Test{
public static void main(String[] args){
//System.out.println(Math.sin(20));
传统做法 System.out.println(sin(20));
}
0}
final有哪些用法
final也是很多面试喜欢问的地方,能回答下以下三点就不错了:
1.被final修饰的类不可以被继承
2.被final修饰的方法不可以被重写
3.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
4.被final修饰的方法,JVM会尝试将其内联,以提高运行效率
5.被final修饰的常量,在编译阶段会存入常量池中。
回答出编译器对final域要遵守的两个重排序规则更好:
1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
数据类型相关
java中int char,long各占多少字节?
类型 | 位数 | 字节数 |
---|---|---|
short | 2 | 16 |
int | 4 | 32 |
long | 8 | 64 |
float | 4 | 32 |
double | 8 | 64 |
char | 2 | 16 |
64位的JVM当中,int的长度是多少?
Java 中,int 类型变量的长度是一个固定值,与平台无关,都是 32 位。意思就是说,在 32 位 和 64 位 的Java 虚拟机中,int 类型的长度是相同的。
int和Integer的区别
Integer是int的包装类型,在拆箱和装箱中,二者自动转换。int是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象。
int 和Integer谁占用的内存更多?
Integer 对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
String, StringBuffer和StringBuilder区别
String是字符串常量,final修饰:StringBuffer字符串变量(线程安全);
StringBuilder 字符串变量(线程不安全)。
String和StringBuffer
String和StringBuffer主要区别是性能:String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。所以尽量不在对String进行大量的拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。
StringBuffer是对对象本身操作,而不是产生新的对象,因此在有大量拼接的情况下,我们建议使用StringBuffer。
但是需要注意现在JVM会对String拼接做一定的优化:
String s=“This is only ”+”simple”+”test”
会被虚拟机直接优化成String s=“This is only simple test”
,此时就不存在拼接过程。
StringBuffer和StringBuilder
StringBuffer是线程安全的可变字符串,其内部实现是可变数组。StringBuilder是jdk 1.5新增的,其功能和StringBuffer类似,但是非线程安全。因此,在没有多线程问题的前提下,使用StringBuilder会取得更好的性能。
什么是编译器常量?使用它有什么风险?
公共静态不可变(public static final )变量也就是我们所说的编译期常量,这里的 public 可选的。实际上这些变量在编译时会被替换掉,因为编译器知道这些变量的值,并且知道这些变量在运行时不能改变。这种方式存在的一个问题是你使用了一个内部的或第三方库中的公有编译时常量,但是这个值后面被其他人改变了,但是你的客户端仍然在使用老的值,甚至你已经部署了一个新的jar。为了避免这种情况,当你在更新依赖 JAR 文件时,确保重新编译你的程序。
java当中使用什么类型表示价格比较好?
如果不是特别关心内存和性能的话,使用BigDecimal,否则使用预定义精度的 double 类型。
如何将byte转为String
可以使用 String 接收 byte[] 参数的构造器来进行转换,需要注意的点是要使用的正确的编码,否则会使用平台默认编码,这个编码可能跟原来的编码相同,也可能不同。
可以将int强转为byte类型么?会产生什么问题?
我们可以做强制转换,但是Java中int是32位的而byte是8 位的,所以,如果强制转化int类型的高24位将会被丢弃,byte 类型的范围是从-128到128
关于垃圾回收
你知道哪些垃圾回收算法?
垃圾回收从理论上非常容易理解,具体的方法有以下几种:
1. 标记-清除
2. 标记-复制
3. 标记-整理
4. 分代回收
更详细的内容参见深入理解垃圾回收算法:
http://blog.csdn.net/dd864140130/article/details/50084471
如何判断一个对象是否应该被回收
这就是所谓的对象存活性判断,常用的方法有两种:1.引用计数法; 2.对象可达性分析。由于引用计数法存在互相引用导致无法进行GC的问题,所以目前JVM虚拟机多使用对象可达性分析算法。
简单的解释一下垃圾回收
Java 垃圾回收机制最基本的做法是分代回收。内存中的区域被划分成不同的世代,对象根据其存活的时间被保存在对应世代的区域中。一般的实现是划分成3个世代:年轻、年老和永久。内存的分配是发生在年轻世代中的。当一个对象存活时间足够长的时候,它就会被复制到年老世代中。对于不同的世代可以使用不同的垃圾回收算法。进行世代划分的出发点是对应用中对象存活时间进行研究之后得出的统计规律。一般来说,一个应用中的大部分对象的存活时间都很短。比如局部变量的存活时间就只在方法的执行过程中。基于这一点,对于年轻世代的垃圾回收算法就可以很有针对性。
调用System.gc()会发生什么?
通知GC开始工作,但是GC真正开始的时间不确定。
进程,线程相关
说说进程,线程,协程之间的区别
简而言之,进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程。进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一进程中的多个线程之间可以并发执行。
你了解守护线程吗?它和非守护线程有什么区别
程序运行完毕,jvm会等待非守护线程完成后关闭,但是jvm不会等待守护线程。守护线程最典型的例子就是GC线程。
什么是多线程上下文切换
多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。
创建两种线程的方式?他们有什么区别?
通过实现java.lang.Runnable或者通过扩展java.lang.Thread类。相比扩展Thread,实现Runnable接口可能更优.原因有二:
Java不支持多继承。因此扩展Thread类就代表这个子类不能扩展其他类。而实现Runnable接口的类还可能扩展另一个类。
类可能只要求可执行即可,因此继承整个Thread类的开销过大。
Thread类中的start()和run()方法有什么区别?
start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程。
怎么检测一个线程是否持有对象监视器
Thread类提供了一个holdsLock(Object obj)方法,当且仅当对象obj的监视器被某条线程持有的时候才会返回true,注意这是一个static方法,这意味着”某条线程”指的是当前线程。
Runnable和Callable的区别
Runnable接口中的run()方法的返回值是void,它做的事情只是纯粹地去执行run()方法中的代码而已;Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果。
这其实是很有用的一个特性,因为多线程相比单线程更难、更复杂的一个重要原因就是因为多线程充满着未知性,某条线程是否执行了?某条线程执行了多久?某条线程执行的时候我们期望的数据是否已经赋值完毕?无法得知,我们能做的只是等待这条多线程的任务执行完毕而已。而Callable+Future/FutureTask却可以方便获取多线程运行的结果,可以在等待时间太长没获取到需要的数据的情况下取消该线程的任务。
什么导致线程阻塞
阻塞指的是暂停一个线程的执行以等待某个条件发生(如某资源就绪),学过操作系统的同学对它一定已经很熟悉了。Java 提供了大量方法来支持阻塞,下面让我们逐一分析。
方法 | 说明 |
---|---|
sleep() | sleep() 允许 指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止 |
suspend() 和 resume() | 两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume() 被调用,才能使得线程重新进入可执行状态。典型地,suspend() 和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume() 使其恢复。 |
yield() | yield() 使当前线程放弃当前已经分得的CPU 时间,但不使当前线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程 |
wait() 和 notify() | 两个方法配套使用,wait() 使得线程进入阻塞状态,它有两种形式,一种允许 指定以毫秒为单位的一段时间作为参数,另一种没有参数,前者当对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用。 |
wait(),notify()和suspend(),resume()之间的区别
初看起来它们与 suspend() 和 resume() 方法对没有什么分别,但是事实上它们是截然不同的。区别的核心在于,前面叙述的所有方法,阻塞时都不会释放占用的锁(如果占用了的话),而这一对方法则相反。上述的核心区别导致了一系列的细节上的区别。
首先,前面叙述的所有方法都隶属于 Thread 类,但是这一对却直接隶属于 Object 类,也就是说,所有对象都拥有这一对方法。初看起来这十分不可思议,但是实际上却是很自然的,因为这一对方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的 wait() 方法导致线程阻塞,并且该对象上的锁被释放。而调用 任意对象的notify()方法则导致从调用该对象的 wait() 方法而阻塞的线程中随机选择的一个解除阻塞(但要等到获得锁后才真正可执行)。
其次,前面叙述的所有方法都可在任何位置调用,但是这一对方法却必须在 synchronized 方法或块中调用,理由也很简单,只有在synchronized 方法或块中当前线程才占有锁,才有锁可以释放。同样的道理,调用这一对方法的对象上的锁必须为当前线程所拥有,这样才有锁可以释放。因此,这一对方法调用必须放置在这样的 synchronized 方法或块中,该方法或块的上锁对象就是调用这一对方法的对象。若不满足这一条件,则程序虽然仍能编译,但在运行时会出现IllegalMonitorStateException 异常。
wait() 和 notify() 方法的上述特性决定了它们经常和synchronized关键字一起使用,将它们和操作系统进程间通信机制作一个比较就会发现它们的相似性:synchronized方法或块提供了类似于操作系统原语的功能,它们的执行不会受到多线程机制的干扰,而这一对方法则相当于 block 和wakeup 原语(这一对方法均声明为 synchronized)。它们的结合使得我们可以实现操作系统上一系列精妙的进程间通信的算法(如信号量算法),并用于解决各种复杂的线程间通信问题。
关于 wait() 和 notify() 方法最后再说明两点:
第一:调用 notify() 方法导致解除阻塞的线程是从因调用该对象的 wait() 方法而阻塞的线程中随机选取的,我们无法预料哪一个线程将会被选择,所以编程时要特别小心,避免因这种不确定性而产生问题。
第二:除了 notify(),还有一个方法 notifyAll() 也可起到类似作用,唯一的区别在于,调用 notifyAll() 方法将把因调用该对象的 wait() 方法而阻塞的所有线程一次性全部解除阻塞。当然,只有获得锁的那一个线程才能进入可执行状态。
谈到阻塞,就不能不谈一谈死锁,略一分析就能发现,suspend() 方法和不指定超时期限的 wait() 方法的调用都可能产生死锁。遗憾的是,Java 并不在语言级别上支持死锁的避免,我们在编程中必须小心地避免死锁。
以上我们对 Java 中实现线程阻塞的各种方法作了一番分析,我们重点分析了 wait() 和 notify() 方法,因为它们的功能最强大,使用也最灵活,但是这也导致了它们的效率较低,较容易出错。实际使用中我们应该灵活使用各种方法,以便更好地达到我们的目的。
产生死锁的条件
1.互斥条件:一个资源每次只能被一个进程使用。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
为什么wait()方法和notify()/notifyAll()方法要在同步块中被调用
这是JDK强制的,wait()方法和notify()/notifyAll()方法在调用前都必须先获得对象的锁
wait()方法和notify()/notifyAll()方法在放弃对象监视器时有什么区别
wait()方法和notify()/notifyAll()方法在放弃对象监视器的时候的区别在于:wait()方法立即释放对象监视器,notify()/notifyAll()方法则会等待线程剩余代码执行完毕才会放弃对象监视器。
wait()与sleep()的区别
关于这两者已经在上面进行详细的说明,这里就做个概括好了:
sleep()来自Thread类,和wait()来自Object类。调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁
sleep()睡眠后不出让系统资源,wait让其他线程可以占用CPU
sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒.而wait()需要配合notify()或者notifyAll()使用
为什么wait, nofity和nofityAll这些方法不放在Thread类当中
一个很明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAll都是锁级别的操作,所以把他们定义在Object类中因为锁属于对象。
怎么唤醒一个阻塞的线程
如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出InterruptedException来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,Java代码并没有办法直接接触到操作系统。
什么是多线程的上下文切换
多线程的上下文切换是指CPU控制权由一个已经正在运行的线程切换到另外一个就绪并等待获取CPU执行权的线程的过程。
synchronized和ReentrantLock的区别
synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:
(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
(2)ReentrantLock可以获取各种锁的信息
(3)ReentrantLock可以灵活地实现多路通知
另外,二者的锁机制其实也是不一样的:ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word。
FutureTask是什么
这个其实前面有提到过,FutureTask表示一个异步运算的任务。FutureTask里面可以传入一个Callable的具体实现类,可以对这个异步运算的任务的结果进行等待获取、判断是否已经完成、取消任务等操作。当然,由于FutureTask也是Runnable接口的实现类,所以FutureTask也可以放入线程池中。
一个线程如果出现了运行时异常怎么办?
如果这个异常没有被捕获的话,这个线程就停止执行了。另外重要的一点是:如果这个线程持有某个某个对象的监视器,那么这个对象监视器会被立即释放。
Java当中有哪几种锁
自旋锁: 自旋锁在JDK1.6之后就默认开启了。基于之前的观察,共享数据的锁定状态只会持续很短的时间,为了这一小段时间而去挂起和恢复线程有点浪费,所以这里就做了一个处理,让后面请求锁的那个线程在稍等一会,但是不放弃处理器的执行时间,看看持有锁的线程能否快速释放。为了让线程等待,所以需要让线程执行一个忙循环也就是自旋操作。在jdk6之后,引入了自适应的自旋锁,也就是等待的时间不再固定了,而是由上一次在同一个锁上的自旋时间及锁的拥有者状态来决定。
偏向锁: 在JDK1.之后引入的一项锁优化,目的是消除数据在无竞争情况下的同步原语。进一步提升程序的运行性能。偏向锁就是偏心的偏,意思是这个锁会偏向第一个获得他的线程,如果接下来的执行过程中,改锁没有被其他线程获取,则持有偏向锁的线程将永远不需要再进行同步。偏向锁可以提高带有同步但无竞争的程序性能,也就是说他并不一定总是对程序运行有利,如果程序中大多数的锁都是被多个不同的线程访问,那偏向模式就是多余的,在具体问题具体分析的前提下,可以考虑是否使用偏向锁。
轻量级锁: 为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。
如何在两个线程间共享数据
通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列BlockingQueue就是为线程之间共享数据而设计的。
如何正确的使用wait()?使用if还是while?
wait() 方法应该在循环调用,因为当线程获取到 CPU 开始执行的时候,其他条件可能还没有满足,所以在处理前,循环检测条件是否满足会更好。下面是一段标准的使用 wait 和 notify 方法的代码:
synchronized (obj) {
while (condition does not hold)
obj.wait(); // (
Releases lock, and reacquires on wakeup) ...
// Perform action appropriate to condition
}
什么是线程局部变量ThreadLocal
线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。
ThreadLoal的作用是什么?
简单说ThreadLocal就是一种以空间换时间的做法在每个Thread里面维护了一个ThreadLocal.ThreadLocalMap把数据进行隔离,数据不共享,自然就没有线程安全方面的问题了。
生产者消费者模型的作用是什么?
(1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用。
(2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约。
写一个生产者-消费者队列
可以通过阻塞队列实现,也可以通过wait-notify来实现。
使用阻塞队列来实现
//消费者
public class Producer implements Runnable{
private final BlockingQueue<Integer> queue;
public Producer(BlockingQueue q){
this.queue=q;
}
@Override public void run() {
try { while (true){
Thread.sleep(1000);
//模拟耗时
queue.put(produce());
}
}catch (InterruptedException e){
}
}
private int produce() {
int n=new Random().nextInt(10000);
System.out.println("Thread:" + Thread.currentThread().getId() + " produce:" + n);
return n;
}
}
//消费者
public class Consumer implements Runnable {
private final BlockingQueue<Integer> queue;
public Consumer(BlockingQueue q){ this.queue=q; }
@Override
public void run() {
while (true){
try {
Thread.sleep(2000)
//模拟耗时
consume(
queue.take());
}catch (InterruptedException e)
{
}
}
}
private void consume(Integer n) {
System.out.println("Thread:" + Thread.currentThread().getId() + " consume:" + n);
}
}
//测试
public class Main {
public static void main(String[] args) {
BlockingQueue<Integer> queue=new ArrayBlockingQueue<Integer>(100);
Producer p=new Producer(queue);
Consumer c1=new Consumer(queue);
Consumer c2=new Consumer(queue);
new Thread(p).start();
new Thread(c1).start();
new Thread(c2).start();
}
}
使用wait-notify来实现
该种方式应该最经典,这里就不做说明了。
如果你提交任务时,线程池队列已满,这时会发生什么
如果你使用的LinkedBlockingQueue,也就是*队列的话,没关系,继续添加任务到阻塞队列中等待执行,因为LinkedBlockingQueue可以近乎认为是一个无穷大的队列,可以无限存放任务;如果你使用的是有界队列比方说ArrayBlockingQueue的话,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy。
为什么要使用线程池
避免频繁地创建和销毁线程,达到线程对象的重用。另外,使用线程池还可以根据项目灵活地控制并发的数目。
java中用到的线程调度算法是什么
抢占式。一个线程用完CPU之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。
Thread.sleep(0)的作用是什么
由于Java采用抢占式的线程调度算法,因此可能会出现某条线程常常获取到CPU控制权的情况,为了让某些优先级比较低的线程也能获取到CPU控制权,可以使用Thread.sleep(0)手动触发一次操作系统分配时间片的操作,这也是平衡CPU控制权的一种操作。
什么是CAS
CAS,全称为Compare and Swap,即比较-替换。假设有三个操作数:内存值V、旧的预期值A、要修改的值B,当且仅当预期值A和内存值V相同时,才会将内存值修改为B并返回true,否则什么都不做并返回false。当然CAS一定要volatile变量配合,这样才能保证每次拿到的变量是主内存中最新的那个值,否则旧的预期值A对某条线程来说,永远是一个不会变的值A,只要某次CAS操作失败,永远都不可能成功。
什么是乐观锁和悲观锁
乐观锁:乐观锁认为竞争不总是会发生,因此它不需要持有锁,将比较-替换这两个动作作为一个原子操作尝试去修改内存中的变量,如果失败则表示发生冲突,那么就应该有相应的重试逻辑。
悲观锁:悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了。
ConcurrentHashMap的并发度是什么?
ConcurrentHashMap的并发度就是segment的大小,默认为16,这意味着最多同时可以有16条线程操作ConcurrentHashMap,这也是ConcurrentHashMap对Hashtable的最大优势,任何情况下,Hashtable能同时有两条线程获取Hashtable中的数据吗?
ConcurrentHashMap的工作原理
ConcurrentHashMap在jdk 1.6和jdk 1.8实现原理是不同的。
jdk 1.6:
ConcurrentHashMap是线程安全的,但是与Hashtablea相比,实现线程安全的方式不同。Hashtable是通过对hash表结构进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁。ConcurrentHashMap是采用分离锁的方式,它并没有对整个hash表进行锁定,而是局部锁定,也就是说当一个线程占有这个局部锁时,不影响其他线程对hash表其他地方的访问。
具体实现:ConcurrentHashMap内部有一个Segment.
jdk 1.8
在jdk 8中,ConcurrentHashMap不再使用Segment分离锁,而是采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现。
CyclicBarrier和CountDownLatch区别
这两个类非常类似,都在java.util.concurrent下,都可以用来表示代码运行到某个点上,二者的区别在于:
CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行。
CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务
CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了。
java中的++操作符线程安全么?
不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
你有哪些多线程开发良好的实践?
给线程命名
最小化同步范围
优先使用volatile
尽可能使用更高层次的并发工具而非wait和notify()来实现线程通信,如BlockingQueue,Semeaphore
优先使用并发容器而非同步容器.
考虑使用线程池
关于volatile关键字
可以创建Volatile数组吗?
Java 中可以创建 volatile类型数组,不过只是一个指向数组的引用,而不是整个数组。如果改变引用指向的数组,将会受到volatile 的保护,但是如果多个线程同时改变数组的元素,volatile标示符就不能起到之前的保护作用了。
volatile能使得一个非原子操作变成原子操作吗?
一个典型的例子是在类中有一个 long 类型的成员变量。如果你知道该成员变量会被多个线程访问,如计数器、价格等,你最好是将其设置为 volatile。为什么?因为 Java 中读取 long 类型变量不是原子的,需要分成两步,如果一个线程正在修改该 long 变量的值,另一个线程可能只能看到该值的一半(前 32 位)。但是对一个 volatile 型的 long 或 double 变量的读写是原子。
一种实践是用 volatile 修饰 long 和 double 变量,使其能按原子类型来读写。double 和 long 都是64位宽,因此对这两种类型的读是分为两部分的,第一次读取第一个 32 位,然后再读剩下的 32 位,这个过程不是原子的,但 Java 中 volatile 型的 long 或 double 变量的读写是原子的。volatile 修复符的另一个作用是提供内存屏障(memory barrier),例如在分布式框架中的应用。简单的说,就是当你写一个 volatile 变量之前,Java 内存模型会插入一个写屏障(write barrier),读一个 volatile 变量之前,会插入一个读屏障(read barrier)。意思就是说,在你写一个 volatile 域时,能保证任何线程都能看到你写的值,同时,在写之前,也能保证任何数值的更新对所有线程是可见的,因为内存屏障会将其他所有写的值更新到缓存。
volatile类型变量提供什么保证?
volatile 主要有两方面的作用:1.避免指令重排2.可见性保证.例如,JVM 或者 JIT为了获得更好的性能会对语句重排序,但是 volatile 类型变量即使在没有同步块的情况下赋值也不会与其他语句重排序。volatile 提供 happens-before 的保证,确保一个线程的修改能对其他线程是可见的。某些情况下,volatile 还能提供原子性,如读 64 位数据类型,像 long 和 double 都不是原子的(低32位和高32位),但 volatile 类型的 double 和 long 就是原子的。
关于集合
Java中的集合及其继承关系
关于集合的体系是每个人都应该烂熟于心的,尤其是对我们经常使用的List,Map的原理更该如此.这里我们看这张图即可:
更多内容可见集合类总结:
http://write.blog.csdn.net/postedit/40826423
poll()方法和remove()方法区别?
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
LinkedHashMap和PriorityQueue的区别
PriorityQueue 是一个优先级队列,保证最高或者最低优先级的的元素总是在队列头部,但是 LinkedHashMap 维持的顺序是元素插入的顺序。当遍历一个 PriorityQueue 时,没有任何顺序保证,但是 LinkedHashMap 课保证遍历顺序是元素插入的顺序。
WeakHashMap与HashMap的区别是什么?
WeakHashMap 的工作与正常的 HashMap 类似,但是使用弱引用作为 key,意思就是当 key 对象没有任何引用时,key/value 将会被回收。
ArrayList和LinkedList的区别?
最明显的区别是 ArrrayList底层的数据结构是数组,支持随机访问,而 LinkedList 的底层数据结构是双向循环链表,不支持随机访问。使用下标访问一个元素,ArrayList 的时间复杂度是 O(1),而 LinkedList 是 O(n)。
ArrayList和Array有什么区别?
Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的
ArrayList和HashMap默认大小?
在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段。
private static final int DEFAULT_CAPACITY = 10; //from HashMap.java
JDK 7 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// aka 16
Comparator和Comparable的区别?
Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。
如何实现集合排序?
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。
如何打印数组内容
你可以使用 Arrays.toString() 和 Arrays.deepToString() 方法来打印数组。由于数组没有实现 toString() 方法,所以如果将数组传递给 System.out.println() 方法,将无法打印出数组的内容,但是 Arrays.toString() 可以打印每个元素。
LinkedList的是单向链表还是双向?
双向循环列表,具体实现自行查阅源码。
TreeMap是实现原理
采用红黑树实现,具体实现自行查阅源码。
遍历ArrayList时如何正确移除一个元素
该问题的关键在于面试者使用的是 ArrayList 的 remove() 还是 Iterator 的 remove()方法。这有一段示例代码,是使用正确的方式来实现在遍历的过程中移除元素,而不会出现 ConcurrentModificationException 异常的示例代码。
什么是ArrayMap?它和HashMap有什么区别?
ArrayMap是Android SDK中提供的,非Android开发者可以略过。
ArrayMap是用两个数组来模拟map,更少的内存占用空间,更高的效率。
具体参考这篇文章:ArrayMap VS HashMap:http://lvable.com/?p=217%5D
HashMap的实现原理
1. HashMap概述:HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
2. HashMap的数据结构:在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。
当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上.
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
你了解Fail-Fast机制吗?
Fail-Fast即我们常说的快速失败,
更多内容参看fail-fast机制:
http://blog.csdn.net/chenssy/article/details/38151189
Fail-fast和Fail-safe有什么区别
Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包中的所有集合类都被设计为fail->fast的,而java.util.concurrent中的集合类都为fail-safe的。当检测到正在遍历的集合的结构被改变时,Fail-fast迭代器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出ConcurrentModificationException。
关于日期
SimpleDateFormat是线程安全的吗?
非常不幸,DateFormat 的所有实现,包括 SimpleDateFormat 都不是线程安全的,因此你不应该在多线程序中使用,除非是在对外线程安全的环境中使用,如 将 SimpleDateFormat 限制在 ThreadLocal 中。如果你不这么做,在解析或者格式化日期的时候,可能会获取到一个不正确的结果。因此,从日期、时间处理的所有实践来说,我强力推荐 joda-time 库。
如何格式化日期?
Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期。DateFormat 类允许你使用多种流行的格式来格式化日期。参见答案中的示例代码,代码中演示了将日期格式化成不同的格式,如 dd-MM-yyyy 或 ddMMyyyy。
关于异常
简单描述java异常体系
相比没有人不了解异常体系,关于异常体系的更多信息可以见
白话异常机制:http://blog.csdn.net/dd864140130/article/details/42504189
什么是异常链
详情直接参见上面的白话异常机制,不做解释了。
throw和throws的区别
throw用于主动抛出java.lang.Throwable 类的一个实例化对象,意思是说你可以通过关键字 throw 抛出一个 Error 或者 一个Exception,如:throw new IllegalArgumentException(“size must be multiple of 2″)
,
而throws 的作用是作为方法声明和签名的一部分,方法被抛出相应的异常以便调用者能处理。Java 中,任何未处理的受检查异常强制在 throws 子句中声明。
关于序列化
Java 中,Serializable 与 Externalizable 的区别
Serializable 接口是一个序列化 Java 类的接口,以便于它们可以在网络上传输或者可以将它们的状态保存在磁盘上,是 JVM 内嵌的默认序列化方式,成本高、脆弱而且不安全。Externalizable 允许你控制整个序列化过程,指定特定的二进制格式,增加安全机制。
关于JVM
JVM特性
平台无关性.
Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用模式Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
简单解释一下类加载器
有关类加载器一般会问你四种类加载器的应用场景以及双亲委派模型,
更多的内容参看深入理解JVM加载器:
http://blog.csdn.net/dd864140130/article/details/49817357
简述堆和栈的区别
VM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。
简述JVM内存分配
基本数据类型比变量和对象的引用都是在栈分配的。
堆内存用来存放由new创建的对象和数组。
类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中。
实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存。
局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放。
其他
java当中采用的是大端还是小端?
XML解析的几种方式和特点
DOM, SAX, PULL三种解析方式:
DOM:消耗内存:先把xml文档都读到内存中,然后再用DOM API来访问树形结构,并获取数据。这个写起来很简单,但是很消耗内存。要是数据过大,手机不够牛逼,可能手机直接死机
SAX:解析效率高,占用内存少,基于事件驱动的:更加简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element)开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同样的扫描,直至文档结束。
PULL:与 SAX 类似,也是基于事件驱动,我们可以调用它的next()方法,来获取下一个解析事件(就是开始文档,结束文档,开始标签,结束标签),当处于某个元素时可以调用XmlPullParser的getAttributte()方法来获取属性的值,也可调用它的nextText()获取本节点的值。
JDK 1.7特性
然 JDK 1.7 不像 JDK 5 和 8 一样的大版本,但是,还是有很多新的特性,如 try-with-resource 语句,这样你在使用流或者资源的时候,就不需要手动关闭,Java 会自动关闭。Fork-Join 池某种程度上实现 Java 版的 Map-reduce。允许 Switch 中有 String 变量和文本。菱形操作符(<>)用于类型推断,不再需要在变量声明的右边申明泛型,因此可以写出可读写更强、更简洁的代码。
JDK 1.8特性
java 8 在 Java 历史上是一个开创新的版本,下面 JDK 8 中 5 个主要的特性:
Lambda 表达式,允许像对象一样传递匿名函数
Stream API,充分利用现代多核 CPU,可以写出很简洁的代码
Date 与 Time API,最终,有一个稳定、简单的日期和时间库可供你使用
扩展方法,现在,接口中可以有静态、默认方法。
重复注解,现在你可以将相同的注解在同一类型上使用多次。
Maven和ANT有什么区别?
虽然两者都是构建工具,都用于创建 Java 应用,但是 Maven 做的事情更多,在基于“约定优于配置”的概念下,提供标准的Java 项目结构,同时能为应用自动管理依赖(应用中所依赖的 JAR 文件。
JDBC最佳实践
优先使用批量操作来插入和更新数据
使用PreparedStatement来避免SQL漏洞
使用数据连接池
通过列名来获取结果集
IO操作最佳实践
使用有缓冲的IO类,不要单独读取字节或字符
使用NIO和NIO 2或者AIO,而非BIO
在finally中关闭流
使用内存映射文件获取更快的IO
来源于:https://blog.csdn.net/dd864140130/article/details/55833087
这么全面的面试题,赶快将本文分享给你身边正在准备Java面试的朋友吧!
茉莉花,别名:茉莉,拉丁文名:Jasminum sambac (L.) Ait,木犀科、素馨属直立或攀援灌木,高达3米。小枝圆柱形或稍压扁状,有时中空,疏被柔毛。叶对生,单叶,叶片纸质,圆形、椭圆形、卵状椭圆形或倒卵形,两端圆或钝,基部有时微心形,在上面稍凹入或凹起,下面凸起,细脉在两面常明显,微凸起,除下面脉腋间常具簇毛外,其余无毛;裂片长圆形至近圆形,先端圆或钝。果球形,呈紫黑色。花期5-8月,果期7-9月。茉莉的花极香,为著名的花茶原料及重要的香精原料;花、叶药用治目赤肿痛,并有止咳化痰之效。吴王子子驹亡走闽越,怨东瓯杀其父,常劝闽越击东瓯。至建元三年,闽越发兵围东瓯。东瓯食尽,困,太史公曰:余每读虞书,至於君臣相敕,维是几安,而股肱不良,万事堕坏,未尝不流涕也。成王作颂,推己惩艾,悲彼家难,可不谓战战恐惧,善守善终哉?君子不为约则修德,满则弃礼,佚能思初,安能惟始,沐浴膏泽而歌咏勤苦,非大德谁能如斯!传曰“治定功成,礼乐乃兴”。海内人道益深,其德益至,所乐者益异。满而不损则溢,盈而不持则倾。凡作乐者,所以节乐。君子以谦退为礼,以损减为乐,乐其如此也。以为州异国殊,情习不同,故博采风俗,协比声律,以补短移化,助流政教。天子躬於明堂临观,而万民咸荡涤邪秽,斟酌饱满,以饰厥性。故云雅颂之音理而民正,嘄噭之声兴而士奋,郑卫之曲动而心淫。及其调和谐合,鸟兽尽感,而况怀五常,含好恶,自然之势也? 治道亏缺而郑音兴起,封君世辟,名显邻州,争以相高。自仲尼不能与齐优遂容於鲁,虽退正乐以诱世,作五章以剌时,犹莫之化。陵迟以至六国,流沔沈佚,遂往不返,卒於丧身灭宗,并国於秦。 秦二世尤以为娱。丞相李斯进谏曰:“放弃诗书,极意声色,祖伊所以惧也;轻积细过,恣心长夜,纣所以亡也。”赵高曰:“五帝、三王乐各殊名,示不相袭。上自朝廷,下至人民,得以接欢喜,合殷勤,非此和说不通,解泽不流,亦各一世之化,度时之乐,何必华山之騄耳而后行远乎?”二世然之。 高祖过沛诗三侯之章,令小兒歌之。高祖崩,令沛得以四时歌鳷宗庙。孝惠、孝文、孝景无所增更,於乐府习常肄旧而已。 至今上即位,作十九章,令侍中李延年次序其声,拜为协律都尉。通一经之士不能独知其辞,皆集会五经家,相与共讲习读之,乃能通知其意,多尔雅之文。 汉家常以正月上辛祠太一甘泉,以昏时夜祠,到明而终。常有流星经於祠坛上。使僮男僮女七十人俱歌。春歌青阳,夏歌硃明,秋歌西昚,冬歌玄冥。世多有,故不论。 又尝得神马渥洼水中,复次以为太一之歌。曲曰:“太一贡兮天马下,霑赤汗兮沫流赭。骋容与兮跇万里,今安匹兮龙为友。”後伐大宛得千里马,马名蒲梢,次作以为歌。歌诗曰:“天马来兮从西极,经万里兮归有德。承灵威兮降外国,涉流沙兮四夷服。”中尉汲黯进曰:“凡王者作乐,上以承祖宗,下以化兆民。今陛下得马,诗以为歌,协於宗庙,先帝百姓岂能知其音邪?”上默然不说。丞相公孙弘曰:“黯诽谤圣制,当族。” 凡音之起,由人心生也。人心之动,物使之然也。感於物而动,故形於声;声相应,故生变;变成方,谓之音;比音而乐之,及干戚羽旄,谓之乐也。乐者,音之所由生也,其本在人心感於物也。是故其哀心感者,其声噍以杀;其乐心感者,其声啴以缓;其喜心感者,其声发以散;其怒心感者,其声粗以厉;其敬心感者,其声直以廉;其爱心感者,其声和以柔。六者非性也,感於物而后动,是故先王慎所以感之。故礼以导其志,乐以和其声,政以壹其行,刑以防其奸。礼乐刑政,其极一也,所以同民心而出治道也。 凡音者,生人心者也。情动於中,故形於声,声成文谓之音。是故治世之音安以乐,其正和;乱世之音怨以怒,其正乖;亡国之音哀以思,其民困。声音之道,与正通矣。宫为君,商为臣,角为民,徵为事,羽为物。五者不乱,则无怗懘之音矣。宫乱则荒,其君骄;商乱则搥,其臣坏;角乱则忧,其民怨;徵乱则哀,其事勤;羽乱则危,其财匮。五者皆乱,迭相陵,谓之慢。如此则国之灭亡无日矣。郑卫之音,乱世之音也,比於慢矣。桑间濮上之音,亡国之音也,其政散,其民流,诬上行私而不可止。 凡音者,生於人心者也;乐者,通於伦理者也。是故知声而不知音者,禽兽是也;知音而不知乐者,众庶是也。唯君子为能知乐。是故审声以知音,审音以知乐,审乐以知政,而治道备矣。是故不知声者不可与言音,不知音者不可与言乐知乐则几於礼矣。礼乐皆得,谓之有德。德者得也。是故乐之隆,非极音也;食飨之礼,非极味也。清庙之瑟,硃弦而疏越,一倡而三叹,有遗音者矣。大飨之礼,尚玄酒而俎腥鱼,大羹不和,有遗味者矣。是故先王之制礼乐也,非以极口腹耳目之欲也,将以教民平好恶而反人道之正也。 人生而静,天之性也;感於物而动,性之颂也。物至知知,然后好恶形焉。好恶无节於内,知诱於外,不能反己,天理灭矣。夫物之感人无穷,而人之好恶无节,则是物至而人化物也。人化物也者,灭天理而穷人欲者也。於是有悖逆诈伪之心,有淫佚作乱之事。是故彊者胁弱,众者暴寡,知者诈愚,勇者苦怯,疾病不养,老幼孤寡不得其所,此大乱之道也。是故先王制礼乐,人为之节:衰麻哭泣,所以节丧纪也;钟鼓干戚,所以和安乐也;婚姻冠笄,所以别男女也;射乡食飨,所以正交接也。礼节民心,乐和民声,政以行之,刑以防之。礼乐刑政四达而不悖,则王道备矣。 乐者为同,礼者为异。同则相亲,异则相敬。乐胜则流,礼胜则离。合情饰貌者,礼乐之事也。礼义立,则贵贱等矣;乐文同,则上下和矣;好恶著,则贤不肖别矣;刑禁暴,爵举贤,则政均矣。仁以爱之,义以正之,如此*治行矣。 乐由中出,礼自外作。乐由中出,故静;礼自外作,故文。大乐必易,大礼必简。乐至则无怨,礼至则不争。揖让而治天下者,礼乐之谓也。暴民不作,诸侯宾服,兵革不试,五刑不用,百姓无患,天子不怒,如此则乐达矣。合父子之亲,明长幼之序,以敬四海之内。天子如此,则礼行矣。 大乐与天地同和,大礼与天地同节。和,故百物不失;节,故祀天祭地。明则有礼乐,幽则有鬼神,如此则四海之内合敬同爱矣。礼者,殊事合敬者也;乐者,异文合爱者也。礼乐之情同,故明王以相沿万石君名奋,其父赵人也,姓石氏。赵亡,徙居温。高祖东击项籍,过河内,时奋年十五,为小吏,侍高祖。高祖与语,爱其恭敬,问曰:“若何有?”对曰:“奋独有母,不幸失明。家贫。有姊,能鼓琴。”高祖曰:“若能从我乎?”曰:“原尽力。”於是高祖召其姊为美人,以奋为中涓,受书谒,徙其家长安中戚里,以姊为美人故也。其官至孝文时,积功劳至大中大夫。无文学,恭谨无与比。 文帝时,东阳侯张相如为太子太傅,免。选可为傅者,皆推奋,奋为太子太傅。及孝景即位,以为九卿;迫近,惮之,徙奋为诸侯相。奋长子建,次子甲,次子乙,次子庆,皆以驯行孝谨,官皆至二千石。於是景帝曰:“石君及四子皆二千石,人臣尊宠乃集其门。”号奋为万石君。 孝景帝季年,万石君以上大夫禄归老于家,以岁时为朝臣。过宫门阙,万石君必下车趋,见路马必式焉。子孙为小吏,来归谒,万石君必朝服见之,不名。子孙有过失,不谯让,为便坐,对案不食。然后诸子相责,因长老肉袒固谢罪,改之,乃许。子孙胜冠者在侧,虽燕居必冠,申申如也。僮仆如也,唯谨。上时赐食於家,必稽首俯伏而食之,如在上前。其执丧,哀戚甚悼。子孙遵教,亦如之。万石君家以孝谨闻乎郡国,虽齐鲁诸儒质行,皆自以为不及也。 建元二年,郎中令王臧以文学获罪。皇太后以为儒者文多质少,今万石君家不言而躬行,乃以长子建为郎中令,少子庆为内史。 建老白首,万石君尚无恙。建为郎中令,每五日洗沐归谒亲,入子舍,窃问侍者,取亲中稖厕窬,身自浣涤,复与侍者,不敢令万石君知,以为常。建为郎中令,事有可言,屏人恣言,极切;至廷见,如不能言者。是以上乃亲尊礼之。 万石君徙居陵里。内史庆醉归,入外门不下车。万石君闻之,不食。庆恐,肉袒请罪,不许。举宗及兄建肉袒,万石君让曰:“内史贵人,入闾里,里中长老皆走匿,而内史坐车中自如,固当!”乃谢罢庆。庆及诸子弟入里门,趋至家。 万石君以元朔五年中卒。长子郎中令建哭泣哀思,扶杖乃能行。岁馀,建亦死。诸子孙咸孝,然建最甚,甚於万石君。 建为郎中令,书奏事,事下,建读之,曰:“误书!‘马’者与尾当五,今乃四,不足一。上谴死矣!”甚惶恐。其为谨慎,虽他皆如是。 万石君少子庆为太仆,御出,上问车中几马,庆以策数马毕,举手曰:“六马。”庆於诸子中最为简易矣,然犹如此。为齐相,举齐国皆慕其家行,不言而齐国大治,为立石相祠。 元狩元年,上立太子,选群臣可为傅者,庆自沛守为太子太傅,七岁迁为御史大夫。 元鼎五年秋,丞相有罪,罢。制诏御史:“万石君先帝尊之,子孙孝,其以御史大夫庆为丞相,封为牧丘侯。”是时汉方南诛两越,东击朝鲜,北逐匈奴,西伐大宛,中国多事。天子巡狩海内,修上古神祠,封禅,兴礼乐。公家用少,桑弘羊等致利,王温舒之属峻法,兒宽等推文学至九卿,更进用事,事不关决於丞相,丞相醇谨而已。在位九岁,无能有所匡言。尝欲请治上近臣所忠、九卿咸宣罪,不能服,反受其过,赎罪。 元封四年中,关东流民二百万口,无名数者四十万,公卿议欲请徙流民於边以適之。上以为丞相老谨,不能与其议,乃赐丞相告归,而案御史大夫以下议为请者。丞相惭不任职,乃上书曰:“庆幸得待罪丞相,罢驽无以辅治,城郭仓库空虚,民多流亡,罪当伏斧质,上不忍致法。原归丞相侯印,乞骸骨归,避贤者路。”天子曰:“仓廪既空,民贫流亡,而君欲请徙之,摇荡不安,动危之,而辞位,君欲安归难乎?”以书让庆,庆甚惭,遂复视事。 庆文深审谨,然无他大略,为百姓言。後三岁馀,太初二年中,丞相庆卒,谥为恬侯。庆中子德,庆爱用之,上以德为嗣,代侯。後为太常,坐法当死,赎免为庶人。庆方为丞相,诸子孙为吏更至二千石者十三人。及庆死後,稍以罪去,孝谨益衰矣。 建陵侯卫绾者,代大陵人也。绾以戏车为郎,事文帝,功次迁为中郎将,醇谨无他。孝景为太子时,召上左右饮,而绾称病不行。文帝且崩时,属孝景曰:“绾长者,善遇之。”及文帝崩,景帝立,岁馀不噍呵绾,绾日以谨力。 景帝幸上林,诏中郎将参乘,还而问曰:“君知所以得参乘乎?”绾曰:“臣从车士幸得以功次迁为中郎将,不自知也。”上问曰:“吾为太子时召君,君不肯来,何也?”对曰:“死罪,实病!”上赐之剑。绾曰:“先帝赐臣剑凡六,剑不敢奉诏。”上曰:“剑,人之所施易,独至今乎?”绾曰:“具在。”上使取六剑,剑尚盛,未尝服也。郎官有谴,常蒙其罪,不与他将争;有功,常让他将。上以为廉,忠实无他肠,乃拜绾为河间王太傅。吴楚反,诏绾为将,将河间兵击吴楚有功,拜为中尉。三岁,以军功,孝景前六年中封绾为建陵侯。 其明年,上废太子,诛栗卿之属。上以为绾长者,不忍,乃赐绾告归,而使郅都治捕栗氏。既已,上立胶东王为太子,召绾,拜为太子太傅。久之,迁为御史大夫。五岁,代桃侯舍为丞相,朝奏事如职所奏。然自初官以至丞相,终无可言。天子以为敦厚,可相少主,尊宠之,赏赐甚多。 为丞相三岁,景帝崩,武帝立。建元年中,丞相以景帝疾时诸官囚多坐不辜者,而君不任职,免之。其後绾卒,子信代。坐酎金失侯。 塞侯直不疑者,南阳人也。为郎,事文帝。其同舍有告归,误持同舍郎金去,已而金主觉,妄意不疑,不疑谢有之,买金偿。而告归者来而归金,而前郎亡金者大惭,以此称为长者。文帝称举,稍迁至太中大夫。朝廷见,人或毁曰:“不疑状貌甚美,然独无柰其善盗嫂何也!”不疑闻,曰:“我乃无兄。”然终不自明也。 吴楚反时,不疑以二千石将兵击之。景帝後元年,拜为御史大夫。天子修吴楚时功,乃封不疑为塞侯。武帝建元年中,谚曰“力田不如逢年,善仕不如遇合”,固无虚言。非独女以色媚,而士宦亦有之。 昔以色幸者多矣。至汉兴,高祖至暴抗也,然籍孺以佞幸;孝惠时有闳孺。此两人非有材能,徒以婉佞贵幸,与上卧起,公卿皆因关说。故孝惠时郎侍中皆冠鵕璘,贝带,傅脂粉,化闳、籍之属也。两人徙家安陵。 孝文时中宠臣,士人则邓通,宦者则赵同、北宫伯子。北宫伯子以爱人长者;而赵同以星气幸,常为文帝参乘;邓通无伎能。邓通,蜀郡南安人也,以濯船为黄头郎。孝文帝梦欲上天,不能,有一黄头郎从後推之上天,顾见其衣裻带後穿。觉而之渐台,以梦中阴目求推者郎,即见邓通,其衣後穿,梦中所见也。召问其名姓,姓邓氏,名通,文帝说焉,尊幸之日异。通亦愿谨,不好外交,虽赐洗沐,不欲出。於是文帝赏赐通巨万以十数,官至上大夫。文帝时时如邓通家游戏。然邓通无他能,不能有所荐士,独自谨其身以媚上而已。上使善相者相通,曰“当贫饿死”。文帝曰:“能富通者在我也。何谓贫乎?”於是赐邓通蜀严道铜山,得自铸钱,“邓氏钱”布天下。其富如此。 文帝尝病痈,邓通常为帝唶吮之。文帝不乐,从容问通曰:“天下谁最爱我者乎?”通曰:“宜莫如太子。”太子入问病,文帝使唶痈,唶痈而色难之。已而闻邓通常为帝唶吮之,心惭,由此怨通矣。及文帝崩,景帝立,邓通免,家居。居无何,人有告邓通盗出徼外铸钱。下吏验问,颇有之,遂竟案,尽没入邓通家,尚负责数巨万。长公主赐邓通,吏辄随没入之,一簪不得著身。於是长公主乃令假衣食。竟不得名一钱,寄死人家。 孝景帝时,中无宠臣,然独郎中令周文仁,仁宠最过庸,乃不甚笃。 今天子中宠臣,士人则韩王孙嫣,宦者则李延年。嫣者,弓高侯孽孙也。今上为胶东王时,嫣与上学书相爱。及上为太子,愈益亲嫣。嫣善骑射,善佞。上即位,欲事伐匈奴,而嫣先习胡兵,以故益尊贵,官至上大夫,赏赐拟於邓通。时嫣常与上卧起。江都王入朝,有诏得从入猎上林中。天子车驾跸道未行,而先使嫣乘副车,从数十百骑,骛驰视兽。江都王望见,以为天子,辟从者,伏谒道傍。嫣驱不见。既过,江都王怒,为皇太后泣曰:“请得归国入宿卫,比韩嫣。”太后由此嗛嫣。嫣侍上,出入永巷不禁,以奸闻皇太后。皇太后怒,使使赐嫣死。上为谢,终不能得,嫣遂死。而案道侯韩说,其弟也,亦佞幸。 李延年,中山人也。父母及身兄弟及女,皆故倡也。延年坐法腐,给事狗中。而平阳公主言延年女弟善舞,上见,心说之,及入永巷,而召贵延年。延年善歌,为变新声,而上方兴天地祠,欲造乐诗歌弦之。延年善承意,弦次初诗。其女弟亦幸,有子男。延年佩二千石印,号协声律。与上卧起,甚贵幸,埒如韩嫣也。久之,浸与中人乱,出入骄恣。及其女弟李夫人卒後,爱弛,则禽诛延年昆弟也。 自是之後,内宠嬖臣大底外戚之家,然不足数也。卫青、霍去病亦以外戚贵幸,然颇用材能自进。 太史公曰:甚哉爱憎之时!弥子瑕之行,足以观後人佞幸矣。虽百世可知也。 传称令色,诗刺巧言。冠璘入侍,傅粉承恩。黄头赐蜀,宦者同轩。新声都尉,挟弹王孙。泣鱼窃驾,著自前论。与丞相绾俱以过免。 不疑学老子言。其所临,为官如故,唯恐人知其为吏迹也。不好立名称,称为长者。不疑卒,子相如代。孙望,坐酎金失侯。 郎中令周文者,名仁,其先故任城人也。以医见。景帝为太子时,拜为舍人,积功稍迁,孝文帝时至太中大夫。景帝初即位,拜仁为郎中令。 仁为人阴重不泄,常衣敝补衣溺袴,期为不絜清,以是得幸。景帝入卧内,於後宫祕戏,仁常在旁。至景帝崩,仁尚为郎中令,终无所言。上时问人,仁曰:“上自察之。”然亦无所毁。以此景帝再自幸其家。家徙阳陵。上所赐甚多,然常让,不敢受也。诸侯群臣赂遗,终无所受。 武帝立,以为先帝臣,重之。仁乃病免,以二千石禄归老,子孙咸至大官矣。 御史大夫张叔者,名欧,安丘侯说之庶子也。孝文时以治刑名言事太子。然欧虽治刑名家,其人长者。景帝时尊重,常为九卿。至武帝元朔四年,韩安国免,诏拜欧为御史大夫。自欧为吏,未尝言案人,专以诚长者处官。官属以为长者,亦不敢大欺。上具狱事,有可卻,卻之;不可者,不得已,为涕泣面对而封之。其爱人如此。 老病笃,请免。於是天子亦策罢,以上大夫禄归老于家。家於阳陵。子孙咸至大官矣。 太史公曰:仲尼有言曰“君子欲讷於言而敏於行”,其万石、建陵、张叔之谓邪?是以其教不肃而成,不严而治。塞侯微巧,而周文处讇,君子讥之,为其近於佞也。然斯可谓笃行君子矣! 万石孝谨,自家形国。郎中数马,内史匍匐。绾无他肠,塞有阴德。刑名张欧,垂涕恤狱。敏行讷言,俱嗣芳躅。也。故事与时并,名与功偕。故钟鼓管磬羽籥干戚,乐之器也;诎信俯仰级兆舒疾,乐之文也。簠簋俎豆制度文章,礼之器也;升降上下周旋裼袭,礼之文也。故知礼乐之情者能作,识礼乐之文者能术。作者之谓圣,术者之谓明。明圣者,术作之谓也。 乐者,天地之和也;礼者,天地之序也。和,故百物皆化;序,故群物皆别。乐由天作,礼以地制。过制则乱,过作则暴。明於天地,然後能兴礼乐也。论伦无患,乐之情也;欣喜驩爱,乐之也。中正无邪,礼之质也;庄敬恭顺,礼之制也。若夫礼乐之施於金石,越於声音,用於宗庙*,事于山川鬼神,则此所以与民同也。 王者功成作乐,治定制礼。其功大者其乐备,其治辨者其礼具。干戚之舞,非备乐也;亨孰而祀,非达礼也。五帝殊时,不相沿乐;三王异世,不相袭礼。乐极则忧,礼粗则偏矣。及夫敦乐而无忧,礼备而不偏者,其唯大圣乎?天高地下,万物散殊,而礼制行也;流而不息,合同而化,而乐兴也。春作夏长,仁也;秋敛冬藏,义也。仁近於乐,义近於礼。乐者敦和,率神而从天;礼者辨宜,居鬼而从地。故圣人作乐以应天,作礼以配地。礼乐明备,天地官矣。 天尊地卑,君臣定矣。高卑已陈,贵贱位矣。动静有常,小大殊矣。方以类聚,物以群分,则性命不同矣。在天成象,在地成形,如此则礼者天地之别也。地气上隮,天气下降,阴阳相摩,天地相荡,鼓之以雷霆,奋之以风雨,动之以四时,暖之以日月,而百化兴焉,如此则乐者天地之和也。 化不时则不生,男女无别则乱登,此天地之情也。及夫礼乐之极乎天而蟠乎地,行乎阴阳而通乎鬼神,穷高极远而测深厚,乐著太始而礼居成物。著不息者天也,著不动者地也。一动一静者,天地之间也。故圣人曰“礼云乐云”。且降,乃使人告急天子。天子问太尉田蚡,蚡对曰:“越人相攻击,固其常,又数反覆,不足以烦中国往救也。自秦时弃弗属。”於是中大夫庄助诘蚡曰:“特患力弗能救,德弗能覆;诚能,何故弃之?且秦举咸阳而弃之,何乃越也!今小国以穷困来告急天子,天子弗振,彼当安所告愬?又何以子万国乎?”上曰:“太尉未足与计。吾初即位,不欲出虎符发兵郡国。”乃遣庄助以节发兵会稽。会稽太守欲距不为发兵,助乃斩一司马,谕意指,遂发兵浮海救东瓯。未至,闽越引兵而去。东瓯请举国徙中国,乃悉举众来,处江淮之间。 至建元六年,闽越击南越。南越守天子约,不敢擅发兵击而以闻。上遣大行王恢出豫章,大农韩安国出会稽,皆为将军。兵未逾岭,闽越王郢发兵距险。其弟馀善乃与相、宗族谋曰:“王以擅发兵击南越,不请,故天子兵来诛。今汉兵众彊,今即幸胜之,後来益多,终灭国而止。今杀王以谢天子。天子听,罢兵,固一国完;不听,乃力战;不胜,即亡入海。”皆曰“善”。即鏦杀王,使使奉其头致大行。大行曰:“所为来者诛王。今王头至,谢罪,不战而耘,利莫大焉。”乃以便宜案兵告大农军,而使使奉王头驰报天子。诏罢两将兵,曰:“郢等首恶,独无诸孙繇君丑不与谋焉。”乃使郎中将立丑为越繇王,奉闽越先祭祀。 馀善已杀郢,威行於国,国民多属,窃自立为王。繇王不能矫其众持正。天子闻之,为馀善不足复兴师,曰:“馀善数与郢谋乱,而後首诛郢,师得不劳。”因立馀善为东越王,与繇王并处。 至元鼎五年,南越反,东越王馀善上书,请以卒八千人从楼船将军击吕嘉等。兵至揭扬,以海风波为解,不行,持两端,阴使南越。及汉破番禺,不至。是时楼船将军杨仆使使上书,原便引兵击东越。上曰士卒劳倦,不许,罢兵,1、伯庸。《离骚》:“朕皇考曰伯庸”。譬如作家马伯庸……2、正则、灵均。《离骚》:“名余曰正则兮,字余曰灵均”。正则:公正而有法则。灵均:灵善而均调。屈原名平,字原,正则是对“平”字进行的解释,灵均是对“原”字进行的解释。3、修能。《离骚》:“又重之以修能”。修能:即美好的外表仪形。一释为很强的才干和能力。4、骐、骥。《离骚》:“乘骐骥以驰骋兮”。骐骥:骏马。5、峻茂。《离骚》:“冀枝叶之峻茂兮”。风信子(学名:Hyacinthus orientalis L.):是多年草本球根类植物,鳞茎卵形,有膜质外皮,皮膜颜色与花色成正相关,未开花时形如大蒜,原产地中海沿岸及小亚细亚一带,是研究发现的会开花的植物中最香的一个品种。喜阳光充足和比较湿润的生长环境,要求排水良好和肥沃的沙壤土等。全世界风信子的园艺品种约有单阏之岁兮,四月孟夏,庚子日施兮,服集予舍,止于坐隅,貌甚间暇。异物来集兮,私怪其故,发书占之兮,筴言其度。曰“野鸟入处兮,主人将去”。请问于服兮:“予去何之?吉乎告我,凶言其菑。淹数之度兮,语予其期。”服乃叹息,举首奋翼,口不能言,请对以意。 万物变化兮,固无休息。斡流而迁兮,或推而还。形气转续兮,变化而嬗。沕穆无穷兮,胡可胜言!祸兮福所倚,福兮祸所伏;忧喜聚门兮,吉凶同域。彼吴彊大兮,夫差以败;越栖会稽兮,句践霸世。斯游遂成兮,卒被五刑;傅说胥靡兮,乃相武丁。夫祸之与福兮,何异纠纆。命不可说兮,孰知其极?水激则旱兮,矢激则远。万物回薄兮,振荡相转。云蒸雨降兮,错缪相纷。大专槃物兮,坱轧无垠。天不可与虑兮,道不可与谋。迟数有命兮,恶识其时? 且夫天地为炉兮,造化为工;阴阳为炭兮,万物为铜。合散消息兮,安有常则;千变万化兮,未始有极。忽然为人兮,何足控抟;化为异物兮,又何足患!小知自私兮,贱彼贵我;通人大观兮,物无不可。贪夫徇财兮,烈士徇名;夸者死权兮,品庶冯生。述迫之徒兮,或趋西东;大人不曲兮,亿变齐同。拘士系俗兮,羖如囚拘;至人遗物兮,独与道俱。众人或或兮,好恶积意;真人淡漠兮,独与道息。释知遗形兮,超然自丧;寥廓忽荒兮,与道翱翔。乘流则逝兮,得坻则止;纵躯委命兮,不私与己。其生若浮兮,其死若休;澹乎若深渊之静,氾乎若不系之舟。不以生故自宝兮,养空而浮;德人无累兮,知命不忧。细故粦兮,何足以疑! 後岁馀,贾生徵见。孝文帝方受釐,坐宣室。上因感鬼神事,而问鬼神之本。贾生因具道所以然之状。至夜半,文帝前席。既罢,曰:“吾久不见贾生,自以为过之,今不及也。”居顷之,拜贾生为梁怀王太傅。梁怀王,文帝之少子,爱,而好书,故令贾生傅之。 文帝复封淮南厉王子四人皆为列侯。贾生谏,以为患之兴自此起矣。贾生数上疏,言诸侯或连数郡,非古之制,可稍削之。文帝不听。 居数年,怀王骑,堕马而死,无後。贾生自伤为傅无状,哭泣岁馀,亦死。贾生之死时年三十三矣。及孝文崩,孝武皇帝立,举贾生之孙二人至郡守,而贾嘉最好学,世其家,与余通书。至孝昭时,列为九卿。 太史公曰:余读离骚、天问、招魂、哀郢,悲其志。適长沙,观屈原所自沈渊,未尝不垂涕,想见其为人。及见贾生吊之,又怪屈原以彼其材,游诸侯,何国不容,而自令若是。读服乌赋,同死生,轻去就,又爽然自失矣。 屈平行正,以事怀王。瑾瑜比洁,日月争光。忠而见放,谗者益章。赋骚见志,怀沙自伤。百年之後,空悲吊湘。2000种以上,主要分为“荷兰种”和“罗马种”两类。前者属正宗品种,绝大多数每株只长1支花葶,体势粗壮,花朵较大。而后者则多是变异的杂种,每株能着生二三支花葶,体势幼弱,花朵较细,多数消费者喜购荷兰风信子。峻茂:犹繁茂。6、信芳。《离骚》:“苟余情其信芳”。如京剧表演艺术家周信芳。7、圣哲、茂行。《离骚》:“夫维圣哲以茂行兮”。圣哲:具有超人的道德才智的人。茂行:德行充盛。8、曼路。《离骚》:“路曼曼其修远兮,吾将上下而求索”。9、望舒。《离骚》:“前望舒使先驱兮”。望舒:神话中为月驾车的神。如写《雨巷》的诗人戴望舒。10、陆离。《离骚》:“斑陆离其上下”。陆离:光辉灿烂的样子。我们对于该词的认知多来自于成语“光怪陆离”,意指色彩繁杂、变化多端。11、珵美。《离骚》:“览察草木其犹未得兮,岂珵美之能当”。珵:美玉。12、云旗。《离骚》:“驾八龙之婉婉兮,载云旗之委蛇”。云旗:绘有云霓的旗帜。===================九===歌===的===分===界===线=================== 1、辰良。《九歌·东皇太一》:“吉日兮辰良”。“辰良”系“良辰”之倒文,指好时光。易被读作“乘凉”。2、玉锵、璆鸣。《九歌·东皇太一》:“抚长剑兮玉珥,璆锵鸣兮琳琅”。诗曰:佩玉锵锵。璆(音求):美玉。3、安歌。《九歌·东皇太一》:“疏缓节兮安歌”。南越王尉佗者,真定人也,姓赵氏。秦时已并天下,略定杨越,置桂林、南海、象郡,以谪徙民,与越杂处十三岁。佗,秦时用为南海龙川令。至二世时,南海尉任嚣病且死,召龙川令赵佗语曰:“闻陈胜等作乱,秦为无道,天下苦之,项羽、刘季、陈胜、吴广等州郡各共兴军聚众,虎争天下,中国扰乱,未知所安,豪杰畔秦相立。南海僻远,吾恐盗兵侵地至此,吾欲兴兵绝新道,自备,待诸侯变,会病甚。且番禺负山险,阻南海,东西数千里,颇有中国人相辅,此亦一州之主也,可以立国。郡中长吏无足与言者,故召公告之。”即被佗书,行南海尉事。嚣死,佗即移檄告横浦、阳山、湟谿关曰:“盗兵且至,急绝道聚兵自守!”因稍以法诛秦所置长吏,以其党为假守。秦已破灭,佗即击并桂林、象郡,自立为南越武王。高帝已定天下,为中国劳苦,故释佗弗诛。汉十一年,遣陆贾因立佗为南越王,与剖符通使,和集百越,毋为南边患害,与长沙接境。 高后时,有司请禁南越关市铁器。佗曰:“高帝立我,通使物,今高后听谗臣,别异蛮夷,隔绝器物,此必长沙王计也,欲倚中国,击灭南越而并王之,自为功也。”於是佗乃自尊号为南越武帝,发兵攻长沙边邑,败数县而去焉。高后遣将军隆虑侯灶往击之。会暑湿,士卒大疫,兵不能逾岭。岁馀,高后崩,即罢兵。佗因此以兵威边,财物赂遗闽越、西瓯、骆,役属焉,东西万馀里。乃乘黄屋左纛,称制,与中国侔。 及孝文帝元年,初镇抚天下,使告诸侯四夷从代来即位意,喻盛德焉。乃为佗亲冢在真定,置守邑,岁时奉祀。召其从昆弟,尊官厚赐宠之。诏丞相陈平等举可使南越者,平言好畤陆贾,先帝时习使南越。乃召贾以为太中大夫,往使。因让佗自立为帝,曾无一介之使报者。陆贾至南越,王甚恐,为书谢,称曰:“蛮夷大长老夫臣佗,前日高后隔异南越,窃疑长沙王谗臣,又遥闻高后尽诛佗宗族,掘烧先人冢,以故自弃,犯长沙边境。且南方卑湿,蛮夷中间,其东闽越千人众号称王,其西瓯骆裸国亦称王。老臣妄窃帝号,聊以自娱,岂敢以闻天王哉!”乃顿首谢,原长为籓臣,奉贡职。於是乃下令国中曰:“吾闻两雄不俱立,两贤不并世。皇帝,贤天子也。自今以後,去帝制黄屋左纛。”陆贾还报,孝文帝大说。遂至孝景时,称臣,使人朝请。然南越其居国窃如故号名,其使天子,称王朝命如诸侯。至建元四年卒。 佗孙胡为南越王。此时闽越王郢兴兵击南越边邑,胡使人上书曰:“两越俱为籓臣,毋得擅兴兵相攻击。今闽越兴兵侵臣,臣不敢兴兵,唯天子诏之。”於是天子多南越义,守职约,为兴师,遣两将军往讨闽越。兵未逾岭,闽越王弟馀善杀郢以降,於是罢兵。 天子使庄助往谕意南越王,胡顿首曰:“天子乃为臣兴兵讨闽越,死无以报德!”遣太子婴齐入宿卫。谓助曰:“国新被寇,使者行矣。胡方日夜装入见天子。”助去後,其大臣谏胡曰:“汉兴兵诛郢,亦行以惊动南越。且先王昔言,事天子期无失礼,要之不可以说好语入见。入见则不得复归,亡国之势也。”於是胡称病,竟不入见。後十馀岁,胡实病甚,太子婴齐请归。胡薨,谥为文王。 婴齐代立,即藏其先武帝玺。婴齐其入宿卫在长安时,取邯郸樛氏女,生子兴。及即位,上书请立樛氏女为后,兴为嗣。汉数使使者风谕婴齐,婴齐尚乐擅杀生自恣,惧入见要用汉法,比内诸侯,固称病,遂不入见。遣子次公入宿卫。婴齐薨,谥为明王。 太子兴代立,其母为太后。太后自未为婴齐姬时,尝与霸陵人安国少季通。及婴齐薨後,元鼎四年,汉使安国少季往谕王、王太后以入朝,比内诸侯;令辩士谏大夫终军等宣其辞,勇士魏臣等辅其缺,卫尉路博德将兵屯桂阳,待使者。王年少,太后中国人也,尝与安国少季通,其使复私焉。国人颇知之,多不附太后。太后恐乱起,亦欲倚汉威,数劝王及群臣求内属。即因使者上书,请比内诸侯,三岁一朝,除边关。於是天子许之,赐其丞相吕嘉银印,及内史、中尉、太傅印,馀得自置。除其故黥劓刑,用汉法,比内诸侯。使者皆留填抚之。王、王太后饬治行装重赍,为入朝具。安歌:神态安详地唱歌。有一句唐诗说:“安歌送好音”。4、浩倡。《九歌·东皇太一》:“陈竽瑟兮浩倡”。“浩倡”又作“浩唱”,和上句“安歌”相对应。取名时可改为“浩昌”。下文《九歌·少司命》中还有“浩歌”。令诸校屯豫章梅领待命。▼
要更多干货、技术猛料的孩子,快点拿起手机扫码关注我,我在这里等你哦~
正文结束
推荐阅读 ↓↓↓
1.不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事
4.“37岁,985毕业,年薪50万,被裁掉只用了10分钟”
5.37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...
一个人学习、工作很迷茫?
点击「阅读原文」加入我们的小圈子!
上一篇: 详解PHP中的字符串