java八股文小总结

1.JAVA基础知识
(1)java三大特性:封装、继承、多态

封装:将属性与方法封装在类中,通过不同的权限选择对外界开放访问。

继承:子类继承父类,不仅有父类的属性和方法而且还可以进行扩展。

多态:重载:类名相同其余不同、重写:除了方法体不同其余相同、上转型:子类对象上转为父类对象。

(1-1)JDK JRE JVM

jvm:java虚拟机,负责将java字节码最终转化为对于操作系统的机器指令,是JAVA跨平台的关键部分。

jre:java运行环境,用于运行java字节码文件。

jdk:java开发包,提供编译运行java所需要的工具与资源

(2)==与equals的区别

对于基本类型==比较的是值。对于引用类型==比较的是内存地址

equals是Object类的方法,本质上与==一样,但是有些类重写了equals方法,比如String的equals方法比较的是内容。此外重写了equals后也必须重写hashcode方法。因为只重写equals不重写hashcode可能会出现对象一样但是hashcode不一样,存储在hash表中时会出现问题。两个一样的对象都存在了hash表中。

(2-1)hashCode与equals的关系

当比较一个对象时首先调用hashCode计算他的hash值如果不一样说明不是同一对象,若一样则在调用equals判断两个对象是否相同。在使用hashmap中,重写equals方法时要重写hashcode方法防止出现equals判断为同一对象而hashcode算出的值又不一样map就会将两个对象都存储。

(3)&与&&的区别

&会计算符号前后的布尔值为同时为真才输出真,&还可以进行位运算。&&会在前面表达式为假时直接输出假而不会计算后边的表达式

(4)StringBuffer与StringBuilder与String

string是不可变的底层实现是通过final cahr[]实现的,一经创建,而StringBuffer与StringBuilder是可变的。此外StringBuilder是线程不安全的而StringBuffer是线程安全的。

所以对于少量字符串使用String

对于单线大量 字符串使用StringBuilder

对于多线程大量字符串使用StringBuffer

(5)重载与重写的区别

重写发生在子类中,而且方法名相同、参数列表相同、返回类型相同,权限要大于等于弗雷方法。

重载发生在同一个类中,方法名相同、参数列表、返回类型、权限修饰符可以不同。

(6)(list set map)的区别

list与set是存储单列数据的集合,map是存储双列数据的集合。

list存储的数据是可重复的有序的,set存储的数据是无序的不可重复的。

map存储的数据也是无序的,而且键不允许重复但是值可以重复。

(7)线程安全的集合

concurrentHashMap、hashTable、vector

对于hashtable实现线程安全:

实现分段锁以及volatile关键字:将hashtable分成多个段然后进行加锁,而volatile可以保证线程修改后其余线程能过看到修改后的变量

(8)介绍一下hashmap

hashmap的底层是通过数组加链表加红黑树实现的,特点是存储一个键值对,其中键唯一且可以为null,值可以为任意。

hashmap的put方法,存储值时先进行hash计算,然后再次hash计算出索引地址,如果以及存在对象就调用eqauals方法进行比较,是同一对象就将当前对象进行替换,不是同一对象就将当前对象插入到索引后边的链表里。

hashmap的扩容:初始大小16,装载因子0.75,当使用的容量占总共的达到装载因子时进行扩容,

第一步:复制一个新的数组,扩充为原来的两倍。

第二步:将原来的数据添加到新数组上。

第三步:将当前需要插入的数据添加到新数组上。

此外:当链表长度大于8数组长度大于64时链表转为红黑树

(9)ArrayList和LinkedList的区别

Arrayist的底层结构是基于数组实现,而linkedList是基于链表实现的,所以前者查询快增删慢,后者增删快查询慢。前者遍历使用迭代器和下标都可以,而后者只能使用迭代器。

(10)如何保证arraylist的使用安全

1.使用collections.synchronizeList加锁

2.使用copyOnWriteArrarlist,该类实现了读操作不加锁,写操作时为list创建一个副本,期间其它线程读取的都是原本list,写操作都在副本中进行,写入完成后,再将指针指向副本。

(10-1)java异常体系

所以异常都是来自于父类throwable的两个子类,Error和Exception

Error是表示非常严重的错误,无法依靠程序来解决,因为根本无法运行,比如堆溢出(无线new对象)和栈溢出(无限new方法)

Exception是表示可以依靠程序解决的错误,可以通过try catch捕获并处理,比如空指针异常、数组越界等

(10-2)什么时候抛出异常

如果当前方法能处理这个异常就可以进捕获并处理,否则就往上抛出异常。

(11)接口类与抽象类的区别

相似点:

接口和抽象类都不能被实例化。

实现接口或者继承抽象类的子类都必须实现抽象方法。

不同点:

抽象类的成员变量可以有各种类型的,但是接口的成员变量只能是public static final类型而且必须赋值。

抽象类可以有普通方法,而接口只有抽象方法。

(12)创建class的几种方法

new 关键字、反射、克隆、序列化

(13)java反射(如何创建、使用场景、优缺点)

反射机制:对于任意一个类都可以获取它的方法和属性,这种动态的获取信息的方式就叫做反射

使用的场景:jdbc加载驱动时使用 。

反射的几种使用方法:

路径:class.forname(路径)

对象:.class()

实例:.getClass()

然后调用newInstance获取实例类 接着通过实例对象调用其中的方法或者属性。

(14)浅拷贝与深拷贝

浅拷贝:对于基础数据类型进行复制,对于引用类型只拷贝它的引用地址,深拷贝对于基础数据类型也是直接复制,但对于引用类型会对引用地址的对象进行复制。

(15)String str=new String"abc";创建了几个对象

创建了两个对象,一个是abc的字符串常量,另一个是引用对象,它指向常量。

String a="abc";与str是一样的吗

不一样,一个是常量,一个是对象。

(16)java项目有哪些开发模式

1.单例模式:创建一个类,设置构造方法为私有,而且只有一个实例,保存在其本身的静态字段中,若要使用类的实例属性、实例方法,都要通过这个静态字段访问唯一的实例来实现。

2.工厂模式 :设计一个工厂类,在需要创建新对象时传入参数给工厂类,它就可以自动创建。

3.抽象工厂模式:建立一个抽象工厂,它可以创建若干个具体工厂,然后由每一个工厂产生一类对象。

4.建造者模式:略

2.线程
(1)线程和进程的区别

进程是系统运行的基本单位,进程在运行的过程中相互独立,享有系统资源。

线程是进程下的单位,一个线程由若干进程组成,而且这多个线程共享该进程的资源。

(2)java线程的创建方式以及区别

1:继承Tread类因为它已经实现了Runnable接口所以只需要重写run方法

2:实现Runnable接口,实现run方法

3:实现Callable接口--带有返回值,实现call方法

4:线程池进行创建

总结:第一种方法由于子类只可以继承一个父类所以任务类无法继承其他类,但访问当前线程只需要使用this关键字。第二种和第三种方法只是实现了接口所以还可以继承其他类但访问当前类需要使用thread.currentThread方法。当需要线程有返回值时可以使用实现callable接口这种方法。

(3)线程的几种状态,以及线程池的几种状态

创建、就绪、阻塞、运行、死亡

running、shutdown、stop、tidying、terminated

(4)死锁以及死锁的的条件和避免的方法

死锁是指多个线程在执行的过程中因争夺资源造成的互相等待的局面。

条件:

1:互斥 : 同一资源同时只能由一个线程读取

2:不可抢占:线程占用资源时不可以被剥夺

3:请求和保持 :请求其他资源时对自己手中的资源保持不放

4:循环等待:互相等待资源时形成闭环

预防:设置定时锁、尽量使用相同的加锁顺序

(4-1)锁的几种分类

自旋锁:在线程没有锁时不被挂起,而是进行空循环,若循环几次后还没有获取锁,则被挂起。

阻塞锁:让线程进入阻塞状态进行等待,被唤醒后才能继续运行。

读写锁:读和写都上锁,读读共享、写写互斥、读写互斥

公平锁:多个线程按照申请锁的顺序获得锁,然后进入队列等待。

非公平锁:多个线程获取锁的时候会直接去尝试获取,获取不到再去队列等待。

悲观锁:每次拿数据时都会上锁。

乐观锁:每次拿数据时不会上锁。

(4-2) AQS
(5)线程池

:线程池是一种资源复用的技术,对已创建的线程进行重复利用以减少新线程的创建,提高资源利用率。

参数:关键2个

核心线程数:

最大线程数:

(6)NIO与BIO

NIO是指同步阻塞,一个请求对应一个线程,所以当请求数过多时会造成服务器崩溃。适用于连接数目小而且连接固定的场景。

BIO是指同步非阻塞,一个线程可以处理多个请求,以轮询的方式,当有需要时线程才会处理请求。适用于连接数目多但是连接时间短场景。

3.JVM
(1)java内存模型
方法栈(静态变量、常量、类信息)虚拟机栈(实例方法信息)本地栈(native修饰实例方法)
堆(最大一块)(实例对象)程序计数器(保存指令执行的地址,方便线程切换回来后继续执行代码)

线程私有区:

(1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧

(2)本地方法栈:为native修饰的本地方法提供的空间

(3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码

线程共享区:

(4)堆内存:Jvm进行垃圾回收的主要区域,存放对象信息,分为新生代和老年代,内存比例为1:2,新生代的Eden区内存不够时时发生MinorGC,老年代内存不够时发生FullGC

(5)方法区:存放类信息、静态变量、常量、运行时常量池等信息。

(2)类加载过程

bootstrapClassLoader:加载lib下的jar包和class文件

ExtClassLoader:加载lib/ext 下的jar包和class文件

AppClassLoader:加载自定义类

(2-1)双亲委任机制

从appclassloader往上调用classcload方法一直到bootstrap这一层,然后bootstrap检查是否执行加载方法,没有就往下传递是否执行加载方法。

(2-3)对象加载到被回收经历的过程

1.首先是字节码加载到方法区。

2.再根据类信息创建对象,对象首先会分配在堆区年轻代的eden区。

3.然后每当经过Minor GC后对存活就会在Survivor区来回复制,复制一次年龄加一,当年龄到15后就进入老年区。

4.老年区,如果经过FullGC被标记为清理对象,则对该对象进行清理。

(3)垃圾回收方法

1.标记清除法

先将需要回收的区域标记,然后再清除标记的区域,会产生不连续的内存空间。

2.标记压缩法

先将需要使用的区域进行标记,然后对这些区域进行移动连续的区域,最后清除区域以外的地方。

3.复制法

开辟一块相等的内存区域,将使用区域的占用的内存快复制到开辟的区域中然后将原区域全部清除。

(3-1)如何判断垃圾可以回收

1.引用计数法

计算每个对象的引用次数,为0时就会被回收。

2.可达性算法

从GCroot跟节点对象开始往下搜索对象,除了搜索路径以外的对象就是待回收的对象。

(3-2)GC(垃圾)回收机制

GC的目的实现内存的自动释放,使用可达性分析法判断对象是否可回收, 将堆分为新生代、老年代,新生代中采用复制算法,老年代采用标记压缩算法。当新生代内存不足时会发生minorGC,老年代不足时会发送fullGC

(3-3)STW

stop the word,将jvm内存冻结的一种状态,它会暂停除了特定线程以外的所有线程。比如垃圾回收时会暂停除GC线程以外的所有线程以便于安全的进行内存回收操作。

(4)jvm引用

强引用:内存溢出也不会回收

软引用:内存不足才回收

弱引用:每次垃圾回收都会回收

虚引用:一般用于垃圾回收动作

4.mySql

(1)sql注入:将sql代码添加到输入参数中传到服务器使其解析并且执行的一种攻击方式。

防范1:采用预编译的方式,将参数与变量进行绑定。

2:严格区分用户与管理员的权限。

(2)sql优化:

1.查询尽量使用字段而不是selec*

2.对于经常查询的字段建立索引

3.用varchar代替char

4.尽量用数字代替字符串

5.连接查询代替子查询

(3)基本操作

select table from where

insert into table values

update table set values

delete from table where

(4)索引

5.计算机网络

(1)结构5大层

物理层、数据链路层、网络层、传输层、应用层。

七大层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层

(2)三次握手:建立连接

(3)四次挥手:连接终止

(4)HTTP:超文本传输协议,它指定了客户端传给服务器什么样的消息以及得到什么样的响应。

(5)TCP:传输控制协议,面向连接的可靠的传输层通信协议。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值