java 基础
(1)List Map 遍历排序
List : 普通for循环,增强for循环,迭代器循环;实现comparator类,重写compare方法
query接口的List方法和iterate方法区别:list无法利用一级或者二级缓存,只能开启查询缓存,iterate方法可以充分利用缓存读取数据。
Map : keySet()循环遍历,entrySet()循环遍历,迭代器Iterator循环;
Map分类:HashMap(支持键值为null,不支持线程同步) Hashtable(不支持键值为null,支持线程同步,继承自Dictionary类)
LinkedHashMap(HashMap子类,保存了录入顺序) TreeMap(实现SortMap,能够保存的记录按照键排序,默认升序)
HashMap的扩容机制: Hashmap实际上是一个数组和链表的结合体。
当hashmap中的元素个数超过数组大小*loadFactor时,就会进行数组扩容,loadFactor的默认值为0.75,也就是说,默认情况下,
数组大小为16,那么当hashmap中元素个数超过16*0.75=12的时候,就把数组的大小扩展为2*16=32,即扩大一倍,然后重新计算每个元素在数组中的位置,
而这是一个非常消耗性能的操作,所以如果我们已经预知hashmap中元素的个数,那么预设元素的个数能够有效的提高hashmap的性能。
(2)多线程
一个程序就是一个进程,而一个程序中的多个任务则被称为线程。
进程是表示资源分配的基本单位,线程是进程中执行运算的最小单位,亦是调度运行的基本单位。
实现多线程编程的方式有两种,一种是继承 Thread 类,另一种是实现 Runnable 接口。
线程的状态:任何线程一般具有5种状态,即创建,就绪,运行,阻塞,终止。
创建:在程序中用构造方法创建了一个线程对象后,新的线程对象便处于新建状态,此时它已经有了相应的内存空间和其他资源,但还处于不可运行状态。
就绪:新建线程对象后,调用该线程的 start() 方法就可以启动线程。
运行:当就绪状态被调用并获得处理器资源时,线程就进入了运行状态。此时,自动调用该线程对象的 run() 方法。
阻塞:一个正在执行的线程在某些特殊情况下,如被人为挂起或需要执行耗时的输入/输出操作,会让 CPU 暂时中止自己的执行,进入阻塞状态。在可执行状态下,
如果调用sleep(),suspend(),wait() 等方法,线程都将进入阻塞状态,发生阻塞时线程不能进入排队队列,只有当引起阻塞的原因被消除后,线程才可以转入就绪状态。
sleep 是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复,调用sleep 不会释放对象锁。
wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
终止:线程调用 stop() 方法时或 run() 方法执行结束后,即处于死亡状态。
线程强制运行:在线程操作中,可以使用 join() 方法让一个线程强制运行,线程强制运行期间,其他线程无法运行,必须等待此线程完成之后才可以继续执行。
中断线程:当一个线程运行时,另外一个线程可以直接通过interrupt()方法中断其运行状态。
死锁:所谓死锁,就是两个线程都在等待对方先完成,造成程序的停滞,一般程序的死锁都是在程序运行时出现的。
线程池的优势:
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
线程池的真正实现类是ThreadPoolExecutor,ThreadPoolExecutor继承抽象类AbstractExecutorService,AbstractExecutorService实现接口ExecutorService,ExecutorService又继承接口Executor
ThreadPoolExecutor与ThreadPoolTaskExecutor区别:
ThreadPoolTaskExecutor是spring core包中的,而ThreadPoolExecutor是JDK中的JUC。ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。
ThreadPoolTaskExecutor源码中有一个用来初始化threadPoolExecutor的方法
可以用ThreadPoolTaskExecutor重写spring的异步注解@Async,使用自定义的线程池,而不是默认的
corePoolSize(必需):核心线程数。默认情况下,核心线程会一直存活,但是当将allowCoreThreadTimeout设置为true时,核心线程也会超时回收。
maximumPoolSize(必需):线程池所能容纳的最大线程数。当活跃线程数达到该数值后,后续的新任务将会阻塞。
keepAliveTime(必需):线程闲置超时时长。如果超过该时长,非核心线程就会被回收。如果将allowCoreThreadTimeout设置为true时,核心线程也会超时回收。
unit(必需):指定keepAliveTime参数的时间单位。常用的有:TimeUnit.MILLISECONDS(毫秒)、TimeUnit.SECONDS(秒)、TimeUnit.MINUTES(分)。
workQueue(必需):任务队列。通过线程池的execute()方法提交的Runnable对象将存储在该参数中。
threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。
handler(可选):拒绝策略。当达到最大线程数时需要执行的饱和策略。
(3)java单例模式几种实现方式
懒汉 :懒加载启动快,资源占用小,使用时才实例化,无锁。非线程安全。
饿汉 :饿汉模式天生是线程安全的,使用时没有延迟。启动时即创建实例,启动慢,有可能造成资源浪费。
静态内部类
枚举类
使用Singleton的好处还在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收(garbage collection)
(4)接口和抽象类的区别
抽象类只能继承一次,但是可以实现多个接口
接口和抽象类必须实现其中所有的方法,抽象类中如果有未实现的抽象方法,那么子类也需要定义为抽象类。抽象类中可以有非抽象的方法
接口中的变量必须用 public static final 修饰,并且需要给出初始值。所以实现类不能重新定义,也不能改变其值。
接口中的方法默认是 public abstract,也只能是这个类型。不能是 static,接口中的方法也不允许子类覆写,抽象类中允许有static 的方法
(5)java中==和eqauls()的区别?
(6)数据库特性
1.原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;成功必须要完全应用到数据库,失败则不能对数据库产生影响;
2.一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
3.隔离性:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不被其他事务的操作所...
4.持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便在数据库系统...
数据库性能优化:建立索引,优化sql语句,优化表结构,拆分表
java对于数据库性能优化:分页,缓存机制,使用临时表
优化原则:减少数据库访问,减少交互次数,返回更少数据,减少服务器CPU的开销
(7)四大作用域:
application作用域:所有作用域中范围最大的域,由于所有servlet共享一个servletcontext对象,所有多个servlet通过servletcontext可以实现数据在不同servlet之间的共享,是一个全局变量
httpsession作用域:范围第二大的域,(会话范围)在第一次调用request.getSession()方法时,服务器会检查是否已经有对应的session。如果没有,就在内存中创建一个session并返回。
servletRequest作用域:范围第三大的域,在整个请求链***享数据,最长用于在servlet中处理好的数据交给jsp显示,此时参数就可以放置在servletRequest域中带过去
PageContext作用域:范围最小的一个域,可以获取其他八大内置对象,可以认为是一个入口对象,能够获取其他所有域中的数据。
(8)九大内置对象
request 对象是 javax.servlet.httpServletRequest类型的对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
session 对象是由服务器自动创建的与用户请求相关的对象。
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应用中都有效。
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。
config 对象的主要作用是取得服务器的配置信息。
page 对象代表JSP本身,只有在JSP页面内才是合法的。
exception 对象
(9)IO介绍
同步:同步就是在发出一个调用时,在没有得到结果之前,该调用就不返回,但是一旦调用返回,就得到返回值了。简单的为:就是由*调用者*主动等待这个*调用*的结果。
异步:调用在发出之后,这个调用就直接返回了,所以没有返回结果
阻塞调用是指调用结果返回之前,当前线程会被挂起调用线程只有在得到结果之后才会返回
非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程
BIO:同步阻塞IO,一个线程处理一个连接,发起和处理IO请求都是同步的
NIO:同步非阻塞IO,简单理解:一个线程处理多个连接,发起IO请求是非阻塞的但处理IO请求是同步的
AIO:异步非阻塞IO,简单理解:一个有效请求一个线程,发起和处理IO请求都是异步的
(10)Mybatis
Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
#{}是预编译处理,${}是字符串替换。
(11)SSL
SSL(Secure Sockets Layer,安全套接层)是为网络通信提供安全及数据完整性的一种安全协议,SSL在网络传输层对网络连接进行加密.SSL协议位于TCP/IP协议与各种应用层协议之间,
为数据通信提供安全支持.SSL协议可分为两层:SSL记录协议(SSL RecordProtocol),它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持.
SSL握手协议(SSLHandshake Protocol),它建立在SSL记录协议之上,用于在实际数据传输开始前,通信双方进行身份认证、协商加密算法、交换加密密钥等。
(12)java与javascript区别:
出处:java是Sun Microsystems公司推出 , javascript是NetScape推出的。
基于对象和面向对象:java是一种真正面向对象的语言,javascript是脚本语言,它可以用来制作与网络无关的,与用户交互的复杂软件。
(13)基本类型 : int char byte long double float boolean short
封装类:Integer Character Long Double Float Boolean Short
String 不是基本类型数据 它属于final类型
(14)Array与ArrayList区别:
Array可以包含基本类型和对象类型,ArrayList只能包含对象类型,并且大小是可以变化的。
(15)关键字:
final:修饰的类不能被继承,修饰的方法不能被改变,修饰的变量,基本数据类型不能更改,引用类型初始化后不能让其指向另一个对象。
Synchronized : 修饰一个方法或者代码块的时候,能够保证再同一时刻最多只有一个线程执行该代码。
lock: 是一个接口,可以锁定线程,通过unlock释放锁
(16)面向对象特性:
抽象——就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。
多态性是指允许不同类的对象对同一消息作出响应。
重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。
重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。
面向对象6原则1法则:
单一职责原则:一个类只做它该做的事情。
开闭原则:软件实体应当对扩展开放,对修改关闭。
依赖倒转原则:面向接口编程。
里氏替换原则:任何时候都可以用子类型替换掉父类型。
接口隔离原则:接口要小而专,绝不能大而全。
合成聚合复用原则:优先使用聚合或合成关系复用代码。
迪米特法则:迪米特法则又叫最少知识原则,一个对象应当对其他对象有尽可能少的了解。
(17)equals,hashcode区别与联系:
相等的对象必须有相同的哈希码:想象一下,假如两个Java对象A和B,A和B相等(eqauls结果为true),但A和B的哈希码不同,则A和B存入HashMap时的哈希码计算得到的HashMap内部数组位置索引可能不同,那么A和B很有可能允许同时存入HashMap,
显然相等/相同的元素是不允许同时存入HashMap,HashMap不允许存放重复元素。
如果两个对象的hashCode相同,它们并不一定相同:也就是说,不同对象的hashCode可能相同;假如两个Java对象A和B,A和B不相等(eqauls结果为false),但A和B的哈希码相等,将A和B都存入HashMap时会发生哈希冲突,也就是A和B存放在HashMap内部数组的位置索引相同这时HashMap会在该位置建立一个链接表,
将A和B串起来放在该位置,显然,该情况不违反HashMap的使用原则,是允许的。当然,哈希冲突越少越好,尽量采用好的哈希算法以避免哈希冲突。
(18)java反射机制:Java的反射机制允许编程人员在对类未知的情况下,获取类相关信息的方式变得更加多样灵活,调用类中相应方法,是Java增加其灵活性与动态性的一种机制。
反射这一概念最早由编程开发人员Smith在1982年提出,主要指应用程序访问、检测、修改自身状态与行为的能力。
Field类:提供有关类或接口的属性的信息,以及对它的动态访问权限。反射的字段可能是一个类(静态)属性或实例属性,简单的理解可以把它看成一个封装反射类的属性的类。
Constructor类:提供关于类的单个构造方法的信息以及对它的访问权限。这个类和Field类不同,Field类封装了反射类的属性,而Constructor类则封装了反射类的构造方法。
Method类:提供关于类或接口上单独某个方法的信息。所反映的方法可能是类方法或实例方法(包括抽象方法)。 这个类不难理解,它是用来封装反射类方法的一个类。
Class类:类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。
Object类:每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
优点:使用反射,我们就可以在运行时获得类的各种内容,进行反编译,对于Java这种先编译再运行的语言,
能够让我们很方便的创建灵活的代码,这些代码可以在运行时装配,无需在组件之间进行源代码的链接,更加容易实现面向对象。
缺点:(1)反射会消耗一定的系统资源,因此,如果不需要动态地创建一个对象,那么就不需要用反射;
(2)反射调用方法时可以忽略权限检查,因此可能会破坏封装性而导致安全问题。
(19)java内部类:内部类就是在一个类内部进行其他类结构的嵌套操作。
内部类的优点:
内部类与外部类可以方便的访问彼此的私有域(包括私有方法、私有属性)。
内部类是另外一种封装,对外部的其他类隐藏。
内部类可以实现java的单继承局限
缺点:结构复杂
(20)java值传递与引用传递
值传递:在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,
因此在方法内对形参的任何操作,都仅仅是对这个副本的操作,不影响原始值的内容。
引用传递:”引用”也就是指向真实内容的地址值,在方法调用时,实参的地址通过方法调用被传递给相应的形参,在方法体内,
形参和实参指向同一块内存地址,对形参的操作会影响的真实内容。
(21)abstract interface 区别:
1.相同点
A. 两者都是抽象类,都不能实例化。
B. interface实现类及abstrctclass的子类都必须要实现已经声明的抽象方法。
2. 不同点
A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
C. interface强调特定功能的实现,而abstractclass强调所属关系。
D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration,没有方法体),
实现类必须要实现。而abstractclass的子类可以有选择地实现。
(22)final finally finalize 区别:
final :修饰的类不能被继承,修饰的方法不能被改变,修饰的变量,基本数据类型不能更改,引用类型初始化后不能让其指向另一个对象。
finally :异常处理的一部分,总是执行
finalize:是Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法。
(23)泛型:其本质是参数化类型,也就是说所操作的数据类型被指定为一个参数(type parameter)这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
(24)java1.8新特性
Lambda 表达式 − Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。
默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
Date Time API − 加强对日期与时间的处理。
Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。
spring MVC
spring Boot
spring Cloud
Spring Cloud是一系列框架的有序集合。
它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包
eureka服务注册中心,服务提供者,服务消费者
Spring Cloud 优缺点
其主要优点有:
集大成者,Spring Cloud 包含了微服务架构的方方面面。
约定优于配置,基于注解,没有配置文件。
轻量级组件,Spring Cloud 整合的组件大多比较轻量级,且都是各自领域的佼佼者。
开发简便,Spring Cloud 对各个组件进行了大量的封装,从而简化了开发。
开发灵活,Spring Cloud 的组件都是解耦的,开发人员可以灵活按需选择组件。
接下来,我们看下它的缺点:
项目结构复杂,每一个组件或者每一个服务都需要创建一个项目。
部署门槛高,项目部署需要配合 Docker 等容器技术进行集群部署,而要想深入了解 Docker,学习成本高。
@EnableEurekaServer 声明这个是eureka服务器
@EnableDiscoveryClient //也可以用EnableDiscoveryClient代替,前者兼容性更大,后者仅能兼容Eureka
Git
敏捷
英语
全部评论
(1) 回帖