java面试总结

结合一些网上的东西,大家可以参考一下
一、Java基础
1.String
1)String 是final的,所以不可被继承,线程安全,new String()会创建一个新对象,String对象会存在常量池中,new一个String时,会创建一个常量池中的对象和一个堆中的对象,地址指向堆。
2)String(字符串常量)与StringBuilder(字符串变量)与StringBuffer,String和StringBuffer是线程安全的,StringBuilder>StringBuffer>String
3)String为什么是final的:安全和效率
2.==,equals和hashcode()
1)==和equals():==比较地址引用,equals()一般比较值,是object类的方法,可以重写
2) equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
3.基本数据类型
1)基本数据类型:char,int,float,double,byte,long,short,boolean
2)拆箱和装箱:自动装箱:Interger i=10; 自动拆箱:int i=10;装箱过程是通过调用包装器的valueOf方法实现的,Interger i=Interger.valueof(10);
4.容器
List和Set继承自Collection接口。
1)LinkedList和ArrayList的区别
LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。
LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除
2)hashmap,hashtable,concurrenthashmap
5.多线程
线程创建的方式:
1)继承Thread类,重写run()方法
2)实现Runnable()接口,实现run()方法,作为Thread的子任务
3)ExecutorService、Callable、Future实现有返回值的多线程,实现Callable接口中的call()方法,将callable对象作为FutureTask对象的参数,isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。isDone方法表示任务是否已经完成,若任务完成,则返回true;
get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;
4)线程池
参数:corePoolSize:核心池的大小,当线程池中的线程数目达到corePoolSize后,就会把到达的任务放到缓存队列当中
maximumPoolSize:线程池最大线程数,在线程池中最多能创建多少个线程
keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。
unit:参数keepAliveTime的时间单位
workQueue:一个阻塞队列,用来存储等待执行的任务,一般使用LinkedBlockingQueue和Synchronous。线程池的排队策略与BlockingQueue有关。
threadFactory:线程工厂,主要用来创建线程;
handler:表示当拒绝处理任务时的策略,有以下四种取值:
ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
四种常用线程池:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
6.锁
1)synchronized(容易死锁)
1. 代码块——获取对象lock的锁,直到执行完代码块,释放该锁
2.非静态方法——获取this的锁,直到执行完方法,释放该锁
3. 静态方法或类——获取类的锁
2)可重入锁:类ReentrantLock实现了接口Lock,优点: 避免死锁 可中断 公平性
3)voliate 当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量刷新到主内存。
当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。
4)本地变量  ThreadLocal 每一个使用该变量的线程都获得该变量的副本
5)阻塞队列
7.序列化
1)transient
一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
2)序列化作用
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程。
实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。
3)序列化实现
实现了Serializable接口
实现了Externalnalizable接口
8.反射和类加载
1)反射机制
每个类都有一个Class对象,每当我们编写并且编译一个新创建的类就会产生一个对应Class对象并且这个Class对象会被保存在同名.class文件里,Class类的对象作用是运行时提供或获得某个对象的类型信息,其中forName方法是Class类的一个static成员方法
我们也就知道Class.forName()方法的调用将会返回一个对应类的Class对象,因此如果我们想获取一个类的运行时类型信息并加以使用时,可以调用Class.forName()方法获取Class对象的引用,这样做的好处是无需通过持有该类的实例对象引用而去获取Class对象,如下的第2种方式是通过一个实例对象获取一个类的Class对象,其中的getClass()是从顶级类Object继承而来的,它将返回表示该对象的实际类型的Class对象引用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值