自定义博客皮肤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)
  • 收藏
  • 关注

原创 Lambda表达式的代码演示

6、Lambda表达式6.1无参数无返回值@Test public void test1(){ Runnable run1 = new Runnable() { @Override public void run() { System.out.println("传统方式的Runnable"); } }; Thread t1 = new Threa

2022-05-12 15:22:56 274

原创 Java IO(NIO、AIO)代码演示

5、Java IO5.1、NIO服务端代码服务端接受客户端发送的消息输出,并给客户端发送一个消息 //创建多路复用选择器Selector Selector selector=Selector.open(); //创建一个通道对象Channel,监听9001端口 ServerSocketChannel channel = ServerSocketChannel.open().bind(new InetSocketAddress(9001));

2022-05-12 15:21:38 402

原创 JDK动态代理的实现与测试

4、JDK动态代理1、需要动态代理的接口: /** * 需要动态代理的接口 */public interface Subject{ /** * 你好 * * @param name * @return */ public String SayHello(String name); /** * 再见 * * @return */ public String SayGood

2022-05-11 08:46:19 227

原创 2个例子看懂Java多态性

3、多态性例1:public class demo04 { public static void main(String[] args) { People p=new Stu(); p.eat(); //调用特有的方法 Stu s=(Stu)p; s.study(); //((Stu) p).study(); }}class People{ public void eat(){

2022-05-11 08:43:53 229

原创 一个代码例子看懂Java反射机制

2、反射1、获取Class对象的三种方式package fanshe;/** * 获取Class对象的三种方式 * 1 Object ——> getClass(); * 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性 * 3 通过Class类的静态方法:forName(String className)(常用) * */public class Fanshe { public static void main(String[] args) { //第一

2022-05-10 10:18:02 84

原创 1、Java序列化(实例、代码实现)

1、Java序列化首先创建一个对象,并实现Serializable接口:import java.io.Serializable;public class User implements Serializable{ //注意这里Serializable是关键 private static final long serialVersionUID = 1L; private String name; private int age; public String

2022-05-10 10:14:26 677

原创 34、对象拷贝(对象克隆)

34、对象拷贝34.1 为什么要使用克隆?想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。34.2 如何实现对象克隆?有两种方式:1). 实现Cloneable接口并重写Object类中的clone()方法;2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译

2022-05-08 08:36:10 370

原创 30、注解

30、注解30.1、简述注解Java 注解用于为 Java 代码提供元数据。作为元数据,注解不直接影响你的代码执行,但也有一些类型的注解实际上可以用于这一目的。其可以用于提供信息给编译器,在编译阶段时给软件提供信息进行相关的处理,在运行时处理写相应代码,做对应操作。30.2、简述元注解元注解可以理解为注解的注解,即在注解中使用,实现想要的功能。其具体分为:@Retention: 表示注解存在阶段是保留在源码,还是在字节码(类加载)或者运行期(JVM 中运行)。@Target:表示注解作用的范

2022-05-08 08:35:49 64

原创 28、Java异常

28、Java异常28.1、简述 Java 异常的分类Java 异常分为 Error(程序无法处理的错误),和 Exception(程序本身可以处理的异常)。这两个类均继承 Throwable类。Error 常见的有 StackOverFlowError、OutOfMemoryError 等等。Exception 可分为运行时异常和非运行时异常。对于运行时异常,可以利用 try catch 的方式进行处理,也可以不处理。对于非运行时异常,必须处理,不处理的话程序无法通过编译。28.2、简述 th

2022-05-08 08:35:28 65

原创 27、为什么要把 String 设计为不可变?

27、为什么要把 String 设计为不可变?节省空间:字符串常量存储在 JVM 的字符串池中可以被用户共享。提高效率:String 可以被不同线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。安全:String 常被用于用户名、密码、文件名等使用,由于其不可变,可避免黑客行为对其恶意修改。...

2022-05-08 08:35:08 81

原创 26、Java 语言中关键字 static 的作用是什么?

26、Java 语言中关键字 static 的作用是什么?static 的主要作用有两个:为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间。使得某个方法或属性与类而不是对象关联在一起,即在不创建对象的情况下可通过类直接调用方法或使用类的属性。具体而言 static 又可分为 4 种使用方式:修饰成员变量。用 static 关键字修饰的静态变量在内存中只有一个副本。只要静态变量所在的类被加载,这个静态变量就会被分配空间,可以使用“类.静态变量”和“对象.静态变量”的方法使用。修

2022-05-08 08:34:40 403

原创 25、抽象类

25、抽象类25.1、接口和抽象类的相同点和不同点?相同点:都不能被实例化。接口的实现类或抽象类的子类需实现接口或抽象类中相应的方法才能被实例化。不同点:接口只能有方法定义,不能有方法的实现,而抽象类可以有方法的定义与实现。实现接口的关键字为 implements,继承抽象类的关键字为 extends。一个类可以实现多个接口,只能继承一个抽象类。当子类和父类之间存在逻辑上的层次结构,推荐使用抽象类,有利于功能的累积。当功能不需要,希望支持差别较大的两个或更多对象间的特定交互行为,推荐使

2022-05-08 08:34:05 194

原创 22、为什么 Java 语言不支持多重继承?

22、为什么 Java 语言不支持多重继承?为了程序的结构能够更加清晰从而便于维护。假设 Java 语言支持多重继承,类 C 继承自类 A 和类 B,如果类 A 和 B 都有自定义的成员方法 f(),那么当代码中调用类 C 的 f() 会产生二义性。Java 语言通过实现多个接口间接支持多重继承,接口由于只包含方法定义,不能有方法的实现,类 C 继承接口 A 与接口 B 时即使它们都有方法f(),也不能直接调用方法,需实现具体的f()方法才能调用,不会产生二义性。多重继承会使类型转换、构造方法的调用顺

2022-05-08 08:33:40 482

原创 3、垃圾回收(CMS、G1、检查算法、回收方法、GC)

3、垃圾回收 (发生在堆和方法区中)3.1、典型垃圾回收器CMS简介 以获取最短回收停顿时间为目标的收集器,它是一种并发收集器,采用的是 Mark-Sweep 算法。场景 如果你的应用需要更快的响应,不希望有长时间的停顿,同时你的 CPU 资源也比较丰富,就适合适用 CMS 收集器。垃圾回收步骤:初始标记 (Stop the World 事件 CPU 停顿, 很短) 初始标记仅标记一下 GC Roots能直接关联到的对象,速度很快;并发标记 (收集垃圾跟用户线程一起执行) 并发标记过程就

2022-05-08 08:33:11 586

原创 2、Java 类加载机制(过程)、双亲委派机制

2、Java 类加载机制(多理解)2.1 类的加载方式类加载分为动态加载和静态加载。动态加载是从外存储器中加载类,一般类加载机制分析的也是动态加载。而静态加载本质上是从内存中创建类的实例对象,此时类已经被加载到内存中。一.静态加载通过new关键字来创建Test的实例对象。二.动态加载通过Class.forName()来加载类,然后调用类的newInstance()方法实例化对象。通过类加载器的loadClass()方法来加载类,然后调用类的newInstance()方法

2022-05-07 09:10:36 808

原创 1、Java 内存结构

1、Java 内存结构1.1、Java 内存模型堆 由线程共享,存放 new 出来的对象,是垃圾回收器的主要工作区域。栈 线程私有,分为 Java 虚拟机栈和本地方法栈,存放局部变量表、操作栈、动态链接、方法出口等信息,方法的执行对应着入栈到出栈的过程。方法区 线程共享,存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等信息,JDK 1.8 中方法区被元空间取代,使用直接内存。本地方法栈:Native关键字,凡是被Native修饰的方法,都会去调用底层的C语言的库,会调用JN

2022-05-07 09:10:21 5437 2

原创 4、同步、并发、串行、CAS、AQS

13、同步、并发13.1、并行和并发有什么区别?(还有串行)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。串行在时间上可能发生重叠,前一个任务没搞定,下一个任务就只能等着(单向单车道,没有超车道)并行在时间上是重叠的,两个任务在同一时刻

2022-05-07 09:10:05 110

原创 3、ThreadLocal

12、ThreadLocal12.1、ThreadLocal的使用场景场景 主要用途是为了保持线程自身对象和避免参数传递,主要适用场景是按线程多实例(每个线程对应一个实例)的对象的访问,并且这个对象很多地方都要用到。原理 为每个线程创建变量副本,不同线程之间不可见,保证线程安全。使用 ThreadLocalMap 存储变量副本,以 ThreadLocal 为 K,这样一个线程可以拥有多个 ThreadLocal 对象。实际 使用多数据源时,需要根据数据源的名字切换数据源,假设一个线程设置了一个数据源

2022-05-07 09:09:49 82

原创 2、线程、线程常用方法、线程池

5、 wait() 与 sleep()区别?1、来自不同的类​ wait() 方法声明在 Object 中,sleep() 方法声明在 Thread 中。2、有没有释放锁​ wait() 释放锁,sleep() 没有释放锁。3、使用范围不同​ wait,notify,notifyAll只能在同步控制方法或同步控制块里面使用,而sleep可以在任何地方使用4、是否需要捕获异常​ sleep必须捕获异常,而wait,notify,notifyAll不需要捕获异常6、 yield()调用后线程

2022-05-07 09:09:33 176

原创 1、synchronized、Lock、volatile

1、synchronized1.1 synchronized原理修饰代码块 底层实现,通过 monitorenter & monitorexit 标志代码块为同步代码块。修饰方法 底层实现,通过 ACC_SYNCHRONIZED 标志方法是同步方法。修饰类 class 对象时,实际锁在类的实例上面。单例模式public class Singleton { private static volatile Singleton instance = null; private Singl

2022-05-07 09:09:13 1395

原创 4、迭代器 Iterator

4、迭代器 Iterator4.1 迭代器 Iterator是什么?迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。4.2、Iterator 怎么使用?有什么特点?Java中的Iterator功能比较简单,并且只能单向移动:(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方

2022-05-07 09:08:52 52

原创 3、Set(唯一值)(HashSet、TreeSet)

3、Set(唯一值)3.1、HashSet 的实现原理存储结构:哈希表(数组+链表+红黑树)HashSet 基于 HashMap 实现,使用了 HashMap 的 K 作为元素存储,V 为 new Object() ,在 add() 方法中如果两个元素的 Hash 值相同,则通过 equals 方法比较是否相等。LinkedHashSet LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的。TreeSet 红黑树实现有序唯一。3.1.1

2022-05-07 09:08:34 159

原创 2、Map(HashTable、LinkedHashMap、HashMap、TreeMap、ConcurrentHashMap)

2、Map(K-V 对)2.1、概述a、HashMap( HashMap 的实现原理?)底层数据结构,JDK 1.8 是数组 + 链表 + 红黑树,JDK 1.7 无红黑树。链表长度大于 8 时,转化为红黑树,优化查询效率。初始容量为 16,通过 tableSizeFor 保证容量为 2 的幂次方。寻址方式,高位异或,(n-1)&h 取模,优化速度。扩容机制,当元素数量大于容量 x 负载因子 0.75 时,容量扩大为原来的 2 倍,新建一个数组,然后转移到新数组。b、基于 Ma

2022-05-07 09:08:13 282

原创 1、List(ArrayList、Vector、LinkedList)

1、List(线性结构)ArrayList Object[] 数组实现,默认大小为 10 ,支持随机访问,连续内存空间,插入末尾时间复杂度 o(1),插入第 i 个位置时间复杂度 o(n - i)。扩容,大小变为 1.5 倍,Arrays.copyOf(底层 System.ArrayCopy),复制到新数组,指针指向新数组。Vector 类似 ArrayList,线程安全,扩容默认增长为原来的 2 倍,还可以指定增长空间长度。LinkedList 基于链表实现,1.7 为双向链表,1.6 为双

2022-05-07 09:07:53 73

原创 21、Java 代码块执行顺序

21、Java 代码块执行顺序父类静态代码块(只执行一次)子类静态代码块(只执行一次)父类构造代码块父类构造函数子类构造代码块子类构造函数普通代码块

2022-05-06 09:59:46 260

原创 20、JDK 与 JRE 有什么区别?

20、JDK 与 JRE 有什么区别?JDK:Java 开发工具包(Java Development Kit),提供了 Java 的开发环境和运行环境。JRE:Java 运行环境(Java Runtime Environment),提供了 Java 运行所需的环境。JDK 包含了 JRE。如果只运行 Java 程序,安装 JRE 即可。要编写 Java 程序需安装 JDK....

2022-05-06 09:58:05 273

原创 19、Java 语言具有哪些特点(与C++的区别)?以及Java常用的包

19、Java 语言具有哪些特点?Java 为纯面向对象的语言。它能够直接反应现实生活中的对象。具有平台无关性(跨平台性)。Java 利用 Java 虚拟机运行字节码,无论是在 Windows、Linux 还是 MacOS 等其它平台对 Java 程序进行编译,编译后的程序可在其它平台运行。Java 为解释型语言,编译器把 Java 代码编译成平台无关的中间代码,然后在 JVM 上解释运行,具有很好的可移植性。Java 提供了很多内置类库。如对多线程支持,对网络通信支持,最重要的一点

2022-05-06 09:55:10 546

原创 18、String字符串的常见问题和常用方法

18、String字符串的常用方法 == 比较地址.equals() 比较内容.equalsIgnoreCase() 忽略大小写比较是否相同.charAt(); 字符串截取出指定的下标开始.compareTo() 比较大小.compareToIgnore() 忽略大小比较.concat() 将参数字符串连接到指定字符

2022-05-06 09:53:12 217

原创 17、装箱拆箱

17、装箱拆箱1、装箱:把基本数据类型转成包装类类型2、拆箱:把包装类类型转成基本数据类型3、为什么要包装类八种基本数据类型不满足面向对象的思想,不包括属性和方法。如果给基本数据类型添加功能,只能创建其包装类,将方法和属性封装进去...

2022-05-06 09:51:30 50

原创 16、设计模式(单例、工厂、建造者、装饰者等)

16、设计模式(####)16.1、OOP七大原则16.1 你了解哪些工厂模式?(最好结合例子来学习)1、单例模式分类:懒汉式、饿汉式1、构造方法私有化2、在本类中创建本类对象3、保证对象的唯一性final4、给外界提供得到对象的方法 static5、在多线程中,饿汉式安全,懒汉式不安全2、简单工厂模式批量创建对象1 创建工厂类 : 创建对象的方法2 果汁类 是所有种类果汁的父类3 在工厂类的方法中返回果汁类4 根据测试类中传递的字符串判断到底返回哪种果汁5 测试类通过

2022-05-06 09:41:34 123

原创 15、作用域public、private、protected 以及不写时的区别

15、作用域public、private、protected 以及不写时的区别?private修饰的成员变量和函数只能在类本身和内部类中被访问protected 修饰的成员变量和函数能被类本身、子类及同一个包中的类访问public修饰的成员变量和函数可以被类、子类、同一个包中的类以及任意其他类访问默认情况(不写)下,属于一种包访问,即能被类本身以及同一个包中的类访问(friendly)作用域当前类统一package子孙类其他packagepublic√√√√

2022-05-06 09:35:53 797

原创 14、“==“和[equals]

14、"=="和equals方法究竟有什么区别?==:对比的是栈中的值,基本数据类型时变量值,引用类型时队中内存对象的地址equals:用于比较两个独立对象的内容是否相同,字符串的比较也用equals,通常会重写,重写后比较的是值...

2022-05-06 09:29:53 154

原创 13、面向对象的三大特征、五大原则

13、面向对象13.1、面向对象的三大特征1.封装作用:提高代码的安全性1、将属性(成员变量)私有化,并提供对外界的接口(get/set方法)。2、用private修饰的属性和方法,只能在本类中使用。2.继承作用:提高代码的复用性,减少重复代码1、子类可以继承父类非私有的属性和方法,不能继承构造方法和私有的属性和方法。2、可以综合子类的共同特征来去提炼父亲的类。3、子类在继承父类的各种属性和方法时,也可以有自己的属性和方法。4、一个子类只能有一个父类,java只能单继承,不能多继承,因

2022-05-06 09:18:14 568

原创 12、&和&&的区别

12、&和&&的区别?&:逻辑与(and),运算符两边的表达式均为true时,整个结果才为true&&:短路与,如果第一个表达式为false时,第二个表达式就不会计算了

2022-05-06 09:14:36 158

原创 9、Java IO(BIO、NIO、AIO)、常用方法

9、Java IO9.1 java 中 IO 流分为几种?按功能来分输入流(input)、输出流(output)按类型来分字节流(8Byte)和字符流(16Byte)字节流和字符流的区别是:字节流按 8 位传输以字节为单位输入输出数据,字符流按 16 位传输以字符为单位输入输出数据。9.2 BIO、NIO、AIO 有什么区别?BIOBlock IO 同步阻塞式 IO,就是我们平常使用的传统 IO,它的特点是模式简单使用方便,并发处理能力低。(一个请求独占一个线程

2022-05-05 11:35:26 585

原创 8、JDK动态代理

8、JDK动态代理代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性。使用步骤1,通过实现 InvocationHandler 接口创建自己的调用处理器;// InvocationHandlerImpl 实现了 Invocation

2022-05-05 10:56:19 77

原创 7、java反射

7、java反射7.1 什么是反射?JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。通俗地将,我们在创建每一个类的时候,都会生成一个.class的蓝图,反射就是说,拿(Class<?> a = people.class)到了这个蓝图 拿到蓝图后,我们能干嘛呢? 1、知道人都那些属性(成员变量) 2、知道人

2022-05-05 10:54:41 76

原创 6、java关键字

6、关键字6.1、final最终的-修饰基本类型变量,一经出初始化后就不能够对其进行修改。-修饰引用类型变量,不能够指向另一个引用。- 修饰类:表示类不可被继承- 修饰方法:表示方法不可被子类覆盖,但是可以重载- 修饰变量:表示变量一旦被赋值就不可以更改它的值6.2、Static6.3、this和super...

2022-05-05 10:52:27 322

原创 5、重载与重写

5、重载与重写重载: 发生在同一个类中,方法名相同,参数的类型、个数、顺序不同,方法的返回值和修饰符可以不同。重写: 发生在父子类中,方法名和参数列表相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为 private 或者 final 则子类就不能重写该方法。5.1、构造器(constructor)是否可被重写(override)构造器可以被重载,不能被重写5.2、重载的方法能否根据返回类型进行区分?为什么?不能,因为调用时不能指定类型

2022-05-05 10:48:15 100

原创 4、String、StringBuffer、StringBuilder

4、String、StringBuffer、StringBuilderString 对象在常量池中,使用了 final 修饰,是不可变对象,可以理解为常量,线程安全;对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。这样不仅效率低下,而且大量浪费有限的内存空间,所以经常改变内容的字符串最好不要用 String 。而StringBuilder,StringBuffer内部维护的是字符数组,每次的操作都是改变字符数组的状态StringBuffer 和 Strin

2022-05-05 10:45:03 174

空空如也

空空如也

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

TA关注的人

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