
JavaSE
文章平均质量分 64
JavaSE基础到进阶
她的坏机器人
你好,AI
展开
-
Java封装CSV常用工具类
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。通常都是纯文本文件。建议使用WORDPAD或是记事本来开启,再则先另存新档后用EXCEL开启,也是方法之原创 2021-01-19 10:04:27 · 1465 阅读 · 0 评论 -
使用Apache提供的Commons-DbUtils来简化JDBC的封装
Commons DbUtils是Apache组织提供的一个对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能作用小巧、简单、实用对数据表的查询操作,可以把结果转换为List、Array、Set等集合对数据表的DML操作,只需要写SQL语句核心内容DbUtils类:启动类ResultSetHandler接口:转换类型接口QueryRunner类:执行SQL语句的类使用需要导入两个包先创建配置文件druid.properties原创 2020-08-27 21:19:01 · 350 阅读 · 0 评论 -
JDBC封装工具类:优化查询功能的两种方法
在进行JDBC封装成工具类的时候,增删改可以直接进行封装,但是查询不可以,因为不同的SQL语句查询出的结果是不同的,所以Result结果集中的内容和类型都是不确定的,所以要进行特殊的封装第一种方式使用RowMapper接口,在其中定义一个将结果集转换成对象的方法,最终将转换后的对象都添加进集合中返回public interface RowMapper<T> { T getRow(ResultSet resultSet);}泛型类类型是Student类型,我们每查询一次就需要创原创 2020-08-26 21:41:01 · 274 阅读 · 0 评论 -
Java自定义数据库连接池与Druid连接池
JDBC中提供了一个接口DataSource,所有的连接池都必须实现这个接口自定义数据库连接池创建一个连接池,继承DataSource接口并实现方法,其中只需要关注getConnection()一个方法即可,用于获取连接,然后再创建一个将连接 放回连接池的方法package com.robot.utils;import javax.sql.DataSource;import java.io.PrintWriter;import java.sql.Connection;import java.原创 2020-08-26 08:22:24 · 774 阅读 · 0 评论 -
使用JDBC实现增删改查,以及使用工具类进行封装
JDBC(Java Database Connectivity),Java连接数据库的规范核心思想Java中定义了访问数据库的接口,可以为多种关系型数据库提供统一的访问方式由数据库厂商提供驱动实现类使用JDBC步骤1、注册驱动第一种方式// 注册驱动,JDK8以后会自动注册Class.forName("com.mysql.cj.jdbc.Driver");第二种方式// 注册驱动,但是直接用有缺点:1驱动组注册两次,2耦合度高,依赖驱动类DriverManager.registe原创 2020-08-21 08:18:27 · 1235 阅读 · 1 评论 -
JVM复习宝典,详细的知识点大总结
目录虚拟机模拟某种计算机体系结构,执行特定指令集的软件Java语言虚拟机分为两大类系统虚拟机(Virtual Box、VMware)程序虚拟机(JVM、.NET CLR、P-Code)Java语言虚拟机可以执行Java语言的高级虚拟机,Java虚拟机并不一定就可以称为JVM,例如:Apache HarmonyJava虚拟机必须通过Java TCK的兼容性测试的Java语言虚拟机才能称为Java虚拟机Java虚拟机并非一定要执行Java程序业界三大商用JVM:Oracle H原创 2020-08-19 19:15:02 · 252 阅读 · 0 评论 -
Java8新特性:流式计算
什么是流流与集合类似,集合中保存的是数据,流中保存的是对数组或集合的操作Stream不会改变源对象,会返回一个新的StreamStream中的操作是延时执行Stream使用步骤创建流中间操作:执行指定操作,将一个Stream转换为另一个Stream终止操作:产生结果的操作,会立即执行中间操作的延时操作创建流public class StreamTest { public static void main(String[] args) { ArrayList&原创 2020-08-18 21:03:09 · 444 阅读 · 0 评论 -
Java8新特性:Lambda表达式、函数式接口、方法引用
Lambda表达式Lambda表达式:特殊的匿名内部类,语法更简单(参数1,参数2) -> {表达式}参数-> {表达式}() -> {表达式}原始写法,没有参数Runnable runnable1 = new Runnable() { @Override public void run() { System.out.println("Thread"); }};使用Lambda表达式Runnable runnable2 = (原创 2020-08-18 19:32:52 · 228 阅读 · 0 评论 -
【设计模式】一个小例子理解简单工厂模式
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。简单工厂四个角色工厂角色:负责创建具体的产品父类产品:作为所有产品的父类,使用抽象类、接口表示子类产品:具体的产品客户程序:使用工厂和产品的程序测试生产服装需要一个服装工厂类:工厂,类中具有生产服装的功能(创建服装对象)ClothesFactory服装类(父类产品):抽象类表示,Clothes服装子类(具体产品):普通类表示,裤子(Trousers)、T恤(TShi原创 2020-08-17 08:31:12 · 167 阅读 · 0 评论 -
【设计模式】单例模式,逐步优化单例模式,并使用反射破解单例模式
什么是单例模式单例:只允许创建一个该类的对象实现单例三个步骤私有化构造方法在类内部创建一个对象在类中添加一个公开的方法,返回单例对象饿汉式类加载时创建,线程安全优点:线程安全缺点:生命周期长,浪费空间public class SingleTon { // 1 私有化构造方法 private SingleTon() { } // 2 在类内部创建一个对象 private static final SingleTon instance原创 2020-08-16 21:37:50 · 210 阅读 · 0 评论 -
Java反射机制,反射的基本使用与内省
反射反射:把Java类中的各种成分映射成单独的Java对象进行操作。类的对象:基于某个类new出来的对象,也称为实例对象。类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法)反射的优缺点优点:提高了Java程序的灵活性和扩展性,降低了耦合性,提高自适应能力允许程序创建和控制任何类的对象,无需提前硬编码目标类缺点:反射降低了性能,代码维护难度增加获取类对象推荐使用forName获取类对象public class ReflectTest { p原创 2020-08-16 16:33:38 · 172 阅读 · 0 评论 -
Java NIO网络编程,使用NIO实现阻塞式与非阻塞式通信
NIO网络编程传统的网络编程是一种阻塞模式,在一些任务小,高并发情况下效率不高在NIO中提供了实现非阻塞式网络编程API常用APIServerSocketChannel:是一个基于通道的socket监听器,等同于ServerSocket类SocketChannel:是一个基于通道的客户端套接字,等同于Socket类Selector:提供了询问通道是否已经准备好执行每个IO操作的能力,它允许单线程处理多个Channel,大大减少了线程上下文切换的开销SelectionKey:选择键封原创 2020-08-15 20:16:47 · 324 阅读 · 0 评论 -
Java网络编程,TCP与UDP模式分别实现网络聊天室
目录TCP/IPTCP-传输控制协议面向连接的、可靠的、基于字节流的传输层通信协议数据大小无限制连接三次握手,断开连接四次握手UDP协议-用户数据报协议是一种无连接的传输层协议提供面向事务的简单不可靠信息传送服务,每个包的大小64KBIP协议-互联网协议地址分配给物联网设备的唯一标识端口号公认端口:0~1023注册端口:1024~49151动态或私有端口:49152~65535常用端口MySQL:3306Oracle:1521Tomcat:原创 2020-08-12 16:27:58 · 658 阅读 · 0 评论 -
实例分析Java浅克隆与深克隆
浅克隆:不会克隆对象中的引用类型属性,仅仅会把引用地址拷贝过来(也就是两者引用类型属性指向同一个地址)深克隆:会克隆对象中的所有信息,原对象不会对新对象产生任何影响浅克隆测试:Address类:作为Person类的一个属性Person类:name属性、age属性、Address属性测试类:测试深克隆与浅克隆创建实体类先创建一个地址类,只有城市一个属性public class Address { private String city; public Address()原创 2020-08-11 13:33:00 · 356 阅读 · 0 评论 -
浅谈Java序列化与反序列化
序列化:把对象写入到硬盘或网络中的过程。反序列化:把硬盘或网络的二进制文件读取到内存形成对象的过程。把Person对象使用对象源写入硬盘中要求:序列化的类心须实现Serializable (自动序列化接口) ,Externglizable. ( 手动序列化接口)序列化的类要添加一个私有的long类型静态常量:serverVersionUID,保证序列化的类反序列化的类是同一个类。注意实现:(1)使用transient修饰的属性,不可以序列化(2)静态属性不能被序列化publ..原创 2020-08-11 08:26:45 · 133 阅读 · 0 评论 -
Java中的IO流体系以及常用流的使用与分析
流Stream概念内存与存储设备之间的传输数据的通道硬盘中所有的数据都是二进制的流的分类按方向输入流:将存储设备中的数据读入到内存中输出流:将内存中的数据写入到存储设备中基于内存而言:读到内存,写入磁盘按单位字节流:以字节为单位,可以读写所有数据字符流:以字符为单位,只能读写文本数据按功能节点流:具有实际传输数据的读写功能过滤流:在节点流的基础之上增强功能字节流文件字节流从文件中读取数据到内存一个换行:\r\n,相当于两个字符read():返回读到数据原创 2020-08-10 20:14:24 · 212 阅读 · 0 评论 -
关于Java文件与目录的常用操作
文件的常用操作package com.robot.io;import java.io.*;import java.util.Date;/** * 文件操作。 * * @author 张宝旭 */public class FileTest { public static void main(String[] args) throws IOException { // 创建文件 File file = new File("d:\\myTemp\\te原创 2020-08-10 20:02:48 · 122 阅读 · 0 评论 -
逐步详细分析Java生产者-消费者问题,为什么使用 while 而不用 if ?
内容1、存钱取钱(逐步分析生产者消费者问题)2、使用 wait-notifyAll 实现生产者-消费者3、使用 LinkedBlockingQueue 实现生产者-消费者存钱-取钱1、一个人存钱,一个人取钱:在卡中没钱的时候存钱,有钱的时候取钱,交替执行flag为true时:只能取钱,存钱会被阻塞flag为false时:只能存钱,取钱会被阻塞public class BankCard { private double money; // true:只能取.原创 2020-08-10 20:00:27 · 808 阅读 · 0 评论 -
简单的理解Java中一些线程安全的集合
将线程不安全的集合转换为线程安全的集合ArrayList<String> arrayList = new ArrayList<>();List<String> list = Collections.synchronizedList(arrayList);HashSet<String> hashSet = new HashSet<>();Set<String> set = Collections.synchronizedSet(原创 2020-08-10 09:07:58 · 207 阅读 · 0 评论 -
解析Java中的volatile关键字,以及多线程的三个特性
多线程的三个特性多线程要保证并发线程正确执行,必须要保证三个特性。原子性(互斥性)一个或多个操作不能被分割,要么全部执行,要么就都不执行。可见性多个线程访问同一个变量,一个线程修改了这个变量,别的线程能立即看到修改的值。有序性程序执行的顺序按照代码的先后顺序执行。但是处理器为了提高程序运行效率,可能会对输入代码进行优化,它不保证程序中各个语句的执行顺序和编写顺序一致。但最终结果是一致的。synchronized可保证原子性和可见性。但不能保证有序性。volatile可保证可见原创 2020-08-08 15:35:21 · 234 阅读 · 0 评论 -
分析Java锁机制,快速理解每一种锁
Lock与synchronized的区别SynchronizedLock内置的Java关键字一个Java类无法判断获取锁的状态可以判断是否获取到了锁会自动释放锁必须要手动释放锁可重入锁 ,不可以中断的,非公平可重入锁,可以判断锁,公平/非公平适合锁少量的同步代码适合锁大量的同步代码死锁当第一个线程拥有A对象锁标记,并等待B对象锁标记,同时第二个线程拥有B对象锁标记,并等待A对象锁标记时,产生死锁。一个线程可以同时拥有多个对象的锁标记,当.原创 2020-08-08 12:09:53 · 143 阅读 · 0 评论 -
【Java并发编程】什么是Condition?以及使用Condition实现生产者消费者问题、面试题:连续输出”ABC“ 20次
什么是Condition?条件队列:一个锁,可以创建多个队列可以将多个线程存入对应的多个队列中,然后实现精准唤醒一个锁,默认对应一个等待队列当获取锁失败时,就会将此线程添加到队列中等待当创建了Condition后,就可以实现一个锁,对应多个等待队列private Lock lock = new ReentrantLock();private Condition condition1 = lock.newCondition();private Condition condition2原创 2020-08-08 08:59:55 · 400 阅读 · 0 评论 -
Java四种线程池的使用,以及七大参数、四大拒绝策略的测试分析
线程是宝贵的内存资源,单个线程约占1MB空间,过多分配容易造成内存溢出频繁的创建及销毁线程会增加虚拟机回收频率、资源开销,造成程序性能下降使用线程池,可设定线程分配的数量上限,将预先创建的线程对象存入池中,并重用线程池中的线程对象,避免频繁的创建和销毁Java四种线程池单个线程的线程池:newSingleThreadExecutor()固定线程数量的线程池:newFixedThreadPool()动态线程池:newCachedThreadPool()调度线程池:newSche原创 2020-08-07 08:49:26 · 520 阅读 · 0 评论 -
Java多线程基础与线程安全
线程基础知识java有2个线程:main,GCjava不能开启线程,因为Java无法直接操控硬件,所以实际上是调用了本地方法(C++)去开启线程什么是进程?进程是程序在并发环境中的执行过程什么是线程?线程是CPU调度的最小单位进程和线程的区别进程是操作系统资源分配的基本单位,线程是CPU的基本调度单位一个程序运行后至少有一个进程一个进程可以包含多个线程,但是至少需要有一个线程进程之间不能共享数据段地址,但同进程的线程之间可以线程的组成CPU时间片:OS会为.原创 2020-08-06 19:46:47 · 212 阅读 · 0 评论 -
Java泛型的初步认识与使用
什么是泛型概念:参数化类型、类型安全的集合,强制集合元素的类型必须一致特点编译时即可检查,而非运行时抛出异常访问时,不必类型转换不同泛型之间引用不能相互赋值,泛型不存在多态不能包含仅使用泛型作为参数的重载方法泛型的好处:提高代码的重用性防止类型转换异常,提高代码的安全性泛型类就比如ArrayList类,可以传入任何类型的数据,但是为了规范,我们需要指明数据的类型ArrayList< String>,这样ArrayList就只能存入String类型的数据了我们可以原创 2020-08-05 19:09:45 · 266 阅读 · 0 评论 -
Set家族的常用方法、源码分析以及哈希表的初步认识
Set体系结构HashSet特点HashSet基于HashCode、equals实现元素不重复JDK1.8:使用数组+链表+红黑树HashSet常用方法import java.util.HashSet;import java.util.Iterator;import java.util.Set;/** * @author 张宝旭 */public class SetTest { public static void main(String[] args) {原创 2020-08-05 13:15:02 · 239 阅读 · 0 评论 -
HashMap常用方法与源码分析 JDK1.8
HashMap特点线程不安全运行效率快key或value都可以使用null存储结构:哈希表(JDK1.8后是数组+链表+红黑树)HashMap常用方法import java.util.HashMap;import java.util.Map;/** * @author 张宝旭 */public class HashMapTest { public static void main(String[] args) { HashMap<Integer,原创 2020-08-03 21:02:00 · 192 阅读 · 0 评论 -
深入理解ArrayList与LinkedList,源码分析与性能测试
剧透:ArrayList的插入操作与查询操作都比LinkedList快很多ArrayList特点底层使用数组实现,查询速度快,增删改速度慢(理论上)线程不安全ArrayList常用方法import java.util.ArrayList;import java.util.Iterator;import java.util.List;/** * @author 张宝旭 */public class ArrayListTest { public static voi..原创 2020-08-01 10:20:26 · 254 阅读 · 0 评论 -
分析String、StringBuilder、StringBuffer的区别,内存划分以及性能测试
一、String1.1 创建StringString两种创建方式String str = "zbx";// zbx 存储在常量池中,常量池在方法区中String str2 = new String("java");// java 存储在堆中1.2 多个字符串的内存分析创建字符串创建一个字符串String name1 = "zbx";引用存放在栈中,值存放在常量池中new 一个字符串String name2 = new String("bao");引用存放在栈中,.原创 2020-08-01 09:32:19 · 1009 阅读 · 0 评论 -
【Java基础】装箱、拆箱的基本操作(附面试题)
装箱、拆箱、自动装箱、自动拆箱public class IntegerTest { public static void main(String[] args) { // 装箱 int num1 = 12; Integer integer1 = new Integer(num1); // 拆箱 num1 = integer1.intValue(); // 自动装箱原创 2020-07-31 19:06:39 · 244 阅读 · 0 评论 -
【Java基础】内部类的四种形式,基本使用以及区别特点
什么是内部类概念:在一个类的内部再定义一个完整的类public class Outer { class Inner { }}特点:编译之后可生成独立的字节码文件内部类可直接访问外部类的私有属性,而不破坏封装可为外部类提供必要的内部功能组件一、成员内部类概念:在类的内部定义,与实例变量、实例方法同级别的类特点:成员内部类可以使用任意访问修饰符(外部类的访问修饰符只能是 public 或 默认)成员内部类可以直接访问外部类的属性和方法如果内部类中的属原创 2020-07-31 09:00:11 · 833 阅读 · 0 评论 -
【Java基础】接口的基本使用
思维导图一、什么是接口接口代表一种能力或约束Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力。interface MyInterface { void method();}接口没有构造方法只能定义公开静态常量、公开抽象方法使用 interface 关键字定义接口接口的好处程序耦合度降低更自然的使用多态设计与实现完全分离更容易搭建程序框架更容易更换具体实现二、接口与类2.1 类实现单个接口定义一个接口/** * 接口。原创 2020-07-30 09:10:35 · 180 阅读 · 0 评论 -
【Java基础】详解三大修饰符:abstract、static、final
思维导图一、abstract1.1 抽象类举例package com.robot.month1.week2.day20200728;/** * 动物抽象类。 * * @author 张宝旭 */public abstract class Animal { private String name; private int age; public Animal() { } public Animal(String name, int age)原创 2020-07-29 21:27:18 · 292 阅读 · 0 评论 -
【Java基础】面向对象的基础知识、三大特征以及七大原则
思维导图(っ•̀ω•́)っ✎⁾⁾ 我爱学习一、什么是对象1.1 面向对象的思想一些客观存在的事物都是对象,万物皆对象任何对象都有自己的特征(属性:对象有什么)和行为(方法:对象能做什么)1.2 现实中的对象对象:手机属性:品牌:魅族颜色:黑色价格:3999方法:打电话上网打游戏1.3 程序中的对象用于模拟现实世界用类模板去创建对象实例二、类与对象2.1 什么是类汽车的设计图纸 —> 现实对象模板 —> 创造出汽车的实体原创 2020-07-29 08:51:43 · 283 阅读 · 0 评论 -
【Java基础】数组的基本操作、复制、扩容、排序以及在内存中的划分
思维导图一、数组的概念概念:一组连续的存储空间,存储多个相同类型的值特点:类型相同、长度固定二、数组的基本操作2.1 创建数组第一种方式// 1 声明数组int[] array1;// 2 初始化数组array1 = new int[12];第二种方式int[] array2 = new int[12];第三种方式int[] array4 = new int[]{1, 3, 1, 4};第四中方式int[] array3 = {5, 2, 0, 1, 3, 1, 4原创 2020-07-25 15:54:52 · 253 阅读 · 0 评论 -
Java语言基础(二):选择与循环结构、方法与递归
思维导图1 选择结构根据已知条件进行判断,满足条件后执行相应操作1.1 if 选择结构语法格式if (布尔表达式) { // 代码块}如果布尔表达式结果为true,则执行代码块,然后执行后续代码如果布尔表达式结果为false,则不执行代码块,直接执行后续代码1.2 if else 选择结构语法格式if (布尔表达式) { // 代码1} else { // 代码2}如果布尔表达式结果为true,则执行代码1,然后退出整个结构,执行后续代码如果布尔原创 2020-07-25 09:31:13 · 834 阅读 · 0 评论 -
Java语言基础 进阶(一)
思维导图1 概述与环境搭建1.1 Java发展历史创始公司:Sun Microsystems发布时间:1995年创始人:詹姆斯·高斯林Java前身:oak1998年发布JDK1.2 : J2SE、J2EE、J2ME2004年发布JDK1.5:Java SE、Java EE、Java ME2009年被Oracle收购2014年由Oracle发布Java 8.0…1.2 java语言的特点面向对象:贴近人类思维模式,模拟现实世界,解决现实问题简单性:自动内存管理机制、不易造成原创 2020-07-22 09:05:33 · 283 阅读 · 0 评论 -
一文彻底弄懂双等 “==” 和 equals 的区别,从此面试再也不会入坑了
基本数据类型:因为基本数据类型没有引用对象,所以 “==” 的效果就是比较值是否相同,基本数据类型没有 equals 方法引用数据类型:“==” 和 equals 两者都是比较引用的对象是否相同为什么我们在网上会看到说:双等比较引用,equals比较值呢?那是因为equals被重写了,重写之后的效果就是比较值是否相等,那些例子都是用String类型之间进行比较的,String内部默认重写了equals方法,所以才有了以上的说法如下是equals的源码,可以看到equals的内部实现就是 “==”原创 2020-07-06 18:07:15 · 4965 阅读 · 1 评论 -
实例分析Java接口和抽象类的区别,以及如何去使用它们(JDK1.8 新版本)
在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类接口,是抽象方法的集合接口不能被实例化 接口内的方法都是抽象的(不用abstrcat声明,默认就是抽象的) JDK 1.8以前,接口中的方法必须是public的 JDK 1.8时,接口中的方法可以是public的...原创 2020-04-20 22:39:01 · 448 阅读 · 1 评论 -
解析Java异常处理机制,你写程序的时候是不是没有处理过异常?
很多人在写程序的时候,基本用不到捕获异常(除了程序强制要求以外),因为在写一段程序实现一些功能的时候,不用异常也没有问题,有异常就说明程序错了嘛,改一改就没有了呀一些小的功能,一些算法之类的,确实不用处理异常也没关系,但是在一些大型应用当中,捕获异常就变得尤为重要了为什么要捕获异常?我还记得在上课时,老师举过的一个例子,很形象假如当我们在玩游戏的时候,突然某一个地方出了bug,比如人物角色...原创 2020-04-13 12:19:31 · 236 阅读 · 0 评论