java
文章平均质量分 69
Java基础信息学习
姜小白-
Java开发,项目管理,打杂,啥都做
展开
-
Java中默认四种线程池使用分析
Java定义了Executor接口并在该接口中定义了execute( )用于执行一个线程任务,然后通过ExecutorService实现Executor接口并执行具体的线程操作。ExecutorService接口有多个实现类可用于创建不同的线程池。newCachedThreadPoolnewCachedThreadPool用于创建衣蛾缓存线程池。之所以叫缓存线程池,是因为它在创建新线程时,如果有可重用的线程,则重用他们,否则重新创建一个新的线程并将其添加到线程池中。对于执行时间很短的任务惹眼,new原创 2021-04-21 18:57:25 · 1329 阅读 · 0 评论 -
从源码看ArrayList使用(一)
ArrayList是基于数组实现的List接口,实现所有可选列表操作,并允许所有元素,包括null。 除了实现List接口之外,该类还提供了一些方法来处理内部用于存储列表的数组的大小。每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 如果添加元素时发现当前容量已满,则ArrayList会自动扩容,扩充容量为当前容量的0.5倍。ArrayList是线程非同步的,即多线程情况下操作不安全,如果要在多线程情况下使用ArrayList,可以选择使..原创 2021-04-14 18:01:41 · 169 阅读 · 0 评论 -
java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present
一个eureka注册中心服务,之前都正常运行的,昨天通过java -jar 方式运行时报错java.lang.TypeNotPresentException: Type javax.xml.bind.JAXBContext not present at java.base/sun.reflect.generics.factory.CoreReflectionFactory.makeNamedType(CoreReflectionFactory.java:117) ~[na:na] ...原创 2021-04-08 11:32:19 · 316 阅读 · 2 评论 -
冒泡排序
冒泡排序(Bubble Sort)算法是一种较简单的排序算法,它在重复访问要排序的元素列时,会依次比较相邻的两个元素,如果左边的元素大于右边的元素,就将二者交换位置,如此重复,直到没有相邻的元素需要交换位置,这时该列表的元素排序完成。该算法名称的由来是越大的元素会经过交换慢慢浮到数组的顶端,就如同水的气泡最终会浮到顶端一样。假如有数组 {34,8,45,1,24,67,56,35},数组中有8个元素,按照冒泡排序须走7趟完成排序,下面通过图片展示排序效果插入排序中,第一趟会将最大的数挪到数组原创 2021-04-03 23:27:03 · 115 阅读 · 0 评论 -
插入排序
插入排序(Insertion Sort)是最简单的排序算法之一。对于一个有N个元素的列表,插入排序由N-1趟排序组成。对于p=1到p=N-1趟,插入排序保证从位置0到位置p上的元素为已排序状态。插入排序利用了这样的事实:已知位置0到位置p-1上的元素已经处于排过序的状态。假如有数组 {34,8,45,1,24,67,56,35},数组中有8个元素,按照插入排序须走7趟完成排序,下面通过图片展示排序效果对于插入排序,由于嵌套循环的每一个都花费N次迭代,因此,插入排序的时间复杂度为O(N)。代码原创 2021-03-30 12:36:48 · 291 阅读 · 3 评论 -
线程池工作原理
Java线程池主要用于管理线程组及其运行状态,以便Java虚拟机更好的利用CPU资源。Java线程池的工作原理为:JVM先根据用户给定的参数创建一定数量的可运行的线程任务,并将其放入队列中,在线程创建后启动这些任务,如果正在运行的线程数量超过了最大线程数量(用户设置的线程池大小),则超出数量的线程排队等候,在有任务执行完毕后,线程池调度器会发现有可用的线程,进而再次从队列中取出任务并执行。线程池的主要作用是线程复用、线程资源管理、控制操作系统的最大并发数,以保证系统高效(通过线程资源复用实现)且安全(通原创 2021-03-27 12:46:49 · 5254 阅读 · 0 评论 -
常见的位运算使用
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作,它的效率会比编程语言的算术运算效率高。常见的位运算常见的位运算符见表格中,主要有&(与)、|(或)、^(异或)、<<(左移位)和>>(右移位)。原创 2021-03-25 18:00:24 · 1943 阅读 · 2 评论 -
二分查找和顺序查找
顺序查找可以处理有序数组,也可以处理无序数组,依次遍历数组,查找待找元素,其时间复杂度为o(n);折半查找只能处理有序数组,每次查找的过程中,都会将查找范围缩小一半,其时间复杂度为o(log2n),以2为底,n的对数。顺序查找顺序查找即按照数组的元素下标位置,依次去比对查找,直到找到该元素为止,若循环结束依然未找到该元素,说明数组中没有带查关键字。顺序查找时,理论上最多查找n次,顺序查找的时间复杂度为o(n)。例如,数组array,有元素{2,3,4,5,6,7,8,9,10},如果要找到元素7原创 2021-03-22 17:02:58 · 1927 阅读 · 0 评论 -
树的常用术语
树是数据结构中一个比较常见的结构,树里面有一些术语,这里照着图来说明下树的术语。节点,树中的一个连接点根节点,根结点(root)是树的一个组成部分,也叫树根。所有非空的树中,都有且仅有一个根节点。它是同一棵树中除本身外所有结点的祖先,没有父节点。父节点,若一个节点含有节点,则这个节点成为其子节点的父节点子节点,一个节点含有的子树的根节点成为该节点的子节点叶子节点,一棵树中没有子节点的节点成为叶子节点节点的权,节点的具体值节点的度,子节点的个数路径,从根节点到某一个具体节点所走过的路层原创 2021-03-21 23:59:19 · 812 阅读 · 0 评论 -
ConcurrentModificationException和遍历中删除元素
ArrayList中迭代器Iterator的remove方法注释内容有:迭代器的remove方法从集合中移除此迭代器返回的最后一个元素(可选操作)。每次调用next只能调用一次此方法。如果在操作进行过程中以调用此remove方法以外的任何方式修改了基础集合,则迭代器的行为未指定。由此可见,迭代器的remove方法是集合里面遍历删除的名门正派,其它的方法在遍历中修改集合,都可能给迭代器的行为带来不确定性。原创 2021-02-02 18:48:30 · 722 阅读 · 2 评论 -
java序列化接口Serializable
类的可序列化性通过实现(implements) java.io.Serializable可序列化接口。 没有实现这个接口的类不会将其任何状态序列化或反序列化。 可序列化类的所有子类型本身可序列化。 序列化接口没有方法或字段只用于识别可序列化的语义。为了允许序列化不可序列化类的子类型,子类型可以承担保存和还原父类型的公开状态(public),受保护状态(protected)和(如果可以访问)包字段。 只有在以下情况下,子类型才能承担此责任:扩展的类具有可访问的无参(no-arg)构造函数,用于初始化类的状原创 2021-01-29 23:43:37 · 3402 阅读 · 2 评论 -
Java对象浅拷贝和深拷贝
浅拷贝说明对于数据类型是基本数据类型的成员变量,浅拷贝时候会直接复制一份属性值给到新对象。对于数据类型是引用数据类型的成员变量,比如说成员变量是集合列表、某个类的对象,那么浅拷贝会进行引用传递,就是将该成员变量的引用值(内存地址)复制一份给新的对象。因为实际上两个对象的该成员变量都指向同一个实例,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值。深拷贝说明浅拷贝时候,对于基本数据类型都已经实现拷贝后修改无影响了,对引用类型的拷贝因为指向同一内存空间而没有实现彻底的隔离。若要实现深拷贝,原创 2021-01-28 23:41:11 · 721 阅读 · 0 评论 -
java对Blob读写
public class BlobTest { public static Connection conn; public static Connection getConn() throws Exception { FileInputStream fis = new FileInputStream(new File("jdbc.propert原创 2014-07-29 21:53:50 · 25373 阅读 · 3 评论 -
HashMap容量解析
HashMap中有一个有参的构造方法,传递的参数是map初始化的容量。那么给定的参数,HashMap就一定给分配参数对应的容量吗?比如,我传7进去,HashMap就会给分配7个空间吗 ?答案是:否因为 HashMap分配的容量可能大于入参,可能小于入参,可能等于入参。为什么会这样?一点点看 HashMap的构造方法HashMap有四个构造方法public HashMap()...原创 2018-11-20 17:18:34 · 7282 阅读 · 4 评论 -
ArrayList扩容处理
ArrayList是基于动态数组实现的一个数据结构,如果添加元素时,元素个数超过list的容量大小时,会涉及到扩容。 ArrayList的扩容是如何做的,跟着代码走最容易懂。 /** * 添加元素在list尾部 * * @param e 待添加元素 * @return 返回添加成功标识 */ public boolean...原创 2018-11-29 21:09:03 · 4768 阅读 · 0 评论 -
Java连接FTP进行文件上传下载
简易FTP服务器下载3CDaemon.exe文件,配置用户名、密码和FTP路径配置完,一个简易的FTP服务器就搭建成功了 FTP服务Java操作直接贴代码package com.main.ftp;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;...原创 2018-11-28 08:50:54 · 3173 阅读 · 1 评论 -
Java字节流与字符流读写文件
字节流读写Java中文件读写有多种方式,但有一种读写方式可以处理任何场景的文件读写,就是字节流的读写。package com.main.stream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;i...原创 2018-12-11 19:04:04 · 14425 阅读 · 8 评论 -
Java生成二维码增加logo或备注信息
Java生成二维码后,带logo图片时,需要在新生成的二维码图片中,画对应的logo;带备注信息时,需要先准备一张画布,将画布分为二维码信息和备注信息两部分,一部分画二维码信息,一部分写备注信息。 二维码带logo图片想做个类似支付宝或微信收款码这样的二维码,二维码中间有用户的图像logo使用谷歌zxing技术来实现先看代码,代码中有详细注释 /** * 生成二维...原创 2019-02-27 14:55:48 · 1660 阅读 · 0 评论 -
Java生成二维码增加logo和备注信息
Java生成二维码同时增加logo和备注时,步骤如下:1、先生成二维码信息2、在二维码信息中画上logo图样3、准备新的画布,将画布分为二维码部分和备注信息两部分4、画布中画二维码信息5、画布中写备注信息 看代码 /** * 生成二维码 * 二维码红带有logo图样 * 二维码下方带有备注信息 * 二维码的宽高受备注信息字体大小影响,这里没有抽...原创 2019-02-27 15:25:09 · 1573 阅读 · 0 评论 -
Java生成二维码
利用谷歌 zxing 技术生成二维码引用pom依赖 <!-- zxing --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.2原创 2019-02-26 17:19:51 · 5786 阅读 · 0 评论 -
win10重启电脑Java环境变量丢失问题
最新新使用win10操作系统,开始Java学习,但是配置好的环境变量在重启电脑后会丢失掉百度了下解决方案,特此记录,希望可以帮到同样遇到该问题的朋友。 配置环境变量,我们配置JAVA_HOME 和 pathpath的配置,win10 和之前的Windows操作系统略有不同,默认的不再是一行,而是每个变量一行,按照以往经验,我们把java的bin目录配置在最上面。如此配置,在...原创 2018-09-26 09:30:31 · 13131 阅读 · 6 评论 -
Java常用类Properties简单用法
Properties 是Java中非常常用的一个持久的属性集类。Properties 可保存在流中或从流中加载,其属性列表中每个键及其对应值都是一个字符串。下面的例子对Properties 中常用的几个方法做下示例说明load(InputStream inStream) 从输入流中读取属性列表(键和元素对)getProperty(String key) 用指定的键在此属性列表中搜索属性getProperty(String key, String defaultValue) 用指定的键在属性列原创 2017-07-06 21:58:55 · 709 阅读 · 0 评论 -
出栈方法pop改进
上一篇博文实现了一个栈的demo其中出栈部分有一些问题,这里谈一下 /** * 出栈 * @return 出栈元素 */ public Object pop() { if (size == 0) { throw new NullPointerException(); }原创 2017-05-18 22:58:03 · 3922 阅读 · 0 评论 -
FilenameFilter学习
从给定的一个路径中筛选中某种格式的文件,通常的做法,便是遍历该目录,然后按照文件后缀来判断该文件是否符合判断条件。FilenameFilter 接口中的accept方法,主要判断给定的文件是否包含在该目录中通过FilenameFilter 接口改造后的代码class FilterName implements FilenameFilter { private String type; // 构造方法,定义要过滤的文件类型 FilterNa原创 2015-02-01 12:53:29 · 1059 阅读 · 0 评论 -
FileWriter学习
FileWriter 文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。 FileOutputStream 用于写入诸如图像数据之类的原始字节的流原创 2015-01-31 20:25:33 · 3306 阅读 · 0 评论 -
java.sql.Date与java.util.Date相互转换
数据库操作时,遇到时间类型,经常会涉及到 java.sql.Date与java.util.Date 之间的转换。在此,总结一个简单的转换方法。java.sql.Date与java.util.Date 两种Date类型有个共同的方法,就是getTime()。利用getTime进行格式的转换时,时间不会有精度的丢失。public class DateTest { public s原创 2013-12-25 17:30:14 · 2589 阅读 · 0 评论 -
理解Java String和String Pool
要理解 java中String的运作方式,必须明确一点:String是一个非可变类(immutable)。什么是非可变类呢?简单说来,非可变类的实例是不能被修改的,每个实例中包含的信息都必须在该实例创建的时候就提供出来,并且在对象的整个生存周期内固定不变。java为什么要把String设计为非可变类呢?你可以问问 james Gosling :)。但是非可变类确实有着自身的优势,如状态单一,对象简转载 2014-06-28 20:28:00 · 2485 阅读 · 0 评论 -
Java编程中“为了性能”需做的26件事
最近的机器内存又爆满了,除了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了。下面是参考网络资源总结的一些在Java编程中尽可能要做到的一些地方。1.尽量在合适的场合使用单例使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:转载 2014-02-15 09:43:21 · 872 阅读 · 0 评论 -
Java堆内存的10个要点
摘要:对大多数程序员都经历过这样的过程,因为学习一种语言是非常容易来的,但是学习基础是非常难的,因为没有什么特定的流程让你学习编程的每个基础,使你发觉编程的秘诀。导读:对于程序员来说,知道堆空间,设置堆空间,处理堆空间的outOfMemoryError错误,分析heap dump是非常重要的。文中介绍了Java堆的学习教程以及Java堆内存(heap memory)的十个要点。文章内容如下转载 2014-02-25 08:57:41 · 882 阅读 · 0 评论 -
Java多线程基础知识总结笔记
本篇笔记记录一些在Java多线程编程中常见的关键字,比较简单和基础的就不写太详细了。一、Thread类(其实也是应用了Runnable接口)和Runnable接口(只有一个run方法,应用该类必须重写run方法)一般我们定义一个线程类,可以继承Thread类或者应用Runnable接口,不管是继承哪个,都要重写run方法。比如我们定义一个线程类:public class Threa转载 2013-12-27 16:53:11 · 946 阅读 · 0 评论 -
java判断字符串是否可以转为数字
方法1 try { Integer.parseInt(str); return true; } catch (NumberFormatException e) { return false; }方法2 Pattern pattern = Pattern.compile("^[0-9]*$"); Matcher matcher = pattern.matcher(str); return matcher.matches();原创 2015-01-01 13:53:42 · 39997 阅读 · 1 评论 -
ResultSet获取记录条数
JDBC中的ResultSet API没有直接获取记录条数的方法,现介绍几个: 方法一:利用ResultSet的getRow方法来获得ResultSet的总行数 Java代码ResultSet rs; rs.last(); //移到最后一行 int rowCount = rs.getRow(); //得到当前行号,也就是记录数 rs.beforeFirst();原创 2014-06-19 23:32:00 · 35564 阅读 · 0 评论 -
map的四种遍历方式
那map通常的遍历方式有哪几种呢?通常四种方式:keySet集合迭代,entrySet集合迭代,keySet 集合for-each 循环,entrySet集合for-each循环。原创 2014-12-16 22:09:31 · 7750 阅读 · 1 评论 -
java栈小demo
RT,用Java方法实现了一个栈栈通过数组实现,提供入栈、出栈和返回栈容量及栈中元素个数四个方法package com.zhangqi.effective.java;import java.util.Arrays;/** * 定义Stack类实体 * @author zhangqi * */public class Stack { // 通过数组来实现stack原创 2017-05-18 22:24:02 · 506 阅读 · 0 评论 -
一个Java缓存池demo
参照网上实例写了一个缓存池demo这里我们有四个类,分别为CacheItem 缓存实体类CachePool 缓存池Student 学生实体类MainTest 主测试类其中,缓存实体类CacheItem 中存放管理学生实体对象Student ,缓存实体类CacheItem 存放在缓存池CachePool 中,MainTest 主要负责整体的测试工作。原创 2017-04-19 23:03:14 · 2485 阅读 · 1 评论 -
返回某个时间之后修改过的文件列表及修改时间
做项目的时候,经常会给现场打补丁,一段时间之后,就想把这一段时间出的补丁包(假如每两天出一个补丁包)给重新合一遍,合一个新的补丁包出来。但是怎么检验合的补丁包有没有问题呢,那就得把这一段时间修改过的文件重新合一个补丁包出来。要查找近一段时间修改过的文件,不是件容易的事情,得挨个的去查看文件的最后修改时间,比较费时,费力。今天写的这个小玩意,就是把某一个时间点之后的修改过的文件,都搜集出来,输出来。原创 2015-04-24 22:45:17 · 2044 阅读 · 0 评论 -
数组的协变性与范型的不可变性
记得以前面试的时候曾被问过一个问题:数组和List的区别是什么?当时答的无非就是效率,容量固定,List不能存基本类型等等。当Java发展到了1.5之后,出现了泛型版本的List,又为这个问题的解答加入了一笔。下面就来讲一下与这个话题相关的内容。数组的协变性(covariant)是指如果类Base是类Sub的基类,那么Base[]就是Sub[]的基类。而泛型是不可变的(invariant),List<Base>不会是List<Sub>的基类,更不会是它的子类。 第二个要讲的问题是数组是具体化的(reifi原创 2015-04-19 16:29:29 · 2661 阅读 · 1 评论 -
多属性对象创建公用RowMapper
这里我们只是一个简单的例子,给的对象属性都比较少,当然实际情况中,对象属性可能更多,而且关联对象更复杂时,这种方式便非常有效。因为在数据库查询结果集ResultSet中,如果直接去getString("notExistColumn") 时,会直接抛SQLException,isExistColumn(ResultSet rs, String columnName) 正是利用了 findColumn 方法的SQLException ,然后达到了是否存在该列的效果。/** * 应用实体类 * @autho原创 2015-03-31 07:16:48 · 1901 阅读 · 0 评论 -
Java判断数据库结果集ResultSet 中是否存在指定列名
if 条件内,如果 rs.findColumn(columnName) > 0 ,ResultSet结果集中的列索引从1开始,不同于数组和list的从0开始,所以如果找到某列,那么它的索引值必然大于0;如果没有找到呢,那么就会有SQLException 异常抛出来,我们这里将这个SQLException 异常利用起来,如果进入异常块,则说明没有找到该列,那么直接返回false就可以了。这样在mapRow 中,如果多个属性的时候,每次可以判断下,该ResultSet 中是否查询出来该列,查询出来了就做映射,原创 2015-03-29 22:38:40 · 21255 阅读 · 0 评论 -
异或运算实现加密解密
异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能。加密方法的加密操作是对字符串中的每个字符进行异或运算,然后将异或运算后的字符串返回,得到密文。根据 "字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x " 原理,对密码中的每个字符进行再次异或运算,便可再次得到之前的明文信息,及达到解密的效果。示例中,(decode(str)) 方原创 2015-01-03 21:19:35 · 5939 阅读 · 0 评论