自己看

一、 javaSE
1、 面向对象的特征有哪些?

  1. 继承:子类继承父类的行为和特征,关键字为extends。子类也可以有父类的属性(非private),子类可以对父类进行扩展,可以重写父类的方法。缺点是提高了代码间的耦合性。 Super是关键字
  2. 封装:就是把过程和数据包围起来,对数据的访问只能通过特定的界面。
  3. 多态:不同类的对象,对同一消息做出不同的响应。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了同名问题。
    多态存在的3个条件:有继承关系
    重写了父类的方法
    父类引用指向子类
    不能实现多态的方法(不能被重写的方法):
    Static修饰的方法 属于类的而不是实例的
    Final修饰的方法 不能重写
    Private修饰的私有的方法
    2、 super()与this()的区别?
    This():表示当前类的对象,对所有的资源都可以进行访问
    Super():在子类访问父类的成员和行为,即必须受类继承规则的约束
    3、 static是一个关键字、修饰符。可以修饰变量,方法,代码块,内部类。
    Static修饰的变量叫做静态变量,在类加载到方法区的时候,静态变量随着类加载到方法区的静态区。静态变量是优先于对象存在的,静态变量可以通过类去调用,也可以通过对象调用。 静态变量不能在构造代码块中定义,因为静态变量是随着类的加载而加载的,构造代码块是与对象同级的。静态变量不能在方法中定义,方法需要对象去调用,静态变量优先于对象存在。
    Static修饰的方法为静态方法,随着类加载到方法区的静态区,不能做任何操作。当方法被调用的时候会被加载到栈中执行。静态方法是优先于对象存在的,可以通过类或者对象去调用。静态方法不能定义静态变量,因为静态方法要等到被调用的时候才执行。
    静态方法里面不能使用this,this代表的是当前类的对象,静态方法是优先于对象存在的。Main方法中不能调用本类的其他非静态方法,费静态方法只能通过对象去调用,main方法是优先于对象存在的。静态方法能被重载、可以被继承,但是不能被重写。
    Static修饰的代码块为静态代码块。 随着类的加载而加载,只加载一次。
    4、 final是一个关键字。修饰符。可以修饰数据、方法和类。
    Final修饰的数据为常量,值不能发生变化。
    Final修饰的方法叫做最终方法,可以重载、继承,但是不能被重写。
    Final修饰的类叫做最终类,不能被继承,最终类可以有父类
    5、 java的垃圾回收机制?
    垃圾回收机制针对的是堆内存
    Java中对象使用完成之后,会被GC在某个时期给清除,在java程序刚启动时,GC也同时启动了,并且监视堆内存的变化,当堆内存的使用达到一个临界值(0.75)的时候就让GC清除无用的对象 System.gc
    堆内存分成了新生代(伊甸园区和幸存区)和老生代,刚创建对象时,把对象放在伊甸园区,开始扫描,如果这个对象无用了就被回收,如果还在使用就被移到幸存区,再进行对此扫描,如果这个对象无用了就被回收,如果还在使用就移到老生区继续进行
    扫描,如果对象无用就回收,如果有用就继续待在老生区。老生代里的对象很可能造成系统崩溃
  4. jdk1.5/1.6/1.7/1.8的新特性
    1.5 自动装箱与拆箱 、增强for循环、泛型、静态导入、反射
    自动装箱:把基本数据类型的变量的值直接赋值给对应包装类对象的值 底层是对应的包装类调用valueOf()
    自动拆箱:把包装类对象的值赋值给对应的基本数据类型变量 底层是包装类对象调用XXXValue()方法
    1.7 switch中可以使用字符串了、异常的分组、try()catch()语句
    1.8 时间日期的api
    Java集合框架简介:java集合框架包括两种,一种是集合collection,一种是图Map。
    Collection是一个集合的顶级接口,提供了对集合对象进行基本操作的方法。有两个主要的子接口List和Set。 Map是一存储键值对映射的容器类,在Map中键的值可以是任意类型,但不能有重复的键,每一个键都对应一个值。
    List接口继承collection接口,代表着有序的队列。派生出ArrayList、LinkedList、
    Vector、Stack等
    ArrayList是一个数组队列,相当于动态数组。底层由数组方式存储数据,实现了RandomAccess接口,支持快速随机访问,随机访问效率高。每次插入或者删除元素,需要大量的移动元素,所以插入删除元素的效率低。允许元素为null,默认容量大小为10,扩容为当前容量的1.5倍。当容量不够时,每次增加元素,都要将原来的元素复制到新的数组中,很耗时。是一个非线程安全的。
    LinkedList是一个双向链表,允许元素为null,允许重复元素。是基于链表实现的,所以删除和插入效率高,查找效率低。不存在容量不足的问题,不需要扩容。
    Vector是矢量队列,和ArrayList一样,也是一个动态数组,由数组实现。但是ArrayList是非线程安全的,Vector是线程安全的,一般都由ArrayList代替了。
    Stack是栈,继承了Vector,也是数组实现的。是线程安全的。它的特性是先进后出。
    Set接口继承collection接口,set集合不予必须里面存在重复的元素。每个元素都必须是唯一的。添加元素。重复的元素会自动移除。有三个常见的实现类Hashset、TreeSet、LinkedHashSet。
    HashSet,它带了一个Hash说明和哈希码有关系,由哈希表支持实现。HashSet不能保证元素插入的顺序,而且元素在以后的顺序中也可能发生变化。HashSet底层是基于HashMap存储的,HashMap的底层是基于数组+链表结构进行存储的,也就是说,在HashMap底层有一个数组,这个数组的初始容量为16。在这个数组中,把数组中的每一个位置及称之为一个桶—bucket。往桶里存储元素,要先进行计算该元素的哈希码,针对这个哈希码进行二次运算,使运算结果能随机散落在这些桶的某一个桶里。不是直接放入桶里,而是开辟了一个空间存了该元素。对应的桶存储了该元素对应的地址。如果又来一个元素,经过计算为第二个桶,就存入第二个桶,所以不能保证元素插入的顺序。如果有来一个元素,经过计算也为第二个桶,那么先拿这个元素与原来的元素进行比较,相同则自动清除。不同的话,桶先指向后来的元素的地址,用这个后来的元素指向原来元素的地址,形成一个栈结构。所以不保证在以后的顺序中不会发生变化。存入的元素越来越多,会导致链表太长,效率低下。所以桶得进行扩容,如果已经使用的桶得数量/桶的总数量>加载因子0.75f,就需要扩容。每次扩容是在当前的基础上增加一倍。扩容之后,将集合中的所有元素重新计算哈希码重新分布,这个操作叫rehash。
    TreeSet是一种排序的set集合,底层是用TreeMap实现的,本质上是一个红黑树原理。
    HashMap是一个“链表散列”的数据结构,数组和链表的结合。实现了寻址容易,插入删除也容易。HashMap是基于散列法(又成哈希法hashing)的原理,使用put(key,value)存储对象到HashMap中的,使用get(key)从hashMap中获取对象的。本身是一个异步式线程不安全的映射。hashMap的碰撞检测,当两个对象的hashCode相同时,他们的bucket位置相同,碰撞会发生。采用合适的equals()方法和hashCode()方法,减少碰撞的发生,提高效率。
    Hashtable — 默认初始容量是11,默认加载因子是0.75f,每次扩容的时候在当前的基础上增加一倍,再+1。11 -> 23。键和值不允许是null。Hashtable本身是一个同步式线程安全的映射
    HsahMap和Hashtable的区别?
  5. 基类不同,HashTable基于Dictionary.HashMap基于AbstractMap。
  6. Null不同:HashMap可以允许存在一个为null的key和任意个null的value。HashTable中的key和value都不允许为null
  7. 线程安全不同:hashMap是异步式线程不安全的 HashTable是同步式线程安全的
  8. 遍历不同,hashMap只支持Iterator的遍历,HashTable支持两种遍历方式。

1、 Collections和Collection的区别?
Collection是一个集合的顶级接口 提供了对集合对象进行基本操作的通用接口的方法
Collections是一个包装类 ,包含有各种各样有关集合操作的静态多态方法。
2、 常用集合列有哪些?有哪些方法?
我们使用的集合类大多是由List、Set、这三类接口派生出来的类。例如:ArrayList ,Vector,LinkedList,Stack,TreeSet,HashTable,HashMap 方法:add()
Remove() addAll() contains() clear()
3、 说出ArrayList,Vector,LinkedList的存储性能和特性
ArrayList和Vector底层都是使用数组方式存储数据的。ArrayList默认初始容量为10,每次扩容是在当前的基础上增加一半。Vector是一个线程安全的集合,默认容量为10,每次扩容增加一倍。但是性能没有ArrayList好。
LinkedList底层数基于节点来进行存储的。内存空间不连续。
如果增删次数和查询次数相差不大的话 ,使用链表结构 因为链表结构对内存的要求更小
整体效率上,链表要高于顺序表,如果增删位置靠前那么链表效率高,如果靠后,则顺序表效率高。

1、 线程与进程之间有什么不同?
进程是计算机中在执行的任务,在CPU上执行和计算
进程是线程中的小任务。
2、 多线程有几种实现方法?
1, 继承thread类,重写run方法,将要执行的逻辑放到run方法中。创建线程对象,调用start方法来启动线程。
2, 实现runnable接口,重写run方法,将要执行的逻辑放到run方法中,创建Runnable对象,将对象作为参数传递到Tnread对象中,利用Thread对象的start方法来启动线程
3, 写一个类实现Callable接口,重写call方法。
3、 Thread和Runnable的区别和使用
Thread是一个类,被继承,但是java只支持单继承。Thread类的start方法不能被覆盖
Runnable是接口,可以多实现,Runnable的run方法由Thread的start调用
4、 Thread类中的start()和run()方法有什么区别?
调用start()方法才能启动新线程,如果直接调用Thread的run()方法,它的行为就和普通方法一样,为了在新线程中执行代码,必须使用Thread.astart()方法。
5、 同步和异步有何异同?
1, 同步就是指一个线程要等待上一个线程执行完之后才开始执行当前的线程。同步线程一定是安全线程。
2, 异步是指一个线程去执行,下一个线程不必等待它执行完毕就开始执行。异步线程不一定不安全,不安全的一定是异步线程。
6、 如何实现线程同步?
同步锁机制:Synchronized:在同一时刻,只能被一个线程访问,代码执行完会自动释放锁。
7、 同步方法和同步块,哪个是更好的选择?
同步块是更好的选择,同步方法会锁住整个对象,如果类中还有其他同步块,会导致他们停止执行等待获得这个对象上的锁。
8、 什么是死锁DeadLock?如何避免死锁?
死锁是由于锁之间互相嵌套并且锁对象不同导致线程之间相互锁死,是代码无法继续往下进行。
统一锁对象 减少锁的嵌套
9、 线程有哪些状态?这些状态数如何转换的?

创建:new Thread
就绪:start方法启动线程后
运行:抢占下cpu,系统执行run方法
阻塞:没有抢到cpu
消亡:Dead run运行结束或异常退出
10、 sleep()和wait()的区别?
Sleep是线程类Thread的方法,导致线程暂停指定的时间,给别的线程执行的机会,监控状态依然保持,时间过后自动恢复线程,不会释放对象锁
Wait是Object类的方法,调用此方法会导致线程放弃对象锁,只有调用notify方法或notifyAll方法才能恢复线程继续执行。
11、 线程的优先级的理解?
一般来说,高优先级的线程在运行时会有优先权,但是不是太明显。1代表最低,10代表最高。
12、 如何创建守护线程?与非守护线程的区别?
使用Thread类的setDaemon(true)方法创建守护线程,需要在start方法前调用。
在线程中,一个线程不是守护线程就是非守护线程,也就是被守护的线程。当最后一个被守护的线程结束守护线程才会结束
13、 四大线程池:
FixedThreadPool:有固定数量线程的线程池 响应的速度快,多用于服务器。
SingleThreadPool: 单线程线程池 只有一个核心线程,不会被回收
CachedThreadPool: 缓存线程池 只有非核心线程,最大线程数很大,当空闲的线程60秒没有用的话就会被回收。
ScheduledThreadPool: 定时定期执行任务功能的线程洗

6、 什么是java序列化?如何实现序列化?
序列化:序列化就是一种用来处理对象流的机制,所谓对象流就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有被实现的方法,只是为了标注该对象是可被序列化的。然后使用一个输出流(FileOutputStream)来构造一个ObjectOutputStream对象,接着使用ObjectOutputStream对象的writeObject方法就可以将对象写出。要恢复的话则用输入流。
7、 java原生序列化的缺点?
1, 不能做到对象结构的复用,导致序列化后的数据较大
2, 跨语言性较差,要求对端语言只能是java语言
3, 序列化和反序列化耗费的cpu较多
8、 在java中,如何跳出当前的多重嵌套循环?
用break; return方法
9、 如何将数组转换成集合,集合转换成数组?
数组转集合:List list = Arrays.asList(new String[]{“abc”,”abc”});
集合转数组:toArray()

8、java的异常有哪几种?有什么区别?
异常的父类为Throwable 有两个子类为Error和Exception
Error表示应用程序本身无法克服和恢复的错误 例如:内存溢出和线程死锁问题
Exception表示程序还能克服和恢复的问题 有分位系统异常和普通异常
系统异常是原件本身缺陷所导致的问题 数组越界 空指针异常 类转换异常
普通异常时运行环境的变化所导致的 网络断线 硬盘空间不够等
10、 Throwable、 Error、 Exception、 RuntimeException的区别
Throwable是所有错误或者异常的父类 两个子类是Error 、Exception
Error表示应用程序本身无法克服和恢复的错误 例如:内存溢出和线程死锁问题
Exception表示程序还能克服和恢复的问题 有分位系统异常和普通异常
系统异常是原件本身缺陷所导致的问题 数组越界 空指针异常 类转换异常
普通异常时运行环境的变化导致所的 网络断线 硬盘空间不够等
RuntimeException是Exception的子类
11、 java语言如何进行异常处理?
Try:执行部分 产生异常
Catch:捕获异常
Finally:不管有没有异常都执行
Throws:在方法声明处声明要抛出的异常 调用者必须对其进行处理
Throw:抛出一个异常
10、运行时异常与一般异常有什么区别?
运行时异常:都是RuntimeException类及其子类,就是我们在开发中测试功能是程序终止,控制台出现的异常 空指针异常 下标越界异常 类转换异常 数据存储异常 Io的操作异常
一般异常:非运行时异常,必须处理的异常 如果不处理 程序就不能编译通过。通俗的话就是写代码时出现红线,需要try catch或者throws时出现的异常

1、 UDP和TCP的区别
Tcp发送与接收是安全送达的 建立连接是在三次握手 没有数据大小的限制 是可靠连接 速度比较慢。
Udp发送与接收只管发送 无需建立连接 数据大小每个数据报64k 不可靠单数速度快
2、 三次握手
第一次握手,建立连接时 客户端发送同步序列编号到服务器,并进入发送状态,等到服务器确认
二次握手,服务器收到同步序列编号,确认并同时自己也发送一个同步序列编号+确认标志,此时服务器进入接收状态
三次握手,客户端收到服务器发送的包,冰箱服务器发送确认标志,随后连接成功
3、 四次挥手
第一次:客户端向服务器发送一个带有结束标记的报文
第二次:服务器收到报文后,向客户端发送一个确认序号,同时通知自己相应的程序,对方要求关闭连接
第三次:服务器向客户端发送一个带有结束标记的报文
第四次:客户端收到报文后,向服务器放一个确认序号,连接关闭

JVM调优
目标是:调整java虚拟机的参数使得性能达到最优
原则:无监控不调优
调整堆内存的参数进行调优。
比如堆内存初始化大小、堆内存最大值,堆中新生代的大小、新生代与老年代的比例
Jdk1.7的时候可以对永久去的参数进行调优 永久区初始大小 永久区最大值等
GC
什么是垃圾:首先是引用计数算法 但是这种方法不可靠
所以用正向可达算法判断什么是垃圾。首先要得到在堆内存中一定不是垃圾的根对象,我们成为GCRoots。顺着GCRoots的引用往下找。顺藤摸瓜能连接到的就不是垃圾,连接不到的就是垃圾。
垃圾回收:
MinorGC:新建对象优先在伊甸园区分配。如果分配不下就会发生MinorGC。MinGC主要是回收伊甸园区与幸存区中的垃圾,日过垃圾回收之后还是放不下就放入老年代。
FullGC:FullGC是用来清理整个堆空间的,会造成很大的开销要避免。
垃圾收集算法:
1, 标记清除算法算法本身只是标记而不是清除,当来一个大的对象的时候内存中会因为碎片化而装不下进行FullGC操作。
2, 复制算法:将内存分为两个部分,第二部分保证为空,垃圾回收的时候会根据正向可达算法找到存活对象,将存活对象复制放到空的部分,效率非常高,但是会浪费内存
3, 压缩标记算法:将幸存的对象压缩到一端再进行GC,会得到连续的可用空间。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值