SSM框架之初体验,Java面试知识点计算

作者:云顶最新线路检测

一:ClassLoader

从JVM结构图中能够看见,类加载器的功用是将Java类文件加载到Java设想机。

图片 1HotSpot JVM结构,图片来自Java Garbage Collection Basics

除非当类被加载进虚构机内部存款和储蓄器,本领应用相应的类。

在Java中,类加载进度大约分为以下几步:

  1. 因而全限类名获取类文件字节数组。可来自地点文件、jar包、互连网等。
  2. 在方法区/元空间保存类的描述音信、静态属性。
  3. 在JVM堆中生成二个对应的java.lang.Class对象。

清楚Java的类加载机制,对领会JVM有相当大帮忙。

BootStrap是基于HTML,CSS,JavaScript开采的前端框架,效果很彪悍。

聚拢承接包涵图

  1. Collection vs Collections

先是,"Collection" and "Collections"是多少个不等的定义,从底下的存续关系图中大家能够看出,"Collection"是四个基础接口类,而"Collections"是三个静态的类,它提供了一些静态方法来操作某个集结类型。

图片 2image

  1. 汇聚的类承袭关系图

下图表达了聚众的存在延续关系。

图片 3image

  1. Map的三翻五次关系图

    图片 4image

暑假随即导师共同念书SSM框架,对于初学者的话,课堂上学的那一点java知识,此时来得如此缺乏,也倍感知识的青黄不接,跟着网络的学科完成了二个简单的CRUD作用的音信用保证管项目,仅此为方今的上学做个总结。

做事一度有一段时间了,最近备选把本人的技巧栈举行梳理一下,方便查漏补缺。这一份技能路线图会不按期更新。有题目标地点,也招待大家在批评区建议意见。

二:Java暗许的类加载器

Java私下认可提供三个类加载器,分别为:

  • Bootstrap ClassLoader
  • Extension ClassLoader
  • App ClassLoader

Bootstrap ClassLoader 担当加载Java基础类,主要是 %JRE_HOME%/lib/ 目录下的rt.jar、resources.jar、charsets.jar等。

Extension ClassLoader 担负加载Java扩张类,首纵然 %JRE_HOME%/lib/ext 目录下的jar。

App ClassLoader 担当加载当前选择的ClassPath中的全数类。

四个ClassLoader所担当加载的类,能够通过以下办法举办查看。

public class ClassPath { public static void main(String[] args) { System.out.println("Bootstrap ClassLoader path: "); System.out.println(System.getProperty("sun.boot.class.path")); System.out.println("----------------------------"); System.out.println("Extension ClassLoader path: "); System.out.println(System.getProperty("java.ext.dirs")); System.out.println("----------------------------"); System.out.println("App ClassLoader path: "); System.out.println(System.getProperty("java.class.path")); System.out.println("----------------------------"); }}

实际原因,在源码深入分析章节表达。

其中Bootstrap ClassLoader是JVM级别的,由C++撰写。

Extension ClassLoader和App ClassLoader都是Java类。

JVM运维Bootstrap ClassLoader,然后开端化sun.misc.Launcher。

接着,Launcher初始化Extension ClassLoader和App ClassLoader。

情形搭建

BootStrap下载地址JQuery下载地址

图片 5图片 6

<!DOCTYPE html><html> <head> <title>Demo</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jquery-3.3.1.js" ></script> <script src="js/bootstrap.min.js"></script> </head></html>注意引入的顺序

BootStrap提供了大批量的大局样式,基本的HTML元素均可以透过class设置样式并获取进步功能。

ArrayList如何达成排序?

// 排序方法 //ArrayList.class public void sort(Comparator<? super E> c) { final int expectedModCount = modCount; Arrays.sort elementData, 0, size, c); if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } modCount++; } //Array.class 实现比较接口 public static <T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) { // 如果没有实现比较方法 if (c == null) { sort(a, fromIndex, toIndex); } else { rangeCheck(a.length, fromIndex, toIndex); if (Arrays.LegacyMergeSort.userRequested) legacyMergeSort(a, fromIndex, toIndex, c); else TimSort.sort(a, fromIndex, toIndex, c, null, 0, 0); } }//Array.class 未实现比较接口 public static void sort(Object[] a, int fromIndex, int toIndex) { rangeCheck(a.length, fromIndex, toIndex); //经查资料,这是个传统的归并排序,需要通过设置系统属性后,才能进行调用 // System.setProperty("java.util.Arrays.useLegacyMergeSort", "true"); if (Arrays.LegacyMergeSort.userRequested) legacyMergeSort(a, fromIndex, toIndex); else ComparableTimSort.sort(a, fromIndex, toIndex, null, 0, 0); }

底层是一种价值观归并排序。

SSM=Spring + Spring MVC + Mybatis ,是正式的MVC方式,将全方位系统划分为展现层,controller层,service层,DAO层四层,使用spring MVC肩负哀告的转会和视图管理,spring达成业务对象管理,mybatis作为数据对象的长久化引擎。

图片 7Web 开采者才干渠道图.png

三:源码深入分析

sun.misc.Launcher类是Java程序的输入。

其构造器如下:

public Launcher() { Launcher.ExtClassLoader var1; try { var1 = Launcher.ExtClassLoader.getExtClassLoader(); } catch (IOException var10) { throw new InternalError("Could not create extension class loader", var10); } try { this.loader = Launcher.AppClassLoader.getAppClassLoader; } catch (IOException var9) { throw new InternalError("Could not create application class loader", var9); } Thread.currentThread().setContextClassLoader(this.loader); ……}

当中有两行很首要的代码:

Launcher.ExtClassLoader.getExtClassLoader();this.loader = Launcher.AppClassLoader.getAppClassLoader;

率先行开首化了ExtClassLoader,但尚无点名其parent。

一对篇章表示ExtClassLoader的父加载器是Bootstrap ClassLoader,这几个说法实在并不完全标准。

第二行起先化了AppClassLoader,指定ExtClassLoader作为其父加载器。并将AppClassLoader作为系统类加载器。

AppClassLoader将会化为自定义ClassLoader的私下认可父加载器。

具体逻辑可依据以下顺序查看源代码:

  1. Launcher类的getClassLoader()方法。
  2. ClassLoader类的initSystemClassLoader()方法。
  3. ClassLoader类的getSystemClassLoader()方法。
  4. ClassLoader类的ClassLoader()方法。

当中getSystemClassLoader()方法的注释为:

/*** Returns the system class loader for delegation. This is the default* delegation parent for new <tt>ClassLoader</tt> instances, and is* typically the class loader used to start the application.**/

ExtClassLoader和AppClassLoader都持续了UEnclaveLClassLoader类。

U汉兰达LClassLoader协理从文件目录和jar包加载class。

ExtClassLoader和AppClassLoader都调用了父类的构造函数。

public URLClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory)

U福特ExplorerLClassLoader类中有个属性为ucp,表示该ClassLoader肩负寻觅的渠道。

ExtClassLoader和AppClassLoader最大的两样,即它们背负的门路不相同。

/* The search path for classes and resources */private final URLClassPath ucp;

查看源码可得:

ExtClassLoader负担寻找的不二秘诀为:

String var0 = System.getProperty("java.ext.dirs");

AppClassLoader肩负寻觅的路线为:

String var1 = System.getProperty("java.class.path");

据此,上一节能够通过那八个方法得到分裂ClassLoader所担当加载的目录。

另外,Bootstrap ClassLoader担负寻觅的门路为:

String bootClassPath = System.getProperty("sun.boot.class.path");

ClassLoader是贰个抽象类,多少个重大的办法如下:

  • defineClass(String name, byte[] b, int off, int len)把字节数组b中的内容调换来Java类,重回的结果是java.lang.Class类的实例。

  • findClass(String name)查找名为name的类,重回的结果是java.lang.Class类的实例。

  • loadClass(String name)加载名为name的类,再次来到的结果是java.lang.Class类的实例。

  • resolveClass(Class<?> c)链接内定的Java 类。

在那之中,loadClass方法是最常涉及的叁个。

其代码如下:

protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{ synchronized (getClassLoadingLock { // First, check if the class has already been loaded Class<?> c = findLoadedClass; if (c == null) { long t0 = System.nanoTime(); try { if (parent != null) { c = parent.loadClass(name, false); } else { c = findBootstrapClassOrNull; } } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. long t1 = System.nanoTime(); c = findClass; // this is the defining class loader; record the stats sun.misc.PerfCounter.getParentDelegationTime().addTime; sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom; sun.misc.PerfCounter.getFindClasses().increment(); } } if  { resolveClass; } return c; }}

该办法主要的步调如下:

  1. 点名全限类名进行加载,首先调用findLoadedClass决断当前类加载器是或不是曾经加载该类。
  2. 假设未有被加载。则判别当前ClassLoader的父加载器是不是为null。如果不为null,则委托其父加载器举办加载。假如为null,则应用Bootstrap ClassLoader进行加载。
  3. 万一父加载器或Bootstrap ClassLoader都不能够加载,则调用findClass方法搜索需求加载的类。

除此以外,loadClass方法还关乎加锁的进程,使用ConcurrentHashMap对不一样的全限类名举办加锁。

具体可查阅getClassLoadingLock方法。

标题
<small>小标题</small>

<!DOCTYPE html><html> <head> <title>Demo</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jquery-3.3.1.js" ></script> <script src="js/bootstrap.min.js"></script> </head> <body> <%--传统的方式--%> <h1>标题1</h1> <h2>标题2</h2> <h3>标题3</h3> <h4>标题4</h4> <h5>标题5</h5> <h6>标题6</h6> <%--BootStrap提供的class样式--%> 标题1<small>小标题</small> 标题2 标题3 标题4 标题5 标题6 </body></html>

图片 8效果

Collection 和 Collections的区别

首先,"Collection" and "Collections"是三个例外的概念,从底下的接续关系图中大家能够看看,"Collection"是贰个基础接口类,而"Collections"是一个静态的类,它提供了有个别静态方法来操作某个集结类型。

图片 9image

关于SSM框架的规律,由于所学尚浅,这里引用csdn博主的见识并加以驾驭

  • Git 版本调节
  • Github
  • SSH
  • 基本功终端命令
  • 招来技艺

四:双亲委托格局

Java类加运载飞机制使用双亲委托方式。

一个ClassLoader加载三个类时,首先必要将职务委托给其父加载器,直到Bootstrap ClassLoader。

若果父加载器未加载该类,则逐层再次来到给委托发起者即日前ClassLoader实行加载。

在健康使用中,顾客不自定义类加载器。

类加载工作首先由App ClassLoader发起,然后委托给Extension ClassLoader,最终嘱托给Bootstrap ClassLoader。

首先,通过三个例子通晓多少个ClassLoader所负担加载的类和父老母委托情势。

新建二个jar包,名称叫acai-cl.jar,包中有个轻巧的Person类。

写三个粗略的次序输出person对象所对应的ClassLoader。

import com.acai.Person;public class TestClassLoader { public static void main(String[] args) { Person person = new Person(); System.out.println(person.getClass().getClassLoader; }}

测验一:将jar包引进项目

图片 10jar包引进项目

对应输出:

sun.misc.Launcher$AppClassLoader@18b4aac2

能够见见,位于ClassPath的类,是由App ClassLoader担任加载。

测验二:将jar包复制到%JRE_HOME%/lib/ext目录

图片 11复制到%JRE_HOME%/lib/ext

对应输出:

sun.misc.Launcher$ExtClassLoader@4cc77c2e

可以吸取,Extension ClassLoader担负加载%JRE_HOME%/lib/ext目录下的类。

加载Person类时,会首先尝试利用App ClassLoader举行加载。

是因为父老妈委托形式,最后委托到Extension ClassLoader,而其担负的目录%JRE_HOME%/lib/ext下存在Person类,则举办了类加载操作。

测量检验三:将jar包追加到Bootstrap ClassLoader加载路线上

图片 12扩张到Bootstrap ClassLoader加载路线

利用参数:-Xbootclasspath/a:d:acai-cl.jar,将jar包追加到Bootstrap ClassLoader加载路线。

对应输出:

null

可以看来,Person类的加载专业,最后被托付到了Bootstrap ClassLoader。

注:Bootstrap ClassLoader由C++撰写。由Bootstrap ClassLoader担负加载的类,其getClassLoader()方法输出为null。

能够品尝输出String类的类加载器。

System.out.println(String.class.getClassLoader;

接下去,再经过debug来评释双亲委托形式。

抑或原本老大简单的demo。

import com.acai.Person;public class Test { public static void main(String[] args) { Person person = new Person(); System.out.println(person.getClass().getClassLoader; }}

在ClassLoader类的loadClass方法上打断点。

图片 13App ClassLoader尝试加载图片 14Extension ClassLoader尝试加载图片 15Bootstrap ClassLoader尝试加载

能够看看,类的加载进度符合从下到上委托,末了会被托付到Bootstrap ClassLoader。

何况切合从上到下加载,每一层ClassLoader都会尝试进行加载。最终由App ClassLoader加载了Person类。

随着,尝试加载一个分外的类:Splash.class。

Splash类位于jfxrt.jar,这个jar包在%JRE_HOME%/lib/ext目录下。

import com.sun.javafx.applet.Splash;public class ExtTest { public static void main(String[] args) { Splash splash = new Splash; System.out.println(splash.getClass().getClassLoader; }}

对应输出:

sun.misc.Launcher$ExtClassLoader@330bedb4

早晚,Splash类应该由Extension ClassLoader进行加载。

但其加载进程,照旧会从默许的系统类加载器App ClassLoader最初。

能够透过debug进行查看。

图片 16App ClassLoader尝试加载

Splash类加载的经过会被托付到Bootstrap ClassLoader,但Bootstrap ClassLoader并不担负加载%JRE_HOME%/lib/ext目录下的类。最后由Extension ClassLoader实行加载。

图片 17Bootstrap ClassLoader尝试加载未成功图片 18最终由Extension ClassLoader加载

多数稿子在演说多个ClassLoader之间的涉及时候,会提交贰个getParent操作的demo。

并且感觉Bootstrap ClassLoader是Extension ClassLoader的父加载器。

Extension ClassLoader是App ClassLoader的父加载器。

App ClassLoader是自定义类加载器的父加载器。

与上述同类的分解基本科学,但Bootstrap ClassLoader和Extension ClassLoader之间的涉嫌要求额外解释。

图片 19家长江水利委员会托机制,图片来自参照他事他说加以考察7

由于Bootstrap ClassLoader实际不是选择Java编写,故不能够内定Extension ClassLoader的parent为Bootstrap ClassLoader。

这一层关系在ClassLoader的loadClass方法中做了弥补。

在加载类时,会判断当前ClassLoader的父加载器是还是不是为null,为null则使用Bootstrap ClassLoader进行加载。

在Java提供的多少个暗中认可类加载器中,父加载器为null的独有Extension ClassLoader。

该进程可参考ClassLoader的loadClass方法。

网络海人民广播电视台湾大学例证是有关String类。假如自个儿写一个java.lang.String类,使用双亲委托方式可防止备那些难题。

但实际上父母委托情势能够被打破,而实在阻止自定义java.lang.String的是“安全部制”。

这里品尝自定义java.lang.String类,并应用自定义ClassLoader实行加载。

package java.lang;public class String {}

import java.io.IOException;import java.nio.file.Files;import java.nio.file.Paths;public class StringClassLoader extends ClassLoader { @Override public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException { if ("java.lang.String".equals { return findClass; } else { return super.loadClass; } } @Override public Class<?> findClass throws ClassNotFoundException { try { byte[] classBytes = Files.readAllBytes(Paths.get("d:/String.class")); return defineClass(s, classBytes, 0, classBytes.length); } catch (IOException e) { throw new ClassNotFoundException; } } public static void main(String[] args) throws ClassNotFoundException { StringClassLoader stringClassLoader = new StringClassLoader(); Class clazz = stringClassLoader.loadClass("java.lang.String", false); System.out.println(clazz.getClassLoader; }}

该自定义类加载器破坏了老人民委员会托机制,具体办法将要下个章节表明。

出口结果为:

Exception in thread "main" java.lang.SecurityException: Prohibited package name: java.lang

能够看看,在被findClass方法调用的defineClass中有这么一段:

if ((name != null) && name.startsWith { throw new SecurityException ("Prohibited package name: " + name.substring(0, name.lastIndexOf; }

它会检讨当前加载类的全限类名是或不是以java.早先,那也是一种安全机制。

要是依照英特网的说教,java.lang.String被Bootstrap ClassLoader加载,demo中自定义的类加载器会被略过,不会输出至极。

为此说,双亲委托情势的遵从只是制止类重复加载。

文件段落
BootStrap中的P标签 默认文字大小:14px 行高:20px 底部外边距:10px文本内容的对齐方式 文本大小写转换 文本标记 <mark>使文字底部有黄线</mark> <del>删除线</del> <ins>下划线</ins> <strong>加粗加重</strong> <small>文本缩小显示</small>

 <body> <p > 一袭白袍的陈平安“忘我”出拳,格外行云流水。<br> 不再是窑工学徒拉坯,处处古板匠气如楷书,已如大家风流之行书。<br> <small>其中精髓,唯有吃得住苦、抓得住福而已。</small> </p> <p > <mark>一袭白袍</mark>的陈平安<del>“忘我”</del>出拳,格外行云流水。<br> 不再是<ins>窑工学徒拉坯</ins>,处处古板匠气如楷书,已如大家风流之行书。<br> <strong>其中精髓,唯有吃得住苦、抓得住福而已。</strong> </p> <p > Accept what was and what is, and you’ll have more positive energy to pursue what will be. </p> </body>

图片 20效果

ArrayList 和 Vector的区别

ArrayList,Vector主要差别为以下几点::Vector是线程安全的,源码中有非常多的synchronized能够观望,而ArrayList不是。导致Vector功能不或者和ArrayList相比较;:ArrayList和Vector都施用线性一而再存款和储蓄空间,当存款和储蓄空间欠缺的时候,ArrayList默许扩大为本来的二分一,Vector默许扩大为原本的一倍;:Vector能够设置capacityIncrement,而ArrayList不可能,从字面通晓正是capacity体量,Increment扩张,体积增加的参数。

SpringMVC:1.客户端发送诉求到DispacherServlet2.由DispacherServlet调控器查询HanderMapping,找四处理须要的Controller3.Controller调用专门的学问逻辑管理后,重临ModelAndView4.DispacherSerclet查询视图深入分析器,找到ModelAndView钦点的视图

5.视图担负将结果显示到顾客端图片 21

Spring:大家平昔支付接触最多的估摸正是IOC容器,它能够装载bean(也便是大家Java中的类,当然也囊括service dao里面包车型客车),有了这么些机制,大家就绝不在历次使用这一个类的时候为它初叶化,比很少见到关键字new。其余spring的aop,事务管理等等都以我们平常应用的。

Mybatis:mybatis是对jdbc的包装,它让数据库底层操作变的透明。mybatis的操作都是围绕叁个sqlSessionFactory实例进行的。mybatis通过安插文件涉及到各实体类的Mapper文件,Mapper文件中布局了每一种类对数据库所需进行的sql语句映射。在每一趟与数据库交互时,通过sqlSessionFactory得到三个sqlSession,再实践sql命令

基础知识

  • HTML
  • CSS
  • JavaScript

五:自定义ClassLoader

绝大非常多动静下,Java暗中认可的多个类加载器已经得以满足要求。

自定义类加载器则能够完结额外的急需,比如:

  1. 从互联网文件加载类。
  2. 从随机目录加载类。
  3. 对字节码文件做加密管理,由自定义类加载器做解密。

贯彻自定义类加载器的尤为重要步骤为:

  1. 承袭ClassLoader类。如若只是从目录可能jar包加载类,也能够挑选继续U奇骏LClassLoader类。
  2. 重写findClass方法。
  3. 在重写的findClass方法中,无论用何种措施,获取类公事对应的字节数组,然后调用defineClass方法调换到类实例。

自定义类加载器真正有趣的是打破双亲委托机制,也是成都百货上千面试官会问到的标题。

上文提到类加载双亲委托方式完成位于ClassLoader的loadClass方法,想要破坏那几个机制,则须要重写该形式。

打破双亲委托方式真的有早晚的实用价值。

诸如有四个class文件,或许四个jar包。

里头八个类的全限类名都同样,假如急需同一时间利用那三个类,则须求打破双亲委托格局。

有三个Person类,它们的全限类名均为com.acai.Person,独一的分别是sayHello()方法输出的剧情略有不相同。

package com.acai;import lombok.Data;@Datapublic class Person { private String name; private Integer age; public void sayHello() { System.out.println("Hello, this is Person in acai-cl"); }}

package com.acai;import lombok.Data;@Datapublic class Person { private String name; private Integer age; public void sayHello() { System.out.println("Hello, this is Person in acai-cl2"); }}

将多个Person所在的门类打成jar包。

图片 22两个jar包

经常操作是,把五个jar包都推荐项目。

写二个微小的demo。

import com.acai.Person;public class Main { public static void main(String[] args) throws Exception { Person person = new Person(); System.out.println(person.getClass().getClassLoader; person.sayHello(); }}

对应输出为:

sun.misc.Launcher$AppClassLoader@18b4aac2Hello, this is Person in acai-cl

能够见到,demo中私下认可使用了acai-cl.jar中的Person类。

一经想要使用acai-cl2.jar中的Person类,则想到新建壹个ClassLoader。

须求从jar包加载类,则先行想到U劲客LClassLoader。

import com.acai.Person;import java.io.File;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;public class Main { public static void main(String[] args) throws Exception { Person person = new Person(); System.out.println(person.getClass().getClassLoader; person.sayHello(); URL url = new File("d:/acai-cl2.jar").toURI; URLClassLoader loader = new URLClassLoader(new URL[]{url}); Thread.currentThread().setContextClassLoader; Class<?> clazz = loader.loadClass("com.acai.Person"); System.out.println(clazz.getClassLoader; Method method = clazz.getDeclaredMethod("sayHello"); method.invoke(clazz.newInstance; }}

对应输出:

sun.misc.Launcher$AppClassLoader@18b4aac2Hello, this is Person in acai-cl

sun.misc.Launcher$AppClassLoader@18b4aac2Hello, this is Person in acai-cl

能够看看,尽管是钦命了选拔acai-cl2.jar,输出的依旧是acai-cl.jar中Person的sayHello。

由来是由于五个Person类具备同等的全限类名。

加载第贰个Person的时候,开掘自定义类加载器的父类加载器App ClassLoader已经加载了com.acai.Person。

故而一向回到该类,即为acai-cl.jar中的Person类。

于是想到,新建ClassLoader,况且破坏双亲委托机制,重新loadClass方法。

import java.net.URL;import java.net.URLClassLoader;import java.net.URLStreamHandlerFactory;public class MyClassLoader extends URLClassLoader { public MyClassLoader(URL[] urls, ClassLoader parent) { super(urls, parent); } public MyClassLoader(URL[] urls) { super; } public MyClassLoader(URL[] urls, ClassLoader parent, URLStreamHandlerFactory factory) { super(urls, parent, factory); } @Override public Class<?> loadClass(String name) throws ClassNotFoundException { if (name.equals("com.acai.Person")) { return super.findClass; } else { return super.loadClass; } }}

在MyClassLoader中重写了loadClass方法,当加载的类名等于com.acai.Person时,直接调用findClass方法,绕过父母委托机制。

此间需求三个if推断,表示除非在加载com.acai.Person时才破坏双亲委托。

因为在加载多个类时,会同不经常候加载它的父类。

Person的父类为java.lang.Object。

直白用自定义类加载器加载Object类,会抛出SecurityException至极。

于是,写一个demo。

import com.acai.Person;import java.io.File;import java.lang.reflect.Method;import java.net.URL;import java.net.URLClassLoader;public class Main { public static void main(String[] args) throws Exception { Person person = new Person(); System.out.println(person.getClass().getClassLoader; person.sayHello(); URL url = new File("d:/acai-cl2.jar").toURI; URLClassLoader loader = new URLClassLoader(new URL[]{url}); Thread.currentThread().setContextClassLoader; Class<?> clazz = loader.loadClass("com.acai.Person"); System.out.println(clazz.getClassLoader; Method method = clazz.getDeclaredMethod("sayHello"); method.invoke(clazz.newInstance; URL url2 = new File("d:/acai-cl2.jar").toURI; MyClassLoader myClassLoader = new MyClassLoader(new URL[]{url2}); Class<?> clazz2 = myClassLoader.loadClass("com.acai.Person"); System.out.println(clazz2.getClassLoader; Method method2 = clazz2.getDeclaredMethod("sayHello"); method2.invoke(clazz2.newInstance; }}

sun.misc.Launcher$AppClassLoader@18b4aac2Hello, this is Person in acai-cl

sun.misc.Launcher$AppClassLoader@18b4aac2Hello, this is Person in acai-cl

MyClassLoader@5e2de80cHello, this is Person in acai-cl2

能够看看,acai-cl2.jar中的Person类被准确加载。

摄取,能够经过自定义ClassLoader,重写loadClass,破坏双亲委托机制。

表格
<table > table:默认将表格样式铺满屏幕 table-striped:斑马线效果 table-bordered:表格边框 table-hover:鼠标经过变色 行样式 <tr > <tr > <tr > <tr > <tr >

<!DOCTYPE html><html><head> <title>Demo</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jquery-3.3.1.js"></script> <script src="js/bootstrap.min.js"></script> <style type="text/css"> .table { width: 50%; margin: 0 auto; margin-top: 10px; } </style></head><body><table > <thead> <tr> <td>标题1</td> <td>标题2</td> <td>标题3</td> <td>标题4</td> <td>标题5</td> </tr> </thead> <tbody> <tr> <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> <tr > <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> <tr > <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> <tr > <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> <tr > <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> <tr > <td>内容1</td> <td>内容2</td> <td>内容3</td> <td>内容4</td> <td>内容5</td> </tr> </tbody></table></body></html>

图片 23效果

ArrayList的尾巴部分达成和扩大容积情状

布局ArrayList的时候,暗中认可开首化体量为10,保存容器为 Object[] elementData。向会集添港成分的时候,调用add方法,比方list.add;add方法做的操作是:elementData[size++] = e; 然后成分就被寄放在进了elementData。早先化体量为10,当大家存第十二个因素的时候,会如何是好呢?看ArrayList类的一部分源码:

public class ArrayList<E> extends AbstractList<E> implements List<E> { private transient Object[] elementData; public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } //Constructs an empty list with an initial capacity of ten. public ArrayList() { this; } public boolean add { ensureCapacity; // 扩充长度 elementData[size++] = e; // 先赋值,后进行size++。所以是从[0]开始存。 return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; // 旧集合长度 if (minCapacity > oldCapacity) { Object oldData[] = elementData; // 旧集合数据 int newCapacity = (oldCapacity * 3)/2 + 1; // 计算新长度,旧长度的1.5倍+1 if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); // 这就是传说中的可变集合。用新长度复制原数组。 } } public E get(int index) { RangeCheck; return  elementData[index]; }}

add方法中先调用ensureCapacity方法对原数CEO度进行增添,扩张格局为,通过Arrays类的copyOf方法对原数组进行拷贝,长度为原数组的1.5倍+1。然后把扩大体量后的新数组实例对象地址赋值给elementData征引类型变量。扩大体积完成。

经测量检验,假若要存100万数额,须要扩大体积叁十二回,数据量越大,扩容次数越多,每一趟的扩大体量代表着创制新数组对象,复制原有数据。

以上是该博主对SSM框架的享用,在此之后,小编进一步查阅资料精通了该框架下各层级的分解

包管理

  • NPM
  • Yarm

六:仿照效法资料

[1] Java Garbage Collection Basics[2] java classloader是怎么加载自己到内部存款和储蓄器里面执行的?[3] 详细深远剖判 Java ClassLoader 职业机制[4] 深刻深入分析Java ClassLoader原理[5] 浓厚研讨Java 类加载器[6] 深度分析Java的ClassLoader机制[7] Java类加载原理与ClassLoader使用总计[8] 达成java classloader 动态加载jar包[9] ClassLoader的底子详解

表单
输入框BootStrap主张将相同组的控件统一放到一个div中方便管理提供了form-group<div > <label >用户名:</label> <input type="text" placeholder="用户名"></div> 可以作用在文本域,select form-control:输入框会编程圆角,有蓝色选中状态 input-sm:让输入框变得更大 input-lg:更小让表单内容横向显示<form ></form><label >:隐藏label

<body><form > <div > <label >用户名:</label> <input type="text" placeholder="用户名"> </div> <div > <label >选项</label> <select > <option>选项一</option> <option>选项二</option> <option>选项三</option> </select> </div> <div > <label>具体信息</label> <textarea ></textarea> </div></form></body>

图片 24效果

Button<input type="button" value="DemoButton"> active:按钮激活 disabled:按钮禁用 btn-default:按钮默认样式 btn-info:信息按钮 btn-warning:警告按钮 btn-success:成功按钮 btn-danger:危险按钮 btn-link:链接按钮 <a >测试</a>

<form > <input type="button" value="Default" style="margin: 10px 10px"> <input type="button" value="Info"> <input type="button" value="Warning"> <input type="button" value="Success"> <input type="button" value="Danger"> <input type="button" value="Link"> <a >测试</a></form>

图片 25效果

ArrayList 和 LinkedList的区别

ArrayList和Vector使用了数组的落到实处,能够认为ArrayList也许Vector封装了对个中数组的操作,举例向数组中拉长,删除,插入新的要素可能数额的扩大和重定向。

LinkedList使用了循环双向链表数据结构。与基于数组ArrayList比较,那是三种天堂地狱的落到实处技艺,那也决定了它们将适用于完全不一样的办事情形。

LinkedList链表由一文山会海表项连接而成。三个表项总是包括3个部分:成分内容,前驱表和四驱表

增比索素到列表尾端

ArrayList中add()方法的习性决意于ensureCapacity()方法。 扩大容积函数。LinkeList由于应用了链表的构造,因而不必要保障体积的深浅

增日成分到列表放肆地方

鉴于完毕的两样,ArrayList和LinkedList在那几个办法上存在一定的属性差距,由于ArrayList是依附数组达成的,而数组是一块接二连三的内部存款和储蓄器空间,假如在数组的即兴地方插入成分,必然导致在该岗位后的装有因素要求重新排列,由此,其效用绝对会十分的低。

剔除任性地点成分

对ArrayList来讲,remove方法是同等的。在大二地方移除成分后,都要开展数组的三结合。

容积参数

体积参数是ArrayList和Vector等依靠数组的List的故意质量参数。它表示初叶化的数组大小。当ArrayList所蕴藏的元素数量抢先其已有大时辰。它便会开展扩大容积,数组的扩大体量会形成整个数组进行三回内部存款和储蓄器复制。由此合理的数组大小有利于减弱数组扩大体量的次数,从而加强系统质量。ArrayList提供了贰个足以拟定伊始数组大小的社团函数 :public ArrayList(int initialCapacity)

遍历列表

最方便的ForEach循环并不曾很好的性质表现,综合质量不比平常的迭代器,而是用for循环通过任性访问遍历列表时,ArrayList表项很好,然则LinkedList的表现却无力回天令人承受,乃至从不办法等待程序的收尾。那是因为对LinkedList举行自由拜见时,总会进展二次列表的遍历操作。质量比较倒霉,应防止使用。

持久层:DAO层
  • DAO层:DAO层首即便做多少长久层的行事,担负与数据库举行联系的一部分任务都封装在此,

    • DAO层的规划首先是规划DAO的接口,
    • 下一场在Spring的配置文件中定义此接口的完成类,
    • 接下来就可在模块中调用此接口来拓宽数据业务的拍卖,而不用关爱此接口的求实达成类是哪个类,显得结构特别清楚,
    • DAO层的数据源配置,以及关于数据库连接的参数都在Spring的安插文件中进行配置。

CSS 进阶

  • 预管理器
    • Sass
    • Less
    • PostCSS
    • Stylus
响应式设计

Array和ArrayList的分化?何时更相符Array

ArrayList是Array的复杂性版本

ArrayList内部封装了八个Object类型的数组,从常常的意思来讲,它和数组未有本质的歧异,以致于ArrayList的好些个方法,如Index、IndexOf、Contains、Sort等都是在里面数组的基本功上一向调用Array的打点措施。

存款和储蓄的数据类型

ArrayList能够储存异构对象,而Array只可以存款和储蓄一样数据类型的多寡。

长度的可变

Array的长短实际上是不可变的,二维变长数组实际上的长度也是原则性的,可变的只是里面成分的尺寸。而ArrayList的尺寸既可以够钦命(就算内定了长短,也会自动2倍扩大容积)也能够不点名,是变长的。

存取和增加和删除成分

对此日常的援引类型来讲,那有的的震慑不是十分的大,然而对于值类型来讲,往ArrayList中间增多和修改成分,都会挑起装箱和拆箱的操作,频仍的操作恐怕会影响部分频率。别的,ArrayList是动态数组,它不包涵通过Key或然Value飞速访谈的算法,所以实际调用IndexOf、Contains等办法是实行的简约的轮回来搜寻成分,所以一再的调用此类措施并不及你本身写循环并且稍作优化来的快,要是有那方面包车型大巴须要,建议利用Hashtable或SortedList等键值对的集合。

适用场景:一旦想要保存一些在总体程序运营时期都会存在何况不变的多少,大家得以将它们放进三个大局数组里,可是即使大家一味只是想要以数组的花样保留数据,而不对数码举行充实等操作,只是方便我们开展检索的话,那么,大家就挑选ArrayList。

业务层:Service层
  • Service层:Service层首要担任作业模块的逻辑应用设计。
    • 第一设计接口,再规划其落到实处的类
    • 随即再在Spring的配备文件中布局其促成的涉嫌。那样大家就足以在使用中调用Service接口来开展工作管理。
    • Service层的事务落成,具体要调用到已定义的DAO层的接口,
    • Service层的完毕类中用Spring的IOC(@Autowired表明)自动注入了二个或多少个mapper对象,即该对象是调用sqlSessionFactory的getSession的getBean方法赢得的。然后再调用mapper对象的呼应措施

CSS 框架

  • BootStrap
  • Materialize CSS
  • ...
ViewPort
<head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title></head>width:控制 viewport 的大小,可以指定的一个值,如 600。也可以指定特殊的值,如 device-width:设备的宽度。height:和 width 相对应,指定高度。initial-scale:初始缩放比例,也即是当页面第一次加载的时候缩放比例。maximum-scale:允许用户缩放到的最大比例。minimum-scale:允许用户缩放到的最小比例。user-scalable:用户是否可以手动缩放。

去掉Vector中三个频仍的因素

1. Vector.contains()经过Vector.contains()方法判定是不是蕴涵该因素,如果未有饱含就增添到新的成团当中,用于数据比较小的状态

2. HashSet()选拔HashSet来缓和那几个主题素材,通过hashcode的过滤化解难点。

表现层:Controller层
  • Controller层:Controller层担任具体的事情模块流程的决定

    • 在此层里面要调用Service层的接口来调控业务流程,
    • 支配的安插也同样是在Spring的布局文件之中进行,针对具体的业务流程,会有分裂的调控器,大家实际的宏图进度中能够将流程张开抽象归结,设计出能够重复使用的子单元流程模块,那样不仅仅使程序结构变得一览无余,也大大收缩了代码量。
  • 至于View层 此层与调整层结合相比较紧凑,须求双方组合起来共同工发。View层重要承担前台jsp页面包车型客车表示.

Service逻辑层设计 Service层是树立在DAO层之上的,创设了DAO层后才得以创设Service层,而Service层又是在Controller层之下的,因此Service层应该既调用DAO层的接口,又要提供接口给Controller层的类来开展调用,它正好处于一个中间层的地方。每一个模型都有二个Service接口,每一种接口分别封装各自的政工管理模式。

总体来讲正是,顾客request央浼到SpringMVC的前端调节器,从计算机映射器找相应的handler(用@RequestMapping标记,映射成功后,由SpringMVC生成贰个handler对象,该指标中有二个办法,即映射成功的该措施),handler中调用的是专门的学业调控层(service)的主意接口。重返有地点和乞请参数的ModelAndView对象(个中装载着参数如name,id,和目的地址即相应的展现页面如jsp,用Map存款和储蓄,然后嵌入request对象中)到前端调整器,然后前端调控器把ModelAndView传给视图分析器,加上剖析器中安装的jsp地址的前缀和后缀,然后把视图重回给前端调节器,再开展视图的渲染(把map中数据填充的request对象中),重临给顾客端。

出于触及时间极短,精通浅陋,以照着网络教程做的CRUD为例,回看贰回

怎么着塑造 CSS

  • BEM
  • OOCSS
  • SMACSS
  • SUITCSS
  • Atomic
栅格布局
当屏幕到达预设宽度时,改变屏幕的显示1.传统方式<head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jquery-3.3.1.js"></script> <script src="js/bootstrap.min.js"></script> <style type="text/css"> .test { width: 300px; height: 200px; background: red; } 当屏幕宽度小于900时显示 @media screen and (max-width: 900px) { .test { width: 100%; height: 100px; background: blue; } } </style></head><body> <div ></div></body>2. BootStrap<head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Demo</title> <link href="css/bootstrap.min.css" rel="stylesheet"> <script src="js/jquery-3.3.1.js"></script> <script src="js/bootstrap.min.js"></script> <style type="text/css"> .test { height: 300px; background: red; } </style></head><body> <div ></div></body>col-lg-3:大屏的时候占三分之一col-sm-2:小屏的时候占二分之一

HashMap HasnTable concurrentHashMap原理、区别

HashTable底层数组+链表实现,无论key照旧value都无法为null,线程安全,完成线程安全的章程是在修改数据时锁住整个HashTable,功用低,ConcurrentHashMap做了连带优化起始size为11,扩大容积:newsize = olesize*2+1计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length

CRUD成效分解
  • 查询数据库数据,分页展现
  • 增多消息
    • 数量校验,校验客商名和信箱是还是不是合法
    • 后面一个jquery校验,后端使用JS普拉多303
  • 修改音信
  • 单个删除信息
  • ajax乞求实现CRUD
  • Rest风格的url

塑造筑工程具

  • NPM
  • Gulp
  • Webpack
  • Rollup
BootStrap组件

HashMap底层数组+链表实现,能够积存null键和null值,线程不安全伊始size为16,扩大容积:newsize

oldsize*2,size一定为2的n次幂扩大容积针对全数Map,每一趟扩大容积时,原本数组中的元素依次重新总括寄存地点,一碗水端平新插入插入成分后才看清该不应该扩大体量,有望不算扩大体量(插入后假如扩容,若无再一次插入,就能够生出无效扩大容积)当Map凉月素总的数量当先Entry数组的伍分一,触发扩大体积操作,为了减小链表长度,元素分配更均匀总计index方法:index = hash & (tab.length – 1)

ConcurrentHashMap底层接纳分段的数组+链表达成,线程安全通过把全部Map分为N个Segment,能够提供一样的线程安全,不过功用升高N倍,暗中同意进步16倍。(读操作不加锁,由于HashEntry的value变量是 volatile的,也能保障读取到新型的值。)Hashtable的synchronized是本着整张Hash表的,即每趟锁住整张表让线程独占,ConcurrentHashMap允许五个修改操作并发进行,其关键在于使用了锁分离技艺有个别措施供给跨段,举个例子size()和containsValue(),它们或许须要锁定任何表而而不光是有个别段,那需求按顺序锁定全部段,操作截至后,又按梯次释放具备段的锁扩大体量:段内扩大体积(段内成分超越该段对应Entry数老总度的五分二触及扩大体积,不会对全体Map举办扩大容积),插入前检查实验需不须要扩大体积,有效防止无效扩大体积

HashMap的初步值还要思量加载因子:

哈希争论:若干Key的哈希值按数组大小取模后,借使落在同一个数组下标上,将整合一条Entry链,对Key的搜寻要求遍历Entry链上的各样成分实施equals()相比。加载因子:为了裁减哈希争执的可能率,暗许当HashMap中的键值对直达数组大小的十分四时,即会接触扩容。因而,若是预估体积是100,即必要设定100/0.75=134的数组大小。空中换时间:借使期待加速Key查找的时刻,还是能更进一竿回退加载因子,加大开头大小,以减低哈希争执的概率。

Hashtable与HashMap另三个区分是HashMap的迭代器是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有任何线程退换了HashMap的结构,将会抛出ConcurrentModificationException,但迭代器自己的remove()方法移除成分则不会抛出ConcurrentModificationException分外。但那并不是贰个早晚发生的一颦一笑,要看JVM。

SSM框架之初体验,Java面试知识点计算。类型搭建

基本功框架:SSM,数据库:MySQL,前端框架:Bootstrap飞快搭建Helper(MyBatis工具),逆向工程MyBatis GeneratorMaven管理jar包此项目是在eclipse下进行的,tomcat及maven的安顿此处省略

JS 进阶

  • 模块化
  • ES6
  • 框架
    • Vue
    • React
    • Angular

本文由云顶最新线路检测发布,转载请注明来源

关键词: