ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

中级Java知识点

2021-02-07 15:58:39  阅读:157  来源: 互联网

标签:知识点 中级 缓存 Java 数据库 redis 线程 使用 服务器


中级Java知识点

Java 基本类型哪些,所占字节

byte :1 个字节
short :2 个字节
char :2 个字节
int :4 个字节
long :8 个字节
float :4 个字节
double :8 个字节

java 集合以及底层原理

Java 集合框架的根接口有 Collection 和 Map。Collection 根接口包含 List 和 Set 二个子接口。

List 接口
它的特点是:元素有序、且可重复,主要包含三个实现类:ArrayList,vector,LinkedList
ArrayList 的特点:底层是数组,线程不安全,查找快,增删慢(数组的特点)。
ArrayList 的底层实现原理:通过 ArrrayList 空参构造器创建对象。
底层创建一个长度为 10 的数组,当我们向数组中添加 11 个元素时,底层会进行扩容,扩容为原来的 1.5 倍
(创建一个新的数组,长度为原数组长度的 1.5 倍,将原数组复制到新数组中)。
vector 的特点:古老的实现类,底层是数组,线程安全的,JDK1.0 就有了,Vector 总是比 ArrayList 慢,所以尽量
避免使用。
LinkedList 的特点:底层是使用双向链表。增删快,查找慢。

Set 接口

它的特点:
无序性:通过 HashCode 方法算出的值来决定在数组中存放的位置;
不可重复性:进行 equals 方法比较,结果为 true 则两个数据相同,若为 false 则不同。
主要包含三个实现类:HashSet,LinkedHashSet,TreeSet
HashSet 特点:线程不安全,集合元素可以为 null,不能保证元素的排列顺序

HashSet 的底层实现原理:
当向 HashSet 添加数据时,首先调用 HashCode 方法决定数据存放在数组中的位置,该位置上没有其他元素,则将数据直接存放,若该位置上有其他元素,调用 equals 方法进行比较。若返回 true 则认为两个数据相同,若返回 false,则以链表的形式将该数据存在该位置上,(jdk1.8)如果数量达到 8 则将链表换成红黑树。

HashSet 的底层就是一个 HashMap,向 HashSet 中添加的数据实际上添加到了 HashMap 中的 key 里。
所以 HashMap 的 key 可以看成是 Set 的集合。

LinkedHashSet 特点:继承了 HashSet,底层实现原理和 HashSet 一样,可以安照元素添加的顺序进行遍历根据元素的 hashCode 值来决定元素的存储位置,它维护了一张链表该链表记录了元素添加的顺序。底层就是一个 LinkedHashMap。

TreeSet 特点:底层为红黑树;可以安照指定的元素进行排序;TreeSet 中的元素类型必须保持一致,
底层就是 TreeMap。TreeSet 必须(自然排序)实现 Comparable 接口,重写 compareTo()方法,
按照某个属性进行排序,相结合添加元素或(定制排序)创建一个 Comparator 实现类的对象,
并传入到 TreeSet 的构造器中,按照某个属性进行排序,向集合添加元素。定制排序比自然排序灵活。
如果即有自然排序又有定制排序谁起作用? 定制排序

Map 接口

Map 的特点:
Map 存储的是键值对(key,value),Map 中的 key 是无序的且不可重复的,所有的 key 可以看成是一个 set 集合。

Map 中的 key 如果是自定义类的对象必须重写 hashCode 和 equals 方法,Map 中的 value 是无序的可重复的,所有的 value 可以看成是 Collection 集合,Map 中的 value 如果是自定义类的对象必须重写 equals 方法,Map 中的键值对可以看成是一个一个的 Entry.Entry 所存放的位置是由 key 来决定的。
Entry 是无序的不可重复的。主要的实现类:HashMap,LinkedHashMap,TreeMap,HashTable.

HashMap 特点
1.底层是一个数组 + 链表 + 红黑树(jdk1.8)
2.数组的类型是一个 Node 类型
3.Node 中有 key 和 value 的属性
4.根据 key 的 hashCode 方法来决定 Node 存放的位置
5.线程不安全的 ,可以存放 null

HashMap 的底层实现原理:
当我们向 HashMap 中存放一个元素(k1,v1),先根据 k1 的 hashCode 方法来决定在数组中存放的位置。
如果该位置没有其它元素则将(k1,v1)直接放入数组中,如果该位置已经有其它元素(k2,v2),调用k1 的equals方法和 k2 进行比较。

如果结果为 true 则用 v1 替换 v2,如果返回值为 false 则以链表的形式将(k1,v1)存放, 当元素达到 8 时则会将链表替换成红黑树以提高查找效率。

HashMap 的构造器:new HashMap() :创建一个容量为 16 的数组,加载因子为 0.75。
当我们添加的数据超过 12 时底层会进行扩容,扩容为原来的 2 倍。

LinkedHashMap:继承了 HashMap 底层实现和 HashMap 一样. 可以安照元素添加的顺序进行遍历底层维护了一张链表用来记录元素添加的顺序。

TreeMap 特点:可以对 Key 中的元素安照指定的顺序进行排序 ( 不能对 value 进行排序)

HashTable 特点:线程安全的 ,不可以存放 null,map 中的 key 不能重复,如果有重复的,后者的 value 覆盖前者的 value

四大作用域和九大内置对象

四大作用域:
page :当前页面有效时间最短(页面执行期)
request :HTTP 请求开始到结束这段时间
session :HTTP 会话开始到结束这段时间
application :服务器启动到停止这段时间

九大内置对象:
request :请求对象 作用域 Request
response :响应对象 作用域 Page
pageContext :页面上下文对象 作用域 Page
session :会话对象 作用域 Session
application :应用程序对象 作用域 Application
out :输出对象 作用域 Page
config :配置对象 作用域 Page
page :页面对象 作用域 Page
exception :例外对象 作用域 page

jsp 和 servlet 的区别

1.jsp 经编译后就变成了 Servlet.(JSP 的本质就是 Servlet,JVM 只能识别 java 的类,
不能识别 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 能够识别的 java 类)
2.jsp 更擅长表现于页面显示,servlet 更擅长于逻辑控制.
3.Servlet 中没有内置对象,Jsp 中的内置对象都是必须通过 HttpServletRequest 象,
HttpServletResponse 对象以及 HttpServlet 对象得到.
Jsp 是 Servlet 的一种简化,使用 Jsp 只需要完成程序员需要输出到客户端的内容,Jsp 中的 Java 脚本如何镶嵌
到一个类中,由 Jsp 容器完成。
而 Servlet 则是个完整的 Java 类,这个类的 Service 方法用于生成对客户端的响应。

servlet 生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
加载(服务器启动时,会到 web.xml 文件中去找到 Servlet 文件的配置并创建 servlet 的实例) →初始化(init()此方法只执行一次) →执行(service(),doGet(),doPost()) →销毁(销毁 destory())
service(): 方法本身包含了 doGet()和 doPost().如果服务器发现了 service()方法,则不再执行 doGet(),doPost(). 一般不建议去重写父类的 service 方法.因为重写了此方法 doGet 方法和 doPost 方法将得不到利用. 没有 service()方法默认执行 doGet()方法.

cookie 和 session 区别以及 JWT 与 Session 的差异

1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方
面,应当使用 cookie。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
5、可以考虑将登陆信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。
1.Session 是在服务器端的,而 JWT 是在客户端的。
2.Session 方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。
3.JWT 方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。
4.Session 的状态是存储在服务器端,客户端只有 session id;而 Token 的状态是存储在客户端。

JWT 与 OAuth 的区别

OAuth2 是一种授权框架 ,JWT 是一种认证协议。
无论使用哪种方式切记用 HTTPS 来保证数据的安全性
OAuth2 用在使用第三方账号登录的情况(比如使用 weibo, qq, github 登录某个 app)
JWT 是用在前后端分离, 需要简单的对后台 API 进行保护时使用。

**Cookie 和 LocalStorage 和 sessionStorage 的区别
在这里插入图片描述

转发和重定向的区别**

转发:浏览器地址栏不变,1 次请求,request 请求,可以访问 web-inf,可以共享 request 请求域
数据,只能跳转工程内的资源
重定向:浏览器变化,2 次请求,response 响应,不能访问 web-inf,不可以共享 request 请求域数
据,可以跳转任意资源

饿汉于懒汉单例模式

单例模式设计:
第一步:私有化构造器
第二步:提供一个公共静态返回该类实例对象的方法

饿汉式:先初始化对象,Single 类一进内存,就已经创建好了对象。
class Single{
private Single(){}
private static Single s=new Single();
public static Single getInstance()
{
return s;
}
}

懒汉式:对象是方法被调用时,才初始化,也叫做对象的延时加载。
class Single{ //Single 类进内存,对象还没存在,只有调用了 getInstance 方法时,才建立对象
private Single(){}
private static Single s=null;
public static synchronize Single getInstance()
{
if(s==null){
s=new single();
}
return s;
}
}
操作共享的数据有多条,会出现线程安全问题,在方法加一个同步

过滤器和拦截器的区别

①拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。
②拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。
③拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。
④拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。
⑤在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
⑥拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,这点很重要,在拦截器里注入一个 service,可以调用业务逻辑。

#和$的区别

#{}和${}的区别
#{} 在 mapper 的配置文件的 sql 语句中,它是占位符, 相当于 ? 号。
${} 在 mapper 的配置文件的 sql 语句中,它是原样输出变量的值,然后以字符串拼接的功能进行操作。
${} 中只能写 value,或者是@Param 命名参数后的参数名称
在输出参数的时候,我们并不推荐使用 ${} 来输出。因为可能会导至 sql 注入问题的存在。

什么是 SQL 注入?

如果 SQL 是根据用户输入拼出来,如果用户故意输入可以让后台解析失败的字符串,这就是 SQL 注入
例如,用户在输入密码的时候,输入’ or 1=1’, 这样,后台的程序在解析的时候,拼成的 SQL 语句,可能是这样的:
select count(1) from tab where user=userinput and pass=’’ or 1=1;
看这条语句,可以知道,在解析之后,用户没有输入密码,加了一个恒等的条件 1=1,这样,这段 SQL 执行的时候,返回的 count 值肯定大于 1 的,如果程序的逻辑没加过多的判断,这样就能够使用用户名 userinput 登陆,而不需要密码。
防止 SQL 注入,首先要对密码输入中的单引号进行过滤,再在后面加其它的逻辑判断,或者不用这样的动态 SQL 拼。

&&和&与|和||的区别?

&和&&的区别?
&和&&左边的式子为 true 的时候,右边的式子都会执行。
左边的式子为 false 的时候。&右边的式子仍然会执行。&&右边的式子将不再执行。

|和||的区别?

|和||左边的式子为 false 的时候,右边的式子都会执行。
左边的式子为 true 的时候。|右边的式子仍然会执行。||右边的式子将不再执行。

final finally finalize 区别?

final 修饰符,用来修饰变量,方法和类,分别表示属性不可变,方法不可被重写,类不可被继承,finally 是异常语
句中处理语句, 表示总是执行;finalize 表示在垃圾回收机制时使该对象状态恢复的方法

int 和 Integer 的区别?
1、Integer 是 int 的包装类,int 则是 java 的一种基本数据类型
2、Integer 变量必须实例化后才能使用,而 int 变量不需要
3、Integer 实际是对象的引用,当 new 一个 Integer 时,实际上是生成一个指针指向此对象;而 int 则是直接存
储数据值
4、Integer 的默认值是 null,int 的默认值是 0

equals 与==的区别?
:如果两边是基本数据类型,那么比较的是具体的值。如果==两边是引用数据类型,那么比较的是地址值。
(两个对象是否指向同一块内存)
equals:如果没有重写 equals 方法那么调用的是 Object 中的 equals 方法,比较的是地址值。
如果重写了 euqlas 方法(比属性内容)那么就比较的是对象中属性的内容。

StringBuff 和 StringBuilder 及 String 区别?

String 类是不可变类,任何对 String 的改变都会引发新的 String 对象的生成;
StringBuffer 是可变类,任何对它所指代的字符串的改变都不会产生新的对象,线程安全的。
StringBuilder 是可变类,线性不安全的,不支持并发操作,不适合多线程中使用,但其在单线程中的性能比StringBuffer 高。

Override 和 Overload 的含义去区别?

1. Override 特点
1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、方法被定义为 final 不能被重写。
5、对于继承来说,如果某一方法在父类中是访问权限是 private,那么就不能在子类对其进行重写覆盖,如果定义
的话,
也只是定义了一个新方法,而不会达到重写覆盖的效果。(通常存在于父类和子类之间。)

2.Overload 特点
1、在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序
当然,同一方法内的几个参数类型必须不一样,例如可以是 fun(int, float), 但是不能为 fun(int, int)
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
4、重载事件通常发生在同一个类中,不同方法之间的现象。
5、存在于同一类中,但是只有虚方法和抽象方法才能被覆写。

抽象类和接口及普通类的区别?

1、抽象类和接口都不能直接实例化,如果要实例化,抽象类变量必须指向实现所有抽象方法的子类对象,
接口变量必须指向实现所有接口方法的类对象。
2、抽象类要被子类继承,接口要被类实现。
3、接口只能做方法申明,抽象类中可以做方法申明,也可以做方法实现
4、接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。
5、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。
同样,一个实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。
6、抽象方法只能申明,不能实现,接口是设计的结果 ,抽象类是重构的结果
7、抽象类里可以没有抽象方法
8、如果一个类里有抽象方法,那么这个类只能是抽象类
9、抽象方法要被实现,所以不能是静态的,也不能是私有的。
10、接口可继承接口,并可多继承接口,但类只能单根继承。 堆和栈的区别?

一.堆栈空间分配区别:

1.栈(操作系统):由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构
中的栈;
2.堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由 OS 回收,分配方式倒是类似于
链表。

二.堆栈缓存方式区别:

1.栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放;
2.堆是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。
所以调用这些对象的速度要相对来得低一些。

三.堆栈数据结构区别:

堆(数据结构):堆可以被看成是一棵树,如:堆排序;
栈(数据结构):一种先进后出的数据结构。

Spring Bean 生命周期

 实例化 bean 对象
 设置对象属性
 检查 Aware 相关接口并设置相关依赖
 BeanPostPreocessor 前置处理
 检查是否是 InitialliziingBean 以决定是否调用 afterPropertesSet 方法
 检查是否配置有自定义的 init-method
 BeanPostProcessor 后置处理
 注册必要的 Destrunction 相关回调接口
 使用中
 是否实现 DisposableBean 接口
 是否配置有自定义的 Destory 方法

JDK、JRE、JVM 的区别?

JDK ( Java 开发工具包)= JRE(Java 运行环境) + 开发工具集(例如 Javac 编译工具等)
JRE (Java 运行环境)= JVM (Java 虚拟机)+ Java SE 标准类库

值传递和引用传递的区别?

值传递:会创建副本,函数中无法改变原始对象
引用传递:不会创建副本,函数中可以改变原始对象
值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。
引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,
在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的
值。

4 种访问控制符区别?
访问权限 类 包 子类 其他包
public ∨ ∨ ∨ ∨
protect ∨ ∨ ∨ ×
default ∨ ∨ × ×
private ∨ × × ×

装箱和拆箱,类型转换

装箱:值类型转换为引用对象,一般是转换为 System.Object 类型或值类型实现的接口引用类型;
拆箱:引用类型转换为值类型,注意,这里的引用类型只能是被装箱的引用类型对象;
拆箱与装箱就是值类型与引用类型的转换

throw 和 throws 区别

throw 代表动作,表示抛出一个异常的动作;
throws 代表一种状态,代表方法可能有异常抛出;
throw 用在方法实现中,而 throws 用在方法声明中;
throw 只能用于抛出一种异常,而 throws 可以抛出多个异常。

PreparedStatement 比 Statement 区别?

第一:statement 执行的 SQL 语句必须是一个完整的 SQL,而对于 PreparedStatement 来说,可以使用“?”
作为
SQL 语句当中的占位符,然后使用 PreparedStatement 的 setXXX 方法来给占位符赋值,最后在执行;
第二:使用 Statement 时,如果 SQL 当中出现了“‘”或者“-”等符号时,需要使用转义字符来进行转义,而在
PreparedStatement 当中,如果占位符的值当中有这些符号,PreparedStatement 会自动的进行转义;
第三:PreparedStatement 会讲 SQL 语句进行预编译,每次执行的时候只需要将参数设置给相应的占位符就可以运行。而使用 Statement 时,SQL 语句时每次都要进行编译,所以 PreparedStatement 的效率相对较高。

doGet()方法和 doPost()方法区别?

get 方式 参数在地址栏中显示 通过?name=""&id=""这种形式传递的 不安全 只能传递 2kb 的能容
post 方式 底层是通过流的形式传递 不限制大小 上传的时候必须用 Post 方式
doGet:路径传参。效率高,安全性差
doPOST:实体传参。效率第,安全性好

null 和 undefind 的区别?

undefined 是访问一个未初始化的变量时返回的值,而 null 是访问一个尚未存在的对象时所返回的
值。

Error 和 Exception 的区别?

Error(错误)是系统中的错误,程序员是不能改变的和处理的,是在程序编译时出现的错误,只能通过修改程序才能修正。
一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。
对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
Exception(异常)表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

阻塞和非阻塞以及同步和异步的区别?

  1. 同步,就是我调用一个功能,该功能没有结束前,我死等结果。
  2. 异步,就是我调用一个功能,不需要知道该功能结果,该功能有结果后通知我(回调通知)
  3. 阻塞,就是调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。
  4. 非阻塞,就是调用我(函数),我(函数)立即返回,通过 select 通知调用者
    同步 IO 和异步 IO 的区别就在于:数据拷贝的时候进程是否阻塞
    阻塞 IO 和非阻塞 IO 的区别就在于:应用程序的调用是否立即返回

Ajax 异步和同步

 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。
 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。

  1. 同步通信方式要求通信双方以相同的时钟频率进行,而且准确协调,通过共享一个单个时钟或定时脉冲
    源保证发送方和接收方的准确同步,效率较高;
  2. 异步通信方式不要求双方同步,收发方可采用各自的时钟源,双方遵循异步的通信协议,以字符为数据
    传输单位,发送方传送字符的时间间隔不确定,发送效率比同步传送效率低。 使用者可以同步或异步实现服务调用。从使用者的观点来看,这两种方式的不同之处在于:
     同步——使用者通过单个线程调用服务;该线程发送请求,在服务运行时阻塞,并且等待响应。
     异步——使用者通过两个线程调用服务;一个线程发送请求,而另一个单独的线程接收响应。

事务的 ACID 和事务的隔离性?
1)原子性(Atomic):事务中各项操作,要么全做要么全不做,任何一项操作的失败都会导致整个事务的失败;
2)一致性(Consistent):事务结束后系统状态是一致的;
3)隔离性(Isolated):并发执行的事务彼此无法看到对方的中间状态;
4)持久性(Durable):事务完成后所做的改动都会被持久化,即使发生灾难性的失败。通过日志和同步备份可以在故障发生后重建数据。

脏读:事务 A 读到了事务 B 未提交的数据。
不可重复读:事务 A 第一次查询得到一行记录 row1,事务 B 提交修改后,事务 A 第二次查询得到 row1,但列内容发生了变化,侧重于次数,侧重于 update

幻读:事务 A 第一次查询得到一行记录 row1,事务 B 提交修改后,事务 A 第二次查询得到两行记录 row1 和 row2,侧重于内容,侧重于 insert

线程的 sleep 和 wait 区别?
sleep()不释放同步锁,wait()释放同步锁.
sleep 可以用时间指定来使他自动醒过来,如果时间不到你只能调用 interreput()来强行打断;
wait()可以用 notify()直接唤起.

sleep 和 wait 的区别还有:
1。这两个方法来自不同的类分别是 Thread 和 Object
2。最主要是 sleep 方法没有释放锁,而 wait 方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3。wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可以在任何地方使用线程的状态(阶段)?
创建、就绪、运行、阻塞、终止。
1、新建状态(New):新创建了一个线程对象。
2、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的 start()方法。该状态的线程位于“可运行线程池”中变得可运行,只等待获取 CPU 的使用权。即在就绪状态的进程除 CPU 之外,其它的运行所需资源都已全部获得。
3、运行状态(Running):就绪状态的线程获取了 CPU,执行程序代码。
4、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

http 和 https 的区别?
1、https 协议需要到 ca 申请证书,一般免费证书较少,因而需要一定费用。
2、http 是超文本传输协议,信息是明文传输,https 则是具有安全性的 ssl 加密传输协议。
3、http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443。
4、http 的连接很简单,是无状态的;HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 http 协议安全。

常见的运行时异常?
NullPointerException - 空指针引用异常
ClassCastException - 类型强制转换异常。
IllegalArgumentException - 传递非法参数异常。
ArithmeticException - 算术运算异常
ArrayStoreException - 向数组中存放与声明类型不兼容对象异常
IndexOutOfBoundsException - 下标越界异常
NegativeArraySizeException - 创建一个大小为负数的数组错误异常
NumberFormatException - 数字格式异常
SecurityException - 安全异常
UnsupportedOperationException - 不支持的操作异常

BIO 和 NIO 区别?
互联网 强调的是信息/数据在网络之间的流通,
BIO:堵塞式 IO,相当于轮船运输
NIO:非堵塞式 IO:面向缓冲区(buffer),基于通道(chanel)的 io 操作,相当于火车运输,效率高
文件->双向通道((缓冲区))->程序

http 常见的状态码
200 OK //客户端请求成功
302 found //重定向
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的 URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable//服务器当前不能处理客户端的请求,一段时间后可能恢复正常

Hashmap 为什么线程不安全,如何让它线程安全
HashMap 在 put 的时候,插入的元素超过了容量(由负载因子决定)的范围就会触发扩容操作,就
是 rehash,这个会重新将原数组的内容重新 hash 到新的扩容数组中,在多线程的环境下,存在同
时其他的元素也在进行 put 操作,如果 hash 值相同,可能出现同时在同一数组下用链表表示,造
成闭环,导致在 get 时会出现死循环,所以 HashMap 是线程不安全的。
 使用 java.util.Hashtable 类,此类是线程安全的。
 使用 java.util.concurrent.ConcurrentHashMap,此类是线程安全的。
 使用 java.util.Collections.synchronizedMap() 方法包装 HashMap object,得到线程安全的 Map,并在此 Map上进行操作。 怎么加快程序访问速度
硬件上:加大网络带宽、和服务器内存
代码的处理:静态页面、缓存、优化 sql、创建索引等方案

怎样进行程序性能调优
系统性能就是两个事:
 Throughput ,吞吐量。也就是每秒钟可以处理的请求数,任务数。
 Latency,系统延迟。系统在处理一个请求或一个任务时的延迟。那么 Latency 越好,能支持的 Throughput就会越高。因为 Latency 短说明处理速度快,于是就可以处理更多的请求。 解决方案:
 提高吞吐量:分布式集群,模块解藕,设计模式
 系统延迟:异步通信

冒泡排序和自然排序及定制排序怎么实现的或者手写出来
冒泡排序
int[] arr={6,3,8,2,9,1};
System.out.println(“排序前数组为:”);
for(int num:arr){
System.out.print(num+" “);
}
for(int i=0;i<arr.length-1;i++){//外层循环控制排序趟数
for(int j=0;j<arr.length-1-i;j++){//内层循环控制每一趟排序多少次
if(arr[j]>arr[j+1]){
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
System.out.println();
System.out.println(“排序后的数组为:”);
for(int num:arr){
System.out.print(num+” ");
}
自然排序
1、定义一个类(文章中为 Employee)实现 Comparable 接口
2、重写 Comparable 接口中的 compareTo()方法
3、在 compareTo()中按指定属性进行排序
public class Employee implements Comparable{
public int compareTo(Object o) {
if (o instanceof Employee) {
Employee e = (Employee) o;
return this.name.compareTo(e.name);//按 name 进行排序
}
return 0;
}
}
定制排序
1.创建一个 Compartor 实现类的对象,并传入到 TreeSet 的构造器中
2.重写 compare 方法
3.安照某个属性进行排序
4.向集合中添加元素
TreeSet set = new TreeSet(new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Student && o2 instanceof Student) {
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int s = s1.getAge() - s2.getAge();
if(s == 0) {
return s1.getName().compareTo(s2.getName());
}
return s;
}
return 0;
}
});
set.add(new Student(“aaa”, 18));
set.add(new Student(“bbb”, 8));
set.add(new Student(“fff”, 38));
set.add(new Student(“ccc”, 28));
System.out.println(set);

在使用定制排序或是自然排序时,在其用到的类中都要重写 hashCode()与 equals()方法

三种遍历方式?
第一种遍历方法和输出结果。
for(int i=1,i<list.size(),i++){
System.out.println(list.get(i));
}
第二种用 foreach 循环。加强型 for 循环。推荐方式。
for(String string:list){
System.out.println(string);
}
第三钟迭代器
List list=new ArrayList<>();
list.add(“abc”);
list.add(“ghi”);
for(Iterator it=list.iterator();it.hasNext()

标签:知识点,中级,缓存,Java,数据库,redis,线程,使用,服务器
来源: https://blog.csdn.net/qq_25288617/article/details/113741959

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有