- 博客(18)
- 收藏
- 关注
转载 AOP切面
AOPAOPJDK动态代理三级目录AOP底层使用到动态代理有两种情况的动态代理第一种,有接口情况,使用JDK动态代理—创建接口实现类代理对象,通过代理对象增强类的方法第二种,无接口情况,使用CGLIB动态代理—创建当前类子类的代理对象,通过代理对象增强类的方法JDK动态代理使用Proxy类里面的方法创建代理对象调用newProxyInstance方法(第一个参数)类加载器(第二个参数)增强方法所在的类,这个类实现的接口,支持多个接口(第三个参数)实现InvocationHandl
2021-05-30 15:09:45
99
转载 IOC容器
IOC容器底层原理接口(BearFactory、ApplicationContext)操作Bean管理xml注解控制反转,把对象创建和对象之间的调用过程都交给Spring进行管理,降低代码之间的耦合。底层原理xml解析、对象工厂、反射xml配置文件,配置创建的对象创建工厂类,通过xml解析获得类的class属性通过forName获取Class对象通过Class的newInstance进而创建xml配置的对象接口(BearFactory、ApplicationContext)二者功能相似
2021-05-29 20:50:39
91
原创 线程同步机制
线程同步机制线程同步Synchronized同步原理三级目录线程同步在多线程编程,一些敏感数据不允许被多个线程同事访问,此时就使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完整性。线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对 该内存地址进行操作Synchronized同步代码块Synchronized(对象){//得到对象的锁,才能操作同步代码 //需要被同步代码;}Synch
2021-05-15 19:19:59
158
原创 类加载过程
类加载类加载过程加载(JVM运行)链接(JVM运行)初始化类加载后内存布局情况类加载过程Java源码经过javac编译成字节码文件,Java运行然后类加载类加载的三个阶段加载(Loading)链接(Linking):①验证(Verification)②准备(Preparation)③解析(Resolution)初始化(Initialization)加载(JVM运行)将类的class文件读入内存,并为之创建一个java.lang.Class对象。JVM在该阶段的主要目的是将字节码从不同的
2021-05-15 15:51:46
59
原创 线程基础
线程线程的创建方法Thread机制Runnable线程的创建方法继承Thread类,重写run方法实现Runnable接口,重写run方法Thread当一个类继承了Thread类,该类就可以当做线程使用我们会重写run方法,写上自己的业务代码run Thread 类重写了 Runnable 接口的run方法@Overridepublic void run(){ if(target!=null){ target.run(); }}机制进程启动后会创建一个main线程。
2021-05-15 10:49:58
113
原创 Class类
ClassClass常用方法获取Class对象类加载器类加载类加载时机:Class也是类,因此也继承Object类Class类对象并不是new出来的,而是系统创建的对于某个类的Class类对象,在内存中只有一份,因为类只加载一次每个类的实例都会记得自己是由哪个Class实力所生成通过Class可以完整地得到一个类的完整结构,通过一系列APIClass对象是存放在堆中的类的字节码二进制数据,是存放在方法区的,有的地方成为类的元数据(包括方法代码,变量名,方法名,访问权限等)2:(一)传统n
2021-05-12 09:31:08
216
原创 反射
反射介绍反射机制三级目录介绍加载类:返回Class类型的对象clsClass csl=Class.forName(classfullpath)//classfullpath是路径全包名通过cls得到加载类classfullpath的对象实例。Object o=cls.newInstance();//运行类型为对象类型通过cls得到你的加载的类classfullpathd的methodName都方法对象。即:在反射中,可以把方法视为对象Method method=cls.getM
2021-05-12 08:43:18
59
原创 Collections 工具类
Collections 工具类Collections介绍排序操作(均为static方法)查找替换(均为static方法)Collections介绍Collections是一个操作Set、List和Map等集合的工具类提供了一系列静态方法对集合元素进行排序、查询和修改等操作排序操作(均为static方法)reverse(List):反转List中元素shuffile(List):对List元素进行随机排序sort(List):根据元素的自然排序对指定的List集合元素按升序排序sort
2021-05-10 15:25:04
63
原创 TreeSet
TreeSet、TreeMapTreeSet底层TreeMap底层TreeSet底层构造器把传入的比较器对象赋给了TreeSet的底层的TreeMap都属性this.compratorpublic TreeMap(Comparator<? super K> comparator){ this.comparator=comparator;}在调用treeSet.add(“Tom”)时,底层会执行if(cpr!=null){//cpr就是匿名内部类(对象) do{ p
2021-05-10 15:13:17
51
原创 HashMap、HashTable、Properties
HashMap、HashTable、PropertiesHashMap介绍底层HashTable介绍底层PropertiesHashMap介绍(k,v)是一个Ndoe实现了Map.Entry<K,V>JDK7.0:HashMap底层为[数组+链表]JDK8.0:HashMap底层为[数组+链表+红黑树]底层源码与HashSet基本相同底层创建table核心 Node<K,V>[] newTab=(Node<K,V>[])new Node[n
2021-05-10 15:06:11
92
原创 Map
MapMap家族Map简介源码MapFor(遍历)通过entrySet获取k-v增强for迭代器Map家族#mermaid-svg-xn5Si2mNOSYRzu3t .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-xn5Si2mNOSYRzu3t .label text{fill:#333}#mermaid-
2021-05-09 20:38:45
225
原创 Set
Set介绍HashSet基本介绍add()底层源码LinkedHashSet基本介绍底层源码介绍1、无序、无索引2、不允许重复,因此最多只能有一个nullHashSet基本介绍1、实现Set接口2、本质上是HashMap:public HashSet(){ map=new HashMap<>();}3、可存null值,但最多只能有一个4、无序,取决于hash之后,再确定索引的结果5、不允许重复add()底层1、第一次添加时,table数组扩容到16,临界值(thr
2021-05-09 16:53:45
62
原创 List
List介绍ArrayList介绍add()方法源码ArrayList底层介绍1、元素有序(添加与取出顺序一致)、且可以重复2、支持索引ArrayList介绍1、可以加入一个或多个null2、由数据实现数据存储3、基本等同于Vector,但是ArrayList是县城不安全的(执行效率高),在多线程情况下,不建议使用ArrayListadd()方法源码public boolean add(E e){ensureCapacityInternal(size+1);elementData[s
2021-05-09 15:05:38
440
6
原创 Collection遍历
Collection遍历Iterator(迭代器)性质执行原理注意增强forIterator(迭代器)性质1、所有实现Collection接口的集合类都有一个iterator()方法,用以返回一个实现Iterator接口的对象,即可以返回一个迭代器2、Iterator仅用于遍历集合,Iterator本身并不存放对象执行原理ArrayList coll=new ArrayList();Iterator iterator=coll.iterator//得到迭代器//hasNext();判断是否还
2021-05-09 13:36:36
88
原创 集合
集合集合性质单列集合双列集合集合性质1、动态保存2、多个操作对象的方法:add,remove,set,get3、简洁单列集合#mermaid-svg-8uZxB7Vpb7OoofKc .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-8uZxB7Vpb7OoofKc .label text{fill:#
2021-05-09 12:59:35
52
原创 数组
数组数组性质数组的扩容数组性质1、长度必须指定,不能更改。2、保存的必须为同一类型的元素3、增加/删除的代码比较麻烦。数组的扩容Person[] pers=new Person[1];pers[0]=new Person();//增加Person对象Person[] pers2=new Person[pers.length+1]//新建数组for(){}//拷贝pers数据的元素到pers2中pers2[pers2.length-1]=new Person();...
2021-05-09 12:50:27
67
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人