本篇将持续更新。。。。。面试题总结html
面试过程当中,遇到领导问你为何离职时,必定要想好怎么回答,不知道的能够百度一下,我如今还在摸索阶段,有想法的能够留言探讨,这个问题很重要!java
目前最流行的一种互联网软件架构,资源在网络中以某种表现形式进行状态转移(1)每个URI表明一种资源;(2)客户端和服务器之间,传递这种资源的某种表现层;(3)客户端经过四个HTTP动词,对服务器端资源进行操做,实现"表现层状态转化"。(感受很晦涩难懂,我也不是很懂)面试
clone(), equals(), hashCode(), toString(), notify(), notifyAll(), wait(), finalize(), getClass()数据库
StringBuilder是线程不安全的,而StringBuffer是线程安全的,因此速度上(也能够理解为性能上)StringBuilder > StringBuffer > String。String是不可变的,其余两个是可变的。StringBuffer不少方法都被synchronized修饰了,因此才是线程安全的,可是这样会时其速度变慢。缓存
List,Set都是继承自Collection接口。List元素有序,set元素无序,重复放入元素会覆盖以前的元素。安全
(1)Set<String> sets = new HashSet<String>();for (String element : sets) {} (2)Set<String> sets = new HashSet<String>();Iterator<String> it = sets.iterator();while(it.hasNext()){String str = it.next()}服务器
Map<String, Integer> tempMap = new HashMap<String, Integer>(); (1)Iterator it = tempMap.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Object key = entry.getKey(); Object value = entry.getValue(); }(2)for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {String key = entry.getKey().toString();String value = entry.getValue().toString(); }(3) for (Object o : tempMap.keySet()) { System.out.println("key=" + o + " value=" + tempMap.get(o)); }(4)for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) { Object obj = i.next(); System.out.println(obj);// 循环输出key System.out.println("key=" + obj + " value=" + tempMap.get(obj)); }网络
这里主要记住entrySet和keySet,使用迭代器iterator。多线程
在java运行环境中获取类的属性和方法,调用对象的任何一个方法。动态获取类的信息,以及动态调用对象的方法就叫作java的反射机制。架构
ACID,原子性(Atomicity):事务不可拆分,要么都发生,要么都不发生。一致(Consistency)性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。隔离性(Isolation):多个用户访问时,各个用户之间的事务性互不干扰。持久性:事务一旦被提交,数据库中的数据改变就是永久性的。
A.class a.getclass() Class.forName()
ThreadLocal(线程变量副本),ThreadLocal为每一个线程维护一个本地变量。而Synchronized实现内存共享,ThreadLocal采用空间换时间,它用于线程间的数据隔离,为每个使用该变量的线程提供一个副本,每一个线程均可以独立地改变本身的副本,而不会和其余线程的副本冲突。
&运算符有两种用法:(1)按位与;(2)逻辑与。&运算符是短路与运算。逻辑与跟短路与的差异是很是巨大的,虽然两者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之因此称为短路运算是由于,若是&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。不少时候咱们可能都须要用&&而不是&。
题目为 byte a=1,b=2,ab;final byte c=3,d=4,cd;ab=a+b;cd=c+d;
syso(ab);syso(cd);
被final修饰的变量是常量,这里的cd=c+d能够当作是cd=7;在编译时就已经变为cd=7了.而b1和b2是byte类型,java中进行计算时候将他们提高为int类型,再进行计算,b1+b2计算后已是int类型,赋值给b3,b3是byte类型,类型不匹配,编译不会经过,须要进行强制转换。Java中的byte,short,char进行计算时都会提高为int类型。
线程相关能够访问如下地址(https://www.cnblogs.com/bsjl/p/7693029.html). 线程是进程的子集,一个进程能够有不少线程,每条线程并行执行不一样的任务。不一样的进程使用不一样的内存空间,而全部的线程共享一片相同的内存空间。别把它和栈内存搞混,每一个线程都拥有单独的栈内存用来存储本地数据。
若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次运行结果和单线程运行的结果是同样的,并且其余的变量的值也和预期的是同样的,就是线程安全的。一个线程安全的计数器类的同一个实例对象在被多个线程使用的状况下也不会出现计算失误。很显然你能够将集合类分红两组,线程安全和非线程安全的。Vector 是用同步方法来实现线程安全的, 而和它类似的ArrayList不是线程安全的。
建立线程要花费昂贵的资源和时间,若是任务来了才建立线程那么响应时间会变长,并且一个进程能建立的线程数有限。为了不这些问题,在程序启动的时候就建立若干线程来响应处理,它们被称为线程池,里面的线程叫工做线程。从JDK1.5开始,Java API提供了Executor框架让你能够建立不一样的线程池。好比单线程池,每次处理一个任务;数目固定的线程池或者是缓存线程池(一个适合不少生存期短的任务的程序的可扩展线程池)。
Java程序中wait 和 sleep都会形成某种形式的暂停,它们能够知足不一样的须要。wait()方法用于线程间通讯,若是等待条件为真且其它线程被唤醒时它会释放锁,而sleep()方法仅仅释放CPU资源或者让当前线程中止执行一段时间,但不会释放锁
首先用代码解释一下:
public class Main {
public static void main(String[] args) {
B b =new B();
}
}
class A{
{
System.out.println("构造代码块A");
}
static{
System.out.println("静态代码块A");
}
public A(){
System.out.println("构造函数A");
}
}
class B extends A{
{
System.out.println("构造代码块B");
}
static{
System.out.println("静态代码块B");
}
public B(){
System.out.println("构造函数B");
}
}
输出结果为:
静态代码块A
静态代码块B
构造代码块A
构造函数A
构造代码块B
构造函数B
解释: 1.局部代码块,又叫普通代码块。它是做用在方法中的代码块。做用:是控制局部变量的生命周期.
2. 构造代码块,就是给全部对象进行初始化。每次建立对象他都会执行,构造代码快是优于构造函数执行。构造代码块与构造函数的区别是:构造代码块是给全部对象进行统一初始化,而构造函数是给对应的对象初始化,由于构造函数是能够多个的,运行哪一个构造函数就会创建什么样的对象,但不管创建哪一个对象,都会先执行相同的构造代码块。也就是说,构造代码块中定义的是不一样对象共性的初始化内容。
3.静态代码块,是对类进行初始化,若一个类包含多个静态代码块,那则是按照代码执行顺序执行。随着类的加载而执行,并且只一次。优先于主函数执行。当类进入内存时,首先进行静态代码加载
1. 继承Thread类。
2. 实现Runabl接口 二者没有很大的区别,java是单继承,因此通常以第二种编写线程为佳。
1. run方法执行不是异步执行的,而是同步执行的,此线程对象不交给线程规划器规划。
2. start方法是通常启动线程的方式,是异步执行的。执行start的顺序不表明线程执行的顺序
1. interrupted 测试当前线程是否已是中断状态,执行后将状态标志清除为false。 2. isInterrupted 测试当前线程是否已是中断状态,但不清除状态标志。