自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Optional类

一、Optional类Optional<T> 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。二、Optional类常用方法创建Optional类对象的方法Option

2021-03-24 10:30:34 110

原创 Stream API

一、Stream概述Stream 是 Java8 中处理集合的关键抽象概念,它可以指定对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。Collection 是一种静态的内存数据结构,而 Stream 是有关计算的。前者是主要面向内存,存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。Stream是数据渠道,用于操作数据源(集合、数组等

2021-03-24 09:43:59 74

原创 方法引用与构造器引用

一、方法引用方法引用可以看做是Lambda表达式深层次的表达。换句话说,方法引用就是Lambda表达式,也就是函数式接口的一个实例,通过方法的名字来指向一个方法。当要传递给Lambda体的操作,已经有实现的方法了,就可以使用方法引用。二、方法引用格式及使用方法类(或对象) :: 方法名对象 :: 非静态方法类 :: 静态方法类 :: 非静态方法public class MethodRefTest { // 情况一:对象 :: 实例方法 要求接口中的抽象方法的形参列表和返回值类型

2021-03-23 21:21:54 379

原创 函数式接口

一、函数式接口只包含一个抽象方法的接口称为函数式接口。我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。可以通过 Lambda 表达式来创建该接口的对象。Lambda表达式的本质就是作为函数式接口的实例。二、Java内置四大核心函数式接口Consumer<T>消费型接口示例 @Test public void test(){ consumerFunction(100,a -> Syst

2021-03-23 19:57:51 112

原创 Lambda表达式

一、Lambda 表达式Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。二、Lambda 表达式示例 @Test public void test(){ Runnable r1 = new Runnable() { @Override public void run() { System

2021-03-23 17:57:03 162

原创 反射——动态代理

一、代理设计模式的原理使用一个代理将对象包装起来, 然后用该代理对象取代原始对象。任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上。静态代理:特征是代理类和目标对象的类都是在编译期间确定下来,不利于程序的扩展。每一个代理类只能为一个接口服务,这样一来程序开发中必然产生过多的代理。动态代理:是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象。动态代理相比于静态代理的优点:抽象角色中(接口)声明的所有方法都被转移到调用处理器

2021-03-23 16:46:41 101

原创 反射——调用运行时类的指定结构

调用运行时类的指定结构1、调用指定的属性操作运行时类指定的属性 @Test public void testField() throws IllegalAccessException, InstantiationException, NoSuchFieldException { Class clazz = Person.class; //创建运行时类的对象 Person p = (Person)clazz.newInstance();

2021-03-23 14:37:15 128

原创 反射——获取运行时类的完整结构

获取运行时类的属性结构以及内部结构创建泛型父类Creaturepublic class Creature<T> implements Serializable{ private char gender; public double weight; private void breath(){ System.out.println("生物呼吸"); } public void eat(){ System.out.pri

2021-03-23 13:38:47 94

原创 反射——创建运行时类的对象

一、创建运行时类的对象通过创建的运行时类的对象,进而创建类的对象。 @Test public void test() throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException { Class clazz = Person.class; /* * newInstance()方法可以创建对应的运行时

2021-03-23 10:03:23 254 1

原创 类的加载和ClassLoader

一、类的加载过程当程序主动使用某个类时,如果该类还未被加载到内存中,则系统会通过如下三个步骤来对该类进行初始化。类的加载将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象,作为方法区中类数据的访问入口(即引用地址)。所有需要访问和使用类数据只能通过这个Class对象。这个加载的过程需要类加载器参与。类的链接将Java类的二进制代码合并到JVM的运行状态之中的过程:验证:确保加载的类信息符合JVM规范

2021-03-23 09:01:38 135

原创 Java的反射机制

一、反射机制概述反射是被视为动态语言的关键,反射机制允许程序在执行期借助于反射API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以形象的称之为反射。Java反射机制提供的功能:在运行时判断任意一个对象所属的类。在运行时构造任意一个类的对象。在运行时判断

2021-03-23 08:15:46 63

原创 URL网络编程

一、URL类URL(Uniform Resource Locator)统一资源定位符,它表示 Internet 上某一资源的地址。URL的基本结构由5部分组成: <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表。二、URL类常用方法为了表示URL,java.net 中实现了类 URLpublic class URLTest { public static void main(String[] args) throws

2021-03-23 08:07:15 117

原创 UDP网络编程

UDP网络编程类 DatagramSocket 和 DatagramPacket 实现了基于 UDP 协议网络程序。UDP数据报通过数据报套接字 DatagramSocket 发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。DatagramPacket 对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址和端口号。使用UDP发送端给接收端发送数据public class UDPTest { @Test pub

2021-03-22 20:42:29 56

原创 基于Socket的TCP网络编程

一、基于Socket的TCP编程Java语言的基于套接字编程分为服务端编程和客户端编程,其通信模型如图所示:客户端Socket的工作过程创建Socket对象,指明服务器端的ip和端口号。获取一个输出流,用于输出数据。写出数据的操作。资源的关闭。服务器端ServerSocket的工作过程创建服务器端的ServerSocket,指明自己的端口号。调用accept()表示接收来自于客户端的socket。获取输入流。读取输入流中的数据。关闭资源。示例一:客户端发送信息给服务端,服

2021-03-22 18:17:11 293

原创 网络编程——InetAddress类

InetAddress类InetAddress类没有提供公共的构造器,而是提供了如下几个静态方法来获取InetAddress实例public static InetAddress getLocalHost()public static InetAddress getByName(String host)InetAddress提供了如下几个常用的方法:public String getHostAddress():返回 IP 地址字符串(以文本表现形式)。public String getHo

2021-03-22 16:35:07 396

原创 IO流——随机存取文件流

一、RandomAccessFile类RandomAccessFile 声明在java.io包下,但直接继承于java.lang.Object类。并且它实现了DataInput、DataOutput这两个接口,也就意味着这个类既可以读也可以写。RandomAccessFile 类支持 “随机访问” 的方式,程序可以直接跳到文件的任意地方来读、写文件。支持只访问文件的部分内容,也可以向已存在的文件后追加内容。RandomAccessFile 对象包含一个记录指针,用以标示当前读写处的位置。long g

2021-03-22 14:56:18 187

原创 IO流——对象流

一、对象流包括ObjectInputStream和OjbectOutputSteam。用于存储和读取基本数据类型数据或对象的处理流。可以把对象写入到数据源中,也能把对象从数据源中还原回来。序列化指的是用ObjectOutputStream类保存基本类型数据或对象的机制。反序列化指的是ObjectInputStream类读取基本类型数据或对象的机制。ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。二、对象的序列化

2021-03-22 14:13:55 261

原创 打印流、数据流

一、打印流实现将基本数据类型的数据格式转化为字符串输出。打印流:PrintStream和PrintWriter提供了一系列重载的print()和println()方法,用于多种数据类型的输出。PrintStream和PrintWriter的输出不会抛出IOException异常。PrintStream和PrintWriter有自动flush功能。PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。

2021-03-22 10:38:08 202

原创 IO流——标准输入/输出流

一、标准输入/输出流System.in和System.out分别代表了系统标准的输入和输出设备。System.in的类型是InputStream。System.out的类型是PrintStream,它是OutputStream的子类,FilterOutputStream 的子类。通过System类的setIn和setOut方法可以对默认设备进行改变,从而实现重定向。public static void setIn(InputStream in)和public static void setOut(

2021-03-22 10:24:52 214

原创 IO流——转换流

一、转换流转换流提供了在字节流和字符流之间的转换。转换流也属于字符流。InputStreamReader:将InputStream转换为Reader。OutputStreamWriter:将Writer转换为OutputStream。字节流中的数据都是字符时,转成字符流操作更高效。很多时候使用转换流来处理文件乱码问题。实现编码和解码的功能。二、InputStreamReader的使用使用InputStreamReader将字节流转换成字符流读出文件内容 @Test pub

2021-03-22 09:54:47 1421

原创 IO流——缓冲流

一、缓冲流为了提高数据读写的速度,Java API提供了带缓冲功能的流类,在使用这些流类时,会创建一个内部缓冲区数组,缺省使用8192个字节(8Kb)的缓冲区。缓冲流要“套接”在相应的节点流之上,根据数据操作单位可以把缓冲流分为:BufferedInputStream 和 BufferedOutputStreamBufferedReader 和 BufferedWriter当读取数据时,数据按块读入缓冲区,其后的读操作则直接访问缓冲区。当使用BufferedInputStream读取字节文件时

2021-03-22 08:29:57 288

原创 IO流——节点流

节点流(或文件流)实现操作文件FileReader字符输入流FileReader读入数据基本操作 //将file1.txt文件内容读入内存,并输出到控制台 @Test public void test() { FileReader fileReader = null; try { //实例化File类的对象,指明要操作的文件 File file = new File("file1.txt");

2021-03-21 22:19:06 84

原创 File类的使用

一、File类java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关。File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个File对象,但是Java程序中的一个File对象,可能没有一个真实存在的文件或目录。File对象可以作为参数传递给流的构造器。二、常用构造器public File(String pathname)以pathnam

2021-03-21 19:55:38 142

原创 泛型在集合中的使用

一、泛型的概念集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection<E>,List<E>,ArrayList<E> 这个<E>就是类型参数,即泛型。所谓泛型,就是允许

2021-03-21 14:10:25 341

原创 Collections工具类的使用

一、Collection工具类Collections 是一个操作 Set、List 和 Map 等集合的工具类。Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作,还提供了对集合对象设置不可变、对集合对象实现同步控制等方法。二、Collections常用方法排序操作reverse(List):反转 List 中元素的顺序。shuffle(List):对 List 集合元素进行随机排序。sort(List):根据元素的自然顺序对指定 List 集合元素按升

2021-03-21 13:19:20 103

原创 LinkedHashMap的底层实现原理

LinkedHashMap的底层实现原理LinkedHashMap 是 HashMap 的子类,在HashMap存储结构的基础上,使用了一对双向链表来记录添加元素的顺序。LinkedHashMap底层使用的结构与HashMap相同,因为LinkedHashMap继承于HashMap.二者之间的区别就在于LinkedHashMap内部提供了Entry替换HashMap中的Node。实例化LinkedHashMap时,空参的构造器源码如下 /** * Constructs an empty

2021-03-20 02:58:42 989

原创 HashMap的底层实现原理

一、HashMap的底层实现原理HashMap在jdk7中实现原理:HashMap map = new HashMap()在实例化以后,底层创建了长度是16的一维数组Entry[] table。map.put(key1,value1)首先,调用key1所在类的hashCode()计算key1哈希值,此哈希值经过某种算法计算以后,得到在Entry数组中的存放位置。如果此位置上的数据为空,此时的key1-value1添加成功。如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表

2021-03-20 02:27:43 308

原创 Map接口

一、Map接口继承树二、Map接口概述Map与Collection并列存在,用于保存具有映射关系的数据key-value。Map 中的 key 和 value 都可以是任何引用类型的数据。Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。常用String类作为Map的“键”。key 和 value 之间存在单向一对一关系,即通过指定的 key 总能找到唯一的、确定的 value。Map接口的常用实现类:Ha

2021-03-20 00:31:44 211

原创 Collection子接口——Set接口

一、Set接口概述Set接口是Collection的子接口,set接口没有提供额外的方法。Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败。Set 判断两个对象是否相同不是使用 == 运算符,而是根据 equals() 方法。二、Set接口实现类——HashSetHashSet 是 Set 接口的典型实现,大多数时候使用 Set 集合时都使用这个实现类。它是线程不安全的,可以存储null值。HashSet 按 Hash 算法来存储集合中的元素

2021-03-19 23:21:21 181

原创 Collection子接口——List接口

一、List接口概述List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。JDK API中List接口的实现类常用的有ArrayList、LinkedList和Vector。二、List接口方法List除了从Collection集合继承的方法外,List 集合里添加了一些根据索引来操作集合元素的方法。void add(int index, Object ele):在index位

2021-03-19 15:35:43 123

原创 Collection接口

一、单列集合框架结构|----Collection接口:单列集合,用来存储一个一个的对象           |----List接口:存储有序的、可重复的数据。 -->“动态”数组                 &n

2021-03-19 10:50:20 118

原创 Java注解的使用

一、注解 (Annotation) 概述从 JDK 5.0 开始, Java 增加了对元数据(MetaData) 的支持, 也就是Annotation(注解)。Annotation 其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用 Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。Annotation 可以像修饰符一样被使用

2021-03-18 22:31:13 326

原创 Java比较器

一、Java比较器Java中的对象,正常情况下,只能进行比较 == 或 != 。不能使用 > 或 < 的但是在开发场景中,我们需要对多个对象进行排序,就需要比较对象的大小。可以使用两个接口中的任何一个Comparable 或 Comparator。二、使用Comparable接口进行自然排序像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。重写compareTo()方法以后,可以进行从小到大的排列。重写co

2021-03-18 14:18:55 113

原创 StringBuffer类和StringBuilder类

一、String、StringBuffer、StringBuilder三者的对比String:不可变的字符序列;底层使用char[]存储。StringBuffer:可变的字符序列;线程安全的,效率低;底层使用char[]存储。StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用char[]存储。二、StringBuffer源码分析对于String类,如果创建一个对象,底层实现如下:String str = new String();//char[]

2021-03-17 20:53:28 82

原创 对字符串中字符进行自然顺序排序

对字符串中字符进行自然顺序排序代码实现 public static String sort(String str){ char[] c = str.toCharArray(); //字符串变成字符数组 Arrays.sort(c); return new String(c); //将排序后的数组变成字符串 } @Test public void test4(){ String s1 = "abcwerthelloyuiodef"; .

2021-03-17 16:23:11 456

原创 获取两个字符串中最大相同子串

获取两个字符串中最大相同子串。比如:str1 = "abcwerthelloyuiodef“;str2 = “cvhellobnm”代码实现 public static List<String> getMaxSubString(String str1,String str2){ String maxStr = (str1.length() > str2.length())? str1 : str2; String minStr = (str1.length() < .

2021-03-17 16:17:33 906

原创 一个字符串在另一个字符串中出现的次数

获取一个字符串在另一个字符串中出现的次数。比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数代码实现 public static int getTime(String s1, String s2){ int count = 0; for (int i = 0; i < s1.length(); i++){ //使用for循环逐个比较以s2开头的子字符串 if (s1.startsWith(s2.

2021-03-17 15:51:16 2555 1

原创 字符串中指定部分进行反转

将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”代码实现 public static String reverseStr(String s, int start, int end){ char[] chars = s.toCharArray(); return reverseArray(chars, start, end); } public static String reverseArray(char[] char.

2021-03-17 15:39:07 687

原创 字符串相关的常用方法(大全)

一、概述String类代表字符串,java程序中所有字符串字面值(如"abc")都作为此类的实例实现。String是一个final类,代表不可变的字符序列。字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。String对象的字符内容是存储在一个字符数组value[]中的。String实现了Serializable接口,表示字符串是支持序列化的。String实现了Comparable接口,表示String可以比较大小。通过字面量的方式(区别于new给一个字符串赋值,此时的字符串值声

2021-03-17 10:36:08 424

原创 线程创建——使用线程池

一、使用线程池经常的创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。提前创建好多个线程,放入到线程池中,使用时直接获取,使用完放回到线程池中,这样就可以避免频繁创建销毁、实现重复利用。线程池的好处:提高响应速度(减少了创建新线程的时间)降低资源消耗(重复利用线程池中线程,不需要每次都创建)便于线程管理:corePoolSize核心池的大小、maximumPoolSize最大线程数、keepAliveTime线程没有任务时最多保持多长时间后会终止二、线程池相关APIJD

2021-03-17 02:43:47 385

空空如也

空空如也

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

TA关注的人

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