自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 剑指Offer 52 总结

总结双指针法核心:只要走过的路程相同,最后终能相遇既然起点不同那么就需要让A先走完A的路,再让A走B的路,B同理称相遇点前为 歧路必然相遇节点前把自己和对方的歧路走完了相遇前A走过的路:A的歧路+B的歧路+本该一起走的路相遇前B走过的路:B的歧路+A的歧路+本该一起走的路这时双方都只剩下应该一起走的路,用等于号判断两者剩下路是否相同即使没有该一起走的路,A与B也会在终点null处相遇错误示例(超出时间限制)死循环,傻傻得去找那段不存在的路切记要让在双方在null处停留,有时候终

2021-04-03 11:02:50 134

原创 SSM之Spring学习记录

IoC中文名称:控制反转英文名称:(Inversion of Control)IoC 完成的事情:原先由程序员主动通过 new 实例化对象事情,转交给 Spring 负责.控制反转中控制指的是:控制类的对象.控制反转中反转指的是转交给 Spring 负责.IoC 最大的作用:解耦.程序员不需要管理对象.解除了对象管理和程序员之间的耦合.环境搭建导入jar包,四个核心包一个日志包(commons-logging)在 src 下新建 applicationContext.xml.

2020-11-29 17:40:15 887

原创 Spring AOP AspectJ方式配置含有参数切点及通知时报错

错误信息在学习Spring AOP AspectJ方式配置含有参数切点及通知时,切点没有参数时一切正常,加上参数后总是报错,详见下面这一大串。Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.aop.aspectj.AspectJPointcutAdvisor#2': Bean inst

2020-11-18 21:50:02 493

原创 (JDBC学习记录) 建立数据库的连接

JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API)简单理解为:JDBC,是SUN提供的一套 API,使用这套API可以实现对具体数据库的操作(获取连接、关闭连接、DML、DDL、DCL)与数据库的连接 public static Connection getConnection() throws IOException, ClassNotFoundException, SQLException {

2020-08-13 20:56:23 113

原创 (JavaSE 学习记录) GOF23设计模式之桥接模式

桥接模式处理多层继承结构、处理多维度变化场景。使得扩展更方便。//要新建一个brand时在此新建一个类public interface Brand { void say();}class Makka implements Brand{ @Override public void say() { System.out.println("这里是Makka"); }}class Upsy implements Brand{ @Ove

2020-07-17 14:44:31 124

原创 (JavaSE 学习记录) GOF23设计模式之代理模式

代理模式核心作用:通过代理控制对对象的访问。详细控制某个对象的方法。是面向切面编程核心实现机制(AOP)核心角色:1、抽象角色:定义代理和真实角色公共的对外方法2、代理角色:实现抽象角色,是真实角色的代理,通过调用真实角色的方法实现抽象方法,并符加自己的操作。3、真实角色:实现抽象角色,定义自己所要实现的操作方法,供代理调用。静态代理抽象角色public interface MakkaPakka { void sing(); void dance();}真实角色pu

2020-07-17 11:33:35 114

原创 (JavaSE 学习记录) GOF23设计模式之适配器模式

适配器模式适配器将一个接口转化为另一个接口,该模式使原本因为接口不兼容的类能在一起工作。需要适配的类:Adapteepublic class Adaptee { void request(){ System.out.println("要求很多!"); }}期望的接口:Targetpublic interface Target { void handleReq();}适配器一:继承需要适配的类并实现目标接口public class Adapter

2020-07-16 17:50:59 108

原创 (JavaSE 学习记录) GOF23设计模式之原型模式

浅克隆与深克隆对对象进行复制,创建出新的对象,新对象保留原对象的所有属性的值。浅克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向同一个对象。深克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向不同的对象。浅克隆:需要继承Cloneable接口才能对该类对象进行克隆。通过clone()方法返回 克隆出的对象。import java.util.Date;public class MakkaPakka implements Cloneable{ private int ag

2020-07-16 11:12:44 114

原创 (JavaSE 学习记录) GOF23设计模式之建造者模式

建造者模式实现复杂产品部件组装的步骤的调控。

2020-07-16 08:41:49 120

原创 (JavaSE 学习记录) GOF23设计模式之抽象工厂模式

抽象工厂模式适合产品族,不能新增产品,能扩展产品组合。多个接口public interface MakkaPakka { void msg();}public class MakkaPakkaNumOne implements MakkaPakka { @Override public void msg() { System.out.println("MakkaPakka 1号来了"); }}public class MakkaPakkaN

2020-07-15 16:07:06 110

原创 (JavaSE 学习记录) GOF23设计模式之工厂模式

面向对象设计基本原则1、OCP原则,对修改关闭,对扩展开放。2、DIP原则,要依赖接口编程,不要依赖于实现。3、LoD原则,尽量少依赖其他类.简单工厂模式//接口public interface Garden { void say();}public class Makka implements Garden { @Override public void say() { System.out.println("Makka Pakka来了");

2020-07-15 11:03:19 91

原创 (JavaSE 学习记录) GOF设计模式之单例模式

五种常见单例模式实现方式1、饿汉式(线程安全、调用效率高、不可延时加载)2、懒汉式(线程安全、调用效率不高、可延时加载)3、双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议用)4、静态内部类式(线程安全、调用效率不高、可延时加载)5、枚举单例(线程安全、调用效率高、不可延时加载)饿汉式public class SingletonDemo01 { private static SingletonDemo01 instance = new SingletonDemo01();

2020-07-14 18:55:06 143

原创 (JavaSE 学习记录) 自定义类加载器

自定义类加载器1、继承 java.lang.ClassLoader2、检查加载的类是否已经被装载,若已经装载,直接返回3、委派类加载请求给父类加载器,若父类能完成,返回父类加载器加载的Class实例4、调用本类加载器findClass方法,试图获取对应字节码,若成功则调用defineClass导入类型到方法区,失败则返回异常。import java.io.*;//继承 java.lang.ClassLoaderpublic class FileSystemClassLoader extend

2020-07-12 09:40:10 89

原创 (JavaSE 学习记录) 类加载器的层次结构

类加载器的层次结构(树状结构)引导类加载器(bootstrap class loader)扩展类加载器(extensions class loader)应用类加载器(application class loader)自定义加载器类加载器的代理模式双亲委托机制:接到加载类的请求时,将加载任务交给父类加载器,最后从上往下判断能否加载,能则加载,不能则交给子类。保证了Java核心库的类型安全。...

2020-07-11 07:54:52 121

原创 (JavaSE 学习记录) 类加载的过程

类加载的过程大致分为:加载、链接(验证,准备,解析)、初始化。加载将class文件字节码加载到内存中,把这些静态数据转化为方法区中的运行时数据结构,并在堆中生成一个class对象,依靠这个class对象可以对方法区中的数据进行访问。链接验证:确保符合规范,安全。准备:为类变量(static变量)分配内存,设置初始值,这些内存都在方法区中分配。解析:虚拟机常量池内的符号引用替换为直接引用。初始化执行类构造器()方法,若初始化一个类时其父类未被初始化,先对父类进行初始化。虚拟机保证一个类()

2020-07-11 07:50:54 92

原创 (JavaSE 学习记录) 多线程之两种常用实现方式

实现多线程的方式1、继承Thread类,重写run()方法。2、实现Runnable接口,重写run()方法。3、实现Callable接口,重写call()方法。尽量多实现少继承继承Thread类public class Establish extends Thread { @Override public void run() { System.out.println("Hello World!"); } public static void

2020-07-10 15:49:39 97

原创 (JavaSE 学习记录) IO流之打印流PrintStream

打印流是一种处理流,方便打印各种数据。import java.io.*;public class PrintStreamTest { public static void main(String[] args) throws FileNotFoundException { PrintStream ps = System.out; ps.print("Makka"); //打印到文件中,true表示开启自动刷新功能 ps = n

2020-07-10 15:00:47 88

原创 (JavaSE 学习记录) IO之转换流InputStreamReader、OutputStreamWriter

转换流将字节流转换为字符流。例如:System.in是字节流对象,现在期望按行接收输入,需要用到缓冲字符流BufferedReader特有的方法readLine(),但BufferedReader需要一个Reader对象,即字符流对象,这时候就需要转换流将字节流转换为字符流。import java.io.*;public class ConvertTest { public static void main(String[] args) { try (BufferedRea

2020-07-10 14:44:36 74

原创 (JavaSE 学习记录) IO流之对象流ObjectInputStream、ObjectOutputStream

对象流以“对象”为数据源,但是必须将传输的对象进行序列化与反序列化操作。与数据流相比,对象流能读写对象。重点:Serializable接口、transient关键字import java.io.*;public class ObjectTest { public static void main(String[] args) throws IOException, ClassNotFoundException { ByteArrayOutputStream baos =

2020-07-10 11:49:58 116

原创 (JavaSE 学习记录) IO流之数据流DataInputStream、DataOutputStream

数据流DataInputStream、DataOutputStream属于处理流。提供了可以存取与机器无关的所有Java基础类型数据(如:int、double、String等)的方法。数据流以“基本数据类型与字符串类型”为数据源,从而允许程序以与机器无关的方式从底层输入输出流中操作Java基本数据类型与字符串类型。注意读写顺序一致。import java.io.*;public class DataTest { public static void main(String[] args

2020-07-10 11:05:21 136

原创 (JavaSE 学习记录) IO流之字节数组流 ByteArrayInputStream、ByteArrayOutputStream

字节数组流FileInputStream是把File文件当做数据源,而ByteArrayInputStream则是把内存中的”某个字节数组对象”作为源。常常用在需要流和数组之间转化的情况。不需要关闭流的操作。ByteArrayInputStreamimport java.io.ByteArrayInputStream;import java.io.IOException;public class ByteArrayInputStreamTest { public static voi

2020-07-10 10:41:01 293

原创 (JavaSE 学习记录) IO流之缓冲字符流BufferedReader、BufferedWriter

BufferedReader、BufferedWriter同缓冲字节流一致,利用缓存机制,大大提高了读写文本文件的效率。BufferedReader新增了逐行读取方法 readLine();BufferedWriter新增了换行方法 newLine();import java.io.*;public class BufferedReaderTest { public static void main(String[] args) throws IOException {

2020-07-10 09:47:00 79

原创 (JavaSE 学习记录) IO流之缓冲字节流 BufferedInputStream、BufferedOutputStream

缓冲字节流

2020-07-10 09:01:34 117

原创 (JavaSE 学习记录) IO之文件字符流 FileReader、FileWriter

文件字符流当使用文件字节流时,由于是读入字节数组,而字节数组大小一定,所以有可能出现乱码。当操作字符文件时,可使用文件字符流避免产生此问题。仅适用于操作字符文件。FileReaderFileReader与FileInputStream区别在于读入到的是字符数组。 File src = new File("Garden.txt"); Reader reader = null; try { reader = new FileR

2020-05-26 21:09:15 125

原创 (JavaSE 学习记录) IO之文件字节流 FileInputStream、FileOutputStream,利用文件字节流拷贝文件

文件字节流FileInputStream:字节方式读取文件(适合读取所有类型文件)FileOutputStream:字节方式输出到文件中IO基本步骤:1、创建源2、选择流3、操作4、关闭流FileInputStream //创建源 File src = new File("Garden.txt"); //选择流 InputStream is = null; //操作 try {

2020-05-25 09:12:28 170

原创 (JavaSE 学习记录) File类、递归打印文件夹目录

File类创建一个File对象来表示文件或目录,用于对文件进行生成、删除、读取等操作。//创建、删除文件File f = new File("d:/FileTest.txt");f.createNewFile();f.delete();//创建文件夹File f02 = new File("d:/Garden/Makka");f02.mkdirs(); f02.mkdir(); //mkdir()需要之前的每一层目录都存在,而mkdirs()无所谓//其他常用方法f.exists(

2020-05-24 23:04:40 144

原创 (算法入门) 选择排序法

选择排序1、找出数组中最小的元素2、将其与数组中第一个数交换3、从数组中第二个数开始查找,找出最小的元素,与数组第二个数交换……因为每次需要检查数组中的每一个元素,所以每次操作的时间为O(n),并且需要操作n次,所以选择排序总时间为O(n²) public static void selectionSort(int[] arr){ int smallest; //最小值 int smallest_index; //最小值索引 for (in

2020-05-23 12:21:07 185

原创 (JavaSE 学习记录) 迭代器遍历容器元素

迭代器迭代器为我们提供了一种统一遍历容器的方法。除了使用for循环、增强for循环,我们现在可以使用迭代器遍历容器元素。1、获取迭代器 2、通过hasNext()判断是否有下个元素3、通过next()指向下一个元素当遍历时需要删除该元素时,可使用remove()方法。for (Iterator<Integer> iter = set.iterator();iter.hasNext();){ Integer temp = iter.next(); System.ou

2020-05-20 11:57:14 134

原创 (算法入门) 大O表示法

大O表示法大O表示法是一种特殊的表示法,它表示了一个算法到底有多快,注意并不是表示一个算法所需要的具体的时间,而是表示算法运行时间的增速,随着输入的增加,其运行时间将以什么速度增加,有点对运行时间求导数的感觉,其形式为:O(操作数),我们就是通过其中的操作数判断算法的速度。大O表示法指出了最差的情况下的运行时间,例如:对一个含有n个元素的数组进行简单查找(简单查找即对数组中每个元素进行检查,直到找到目标元素)最差的情况就是最后一个元素为目标元素,此时就需要进行n次操作,简单查找的运行时间O(n)就是最

2020-05-19 21:48:04 345

原创 (JavaSE 学习记录) Set接口、HashSet、TreeSet

Set接口Set接口的方法与Collection接口的方法完全一致,由于其特点为无序、不可重复所以与List接口相比,少了索引的有关方法,当要查找元素时只能通过遍历查找,常用的实现类有HashSet、TreeSet等。HashSetHashSet底层使用了HashMap,可以把HashSet看成一个化简之后的HashMap,其化简之处在于,将HashMap的键值对的值对象定义为常量,将想要存入HashSet中的元素作为其底层HashMap的键对象存入底层的HashMap中去。这也是为何HashSet不

2020-05-19 10:56:02 123

原创 (JavaSE 学习记录) Map接口、常用方法

Map接口Map用来存放键值对,键不可重复,重复则覆盖键对应的值。Map接口的实现类有HashMap、TreeMap、HashTable等。HashMap:底层数组加链表,查询效率高,线程不安全。HashTable:和HashMap几乎一样,但加了synchronized,确保线程安全,所以效率下降。TreeMap:红黑二叉树典型实现,大量使用红黑树理论,用法和HashMap相同,效率比HashMap低,需要排序时才使用TreeMap。常用方法 Map<Integer,St

2020-05-17 11:07:19 105

原创 (JavaSE 学习记录) List接口、常用方法

List接口List接口作为Collection的子接口,主要的实现类有ArrayList、LinkedList和Vector。ArrayList:查询效率高,线程不安全LinkedList:增删效率高,线程不安全Vector:线程安全List的特点为有序、可重复。有序,即有索引,可通过索引查找到其中元素;可重复,即可加入.equals()返回为true的重复元素。常用方法: List list = new ArrayList(); list.add("玛卡巴卡"); //

2020-05-16 08:02:47 143

原创 (JavaSE 学习记录) Math类、Random类常用方法

Math类Math类主要用于数学的相关运算。除了以下列出的常用方法外,还有对角度进行处理的方法,例如sin、cos等三角函数,将弧度化为角度,将角度化为弧度的方法——toDegrees()、toRadians(),但对浮点数进行运算时会存在不精确有近似的问题。public class MathTest { public static void main(String[] args) { System.out.println(Math.random()); // [0,1)

2020-05-15 10:18:08 173

原创 (JavaSE 学习记录) Calendar日历类、日历表的打印

Galendar类Galendar类为抽象类,通常使用其子类GregorianCalendar类来实现,其主要用来对日期进行相关展示和计算。对象的创建初始化:可直接通过构造器输入年月日、时分秒或调用setTime()方法丢入Date类对象来创建。Calendar calendar = new GregorianCalendar(2000,12,9,6,20,24);calendar.setTime(new Date());//Date类转化为日历类Date date = calendar.getT

2020-05-14 07:50:49 310

原创 (JavaSE 学习记录) Date类、DateFormat类

Date类Date类的对象表示一个时间的瞬间,精确到毫秒,1s==1000ms。常用方法: Date d1 = new Date();//现在的时间 System.out.println(d1); Date d2 = new Date(0);//Thu Jan 01 08:00:00 CST 1970 System.out.println(d2); long d = new Date().getTime();//返回的是距

2020-05-13 12:07:03 108

原创 (JavaSE 学习记录) StringBuilder和StringBuffer

StringBuilder和StringBufferStringBuilder、StringBuffer二者相似,与String相对,二者为可变字符序列,StringBuilder线程不安全,效率高,而StringBuffer线程安全,效率较低。通常使用StringBuilder。常用方法:append() 为该字符序列添加字符序列insert() 在指定索引处插入字符序列toString() 返回一个String对象delete() 删除一段序列,前闭后开deleteCharAt() 删除索

2020-05-13 09:35:19 107

原创 (JavaSE 学习记录)String类及其常用方法、常量池的简单分析

String类String类对象一旦被初始化,就不可被改变了

2020-05-12 10:52:58 133

原创 (javaSE 学习记录)包装类、自动装箱拆箱、包装类的缓存

包装类Java中基本数据类型不是对象,但有时根据需求需要将其转换为对象并对其操作,这时就需要用到包装类。例如:将基本数据类型存储到Object[]中的操作。基本数据类型包装类intIntegerlongLongdoubleDoublefloatFloatbyteByteshortShortcharCharacterbooleanBoolean包装类的使用JDK1.5后引入了自动装箱拆箱,详见下面代码。 Intege

2020-05-10 19:48:10 114

原创 (JavaSE 学习记录) 数组的冒泡排序与二分法查找

冒泡排序基本思想:通过逐个比较相邻元素,根据结果交换二者值。优化之处:由于可能在排序的过程中已经完成了排序,所以可在每次结束一轮排序时进行判断是否需要继续比较排序。public static int[] sortt(int[] arr){ boolean flag; for (int i =0;i<arr.length-1;i++){ flag = true; for (int j =0;j<arr.lengt

2020-05-09 08:12:17 111

原创 (JavaSE 学习记录)java数组的拷贝,删除一个元素,插入一个元素

数组的拷贝System.arraycopy(被拷贝的数组,开始拷贝处的索引,拷贝到的数组,拷贝到的数组的哪一索引处,拷贝的长度); 例如:String[] arr01= {"比","巴","卜","泡泡","糖"};String[] arr02 = new String[7];System.arraycopy(arr01,0,arr02,1,arr01.length);System.o...

2019-12-22 19:59:04 185

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除