JavaSE学习记录
Sagittarius_FV
这个作者很懒,什么都没留下…
展开
-
(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 阅读 · 0 评论 -
(JavaSE 学习记录) GOF23设计模式之代理模式
代理模式核心作用:通过代理控制对对象的访问。详细控制某个对象的方法。是面向切面编程核心实现机制(AOP)核心角色:1、抽象角色:定义代理和真实角色公共的对外方法2、代理角色:实现抽象角色,是真实角色的代理,通过调用真实角色的方法实现抽象方法,并符加自己的操作。3、真实角色:实现抽象角色,定义自己所要实现的操作方法,供代理调用。静态代理抽象角色public interface MakkaPakka { void sing(); void dance();}真实角色pu原创 2020-07-17 11:33:35 · 114 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(JavaSE 学习记录) GOF23设计模式之原型模式
浅克隆与深克隆对对象进行复制,创建出新的对象,新对象保留原对象的所有属性的值。浅克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向同一个对象。深克隆:对于引用类型的成员变量,被克隆与克隆生成的对象指向不同的对象。浅克隆:需要继承Cloneable接口才能对该类对象进行克隆。通过clone()方法返回 克隆出的对象。import java.util.Date;public class MakkaPakka implements Cloneable{ private int ag原创 2020-07-16 11:12:44 · 114 阅读 · 0 评论 -
(JavaSE 学习记录) GOF23设计模式之建造者模式
建造者模式实现复杂产品部件组装的步骤的调控。原创 2020-07-16 08:41:49 · 120 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(JavaSE 学习记录) GOF设计模式之单例模式
五种常见单例模式实现方式1、饿汉式(线程安全、调用效率高、不可延时加载)2、懒汉式(线程安全、调用效率不高、可延时加载)3、双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议用)4、静态内部类式(线程安全、调用效率不高、可延时加载)5、枚举单例(线程安全、调用效率高、不可延时加载)饿汉式public class SingletonDemo01 { private static SingletonDemo01 instance = new SingletonDemo01();原创 2020-07-14 18:55:06 · 143 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(JavaSE 学习记录) 类加载器的层次结构
类加载器的层次结构(树状结构)引导类加载器(bootstrap class loader)扩展类加载器(extensions class loader)应用类加载器(application class loader)自定义加载器类加载器的代理模式双亲委托机制:接到加载类的请求时,将加载任务交给父类加载器,最后从上往下判断能否加载,能则加载,不能则交给子类。保证了Java核心库的类型安全。...原创 2020-07-11 07:54:52 · 121 阅读 · 0 评论 -
(JavaSE 学习记录) 类加载的过程
类加载的过程大致分为:加载、链接(验证,准备,解析)、初始化。加载将class文件字节码加载到内存中,把这些静态数据转化为方法区中的运行时数据结构,并在堆中生成一个class对象,依靠这个class对象可以对方法区中的数据进行访问。链接验证:确保符合规范,安全。准备:为类变量(static变量)分配内存,设置初始值,这些内存都在方法区中分配。解析:虚拟机常量池内的符号引用替换为直接引用。初始化执行类构造器()方法,若初始化一个类时其父类未被初始化,先对父类进行初始化。虚拟机保证一个类()原创 2020-07-11 07:50:54 · 92 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 · 315 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(JavaSE 学习记录) IO流之缓冲字节流 BufferedInputStream、BufferedOutputStream
缓冲字节流原创 2020-07-10 09:01:34 · 117 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 · 124 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(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 · 311 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(JavaSE 学习记录) StringBuilder和StringBuffer
StringBuilder和StringBufferStringBuilder、StringBuffer二者相似,与String相对,二者为可变字符序列,StringBuilder线程不安全,效率高,而StringBuffer线程安全,效率较低。通常使用StringBuilder。常用方法:append() 为该字符序列添加字符序列insert() 在指定索引处插入字符序列toString() 返回一个String对象delete() 删除一段序列,前闭后开deleteCharAt() 删除索原创 2020-05-13 09:35:19 · 108 阅读 · 0 评论 -
(JavaSE 学习记录)String类及其常用方法、常量池的简单分析
String类String类对象一旦被初始化,就不可被改变了原创 2020-05-12 10:52:58 · 133 阅读 · 0 评论 -
(JavaSE 学习记录)Java标识符的规范使用
标识符用来给包、类、方法、变量命名,需要遵守以下规则:标识符必须以字母、下划线_、美元符号$开头,其余部分还可以使用数字。标识符不可以是Java的关键字。表示类名的标识符,每个单词的首字母最好要大写。如Human表示方法和变量的标识符,最好第一个单词小写,从第二个单词开始首字母大写,即“驼峰原则”。如finalFantasy()...原创 2019-12-22 13:29:07 · 129 阅读 · 0 评论 -
(JavaSE 学习记录)Java运算符
算术运算符注意项如果两个操作数有一个为Long, 则结果也为Long。没有long时,结果为int。即使操作数全为short,byte,结果也是int。如果两个操作数有一个为double,则结果为double。只有两个操作数都是float,则结果才为float。逻辑运算符& 与、| 或、! 非(ture则返回false,false则返回ture)、^ 异或(...原创 2019-12-22 13:28:03 · 139 阅读 · 0 评论 -
(JavaSE 学习记录)Java基本数据类型和常用转义字符
基本数据类型类型占用空间(字节)范围byte1-128 ~ 127short2-32768 ~ 32767int4约21亿long8-263 ~ 263-1float4-3.403E38 ~ 3.403E38double8-1.798E308~1.798E308char2boolean类型有两个常量值...原创 2019-12-22 13:30:33 · 100 阅读 · 0 评论 -
(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 阅读 · 0 评论 -
(javaSE 学习记录)包装类、自动装箱拆箱、包装类的缓存
包装类Java中基本数据类型不是对象,但有时根据需求需要将其转换为对象并对其操作,这时就需要用到包装类。例如:将基本数据类型存储到Object[]中的操作。基本数据类型包装类intIntegerlongLongdoubleDoublefloatFloatbyteByteshortShortcharCharacterbooleanBoolean包装类的使用JDK1.5后引入了自动装箱拆箱,详见下面代码。 Intege原创 2020-05-10 19:48:10 · 114 阅读 · 0 评论 -
(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 阅读 · 0 评论