java笔记
文章平均质量分 53
Max-Init
Once you think of it,just do it
展开
-
spring里面到底什么是配置类?
spring配置类源码解析原创 2023-01-03 23:42:42 · 358 阅读 · 1 评论 -
spring启动过程详解
bean的扫描和启动过程原创 2022-12-28 15:59:17 · 154 阅读 · 0 评论 -
spring用java config的方式开启事务
java config 可以这样写事务只需要注入getDataSourceTransactionManager这个bean,并且加上@EnableTransactionManagement即可。这里用了阿里的德鲁克的数据源。如何使用呢,在DAO层直接使用@Autowrid注入即可使用事务,在service层,加上@Transactional注解即可......原创 2022-06-25 11:19:46 · 480 阅读 · 0 评论 -
HashMap和ArrayList的扩容机制
ArrayList的的扩容机制什么时候扩容?程序员可以通过ensureCapacity()方法来动态指定容量,如果超出则会由ArrayList自动扩容;ArrayList自己是通过来动态扩容ensureCapacityInternal方法来实现private void ensureCapacityInternal(int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {原创 2022-05-25 10:32:27 · 846 阅读 · 0 评论 -
java lambda表达式、方法接口的来龙去脉
问题描述有这样的需求,我们能够不改变代码时候,通过增加代码扩展功能,通常可以定义一个接口,通过实现接口扩展功能。如下例子:定义接口:package lambatest;public interface Animal { String eat();}实现接口package lambatest;public class CatImpl implements Animal{ @Override public String eat() { return "原创 2022-05-16 19:36:25 · 121 阅读 · 0 评论 -
java反射总结
Class类中Medthod、Filed、Constructor的方法都有Declare,这跟不加declare有什么区别,我们看一下源码定义:以获取Constructor对象的方法为例看一下:@CallerSensitivepublic Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) throws NoSuchMethodException, SecurityException {原创 2022-05-13 16:08:33 · 141 阅读 · 0 评论 -
java注解总结
文章目录元注解Java自带的标准注解自定义注解lang下annotation包结构如下:元注解@Documented 是否生成javadoc该注解没有参数,无需赘述@Retention 生效时机源码定义如下:@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.ANNOTATION_TYPE)public @interface Retention { RetentionPolicy value();原创 2022-05-10 22:50:08 · 223 阅读 · 0 评论 -
java泛型知识总结
文章目录泛型类泛型接口泛型方法定义类型擦除编译期类型检查参考文章泛型类<>中的符号是代表属性类型public class GenericTest<K,V,L> { private K k; private L l; private V v; public void setK(K k) { this.k = k; } public void setL(L l) { this.l = l;原创 2022-05-10 21:43:27 · 325 阅读 · 0 评论 -
从Integer说起
从Integer说起为什么基本数据类型的封装类类型打印出来不是对象的hashcode(地址,但不是真正的地址)?而是他的值。原因是Integer重写了toString方法,我们到源码看一下Integer位于java.lang.Integer#toString(int),方法定义如下:public static String toString(int i) { if (i == Integer.MIN_VALUE) return "-2147483648"; int s原创 2022-05-07 00:45:21 · 1047 阅读 · 0 评论 -
RentrantLock与AQS详解
RentrantLock与AQS详解基本概念对应源码里面的类,可以理解这些基本概念,如下:队列同步器(同步器):AbstractQueuedSynchronizer(AQS)自定义同步器:java.util.concurrent.Semaphore.Sync、java.util.concurrent.locks.ReentrantLock.Sync等同步组件:ReentrantLock、Semaphore、CountDownLatch等如何实现ReentrantLock?ReentrantLo原创 2022-05-02 21:27:49 · 1061 阅读 · 0 评论 -
一文看完最详细的线程创建方式
我们都知道新建线程有三种方式,分别是:继承Thread类;实现runnable接口;实现callable接口;由于各种方式的写法多样,有时候会造成初学者的困扰,通过本文你可以完整学习到创建线程的各种方式。这是关于lambda表达式的基础知识,可以先不看,请往下阅读,如有问题回过头来再看。http://www.codebaoku.com/it-java/it-java-224741.html继承Thread1、最初级的写法public class ThreadTest exte原创 2022-04-15 13:36:11 · 408 阅读 · 0 评论 -
对象锁升级的过程详解
1、java对象的内存布局一个java普通对象在内存中分为4部分:Markword主要记录对象的锁状态class pointer指向对象字节码的指针instance data实例数据paddingjvm设计时对象所占大小要被8整除,要是位数不够需要加padding2、对象布局的查看使用JOL类可以查看对象的内存布局,maven引入如下依赖即可: <dependency> <groupId>org.openjdk.jol&原创 2022-04-14 09:47:28 · 818 阅读 · 0 评论 -
反射设置属性值,调用方法和调用构造方法
获取字节码对象首先获取类的字节码对象,有三种方式,这里记录最常用的一种;Class aClass = Class.forName("com.lijugang.www.test02.Product");//获得类的字节码文件实例化,调用构造方法newInstance()Object o = aClass.newInstance();//对象实例化getDeclaredConstructor()获得Constructor对象,使用Constructor对象的newInstance()原创 2021-04-17 11:31:47 · 268 阅读 · 0 评论 -
对象序列化
package test01;import java.io.*;public class serializableDemo{ public static void main(String[] args) throws IOException, ClassNotFoundException { //创建对象 Product product = new Product(); //给属性赋值 product.setPname("香香原创 2021-03-27 16:17:31 · 82 阅读 · 0 评论 -
继承和多态再一次理解
继承1.java语言中子类继承父类都继承那些数据?私有数据不支持继承。构造方法不支持继承。其他数据都可以继承。2.java中任何类都默认继承Object类,并且任何一个类都有Object的特征。3.什么是方法重写?当父类中的方法无法满足当前子类的业务需求的时候,子类有必要将父类中继承过来的方法进行重写编写。这叫做方法的重写,overwrite。回忆下重载是什么?4.满足什么条件的时候会发生方法的重写呢?方法重写发生在具有继承关系的父子俩之间。方法样子长的一样。**访问权限不能更低原创 2021-03-07 19:47:24 · 1923 阅读 · 0 评论 -
this、static、static和super关键字的详细解释
thisthis是一个引用,this是一个变量。this变量中保存了内存地址指向了自身,this存储在jvm堆内存java对象的内部。谁调this,this就是谁当一个行为/动作的执行过程中需要对象参与,那么这个方法一定要定义为实例方法,不能带static修饰。1、static修饰的变量,执行过程不需要对象。因此static中不能使用this。2、用来区分局部变量和实例变量的时候this不能省略;3、this可以使用在实例方法中,代表的是当前对象【this.】4、this可以使用在构造方法中,通原创 2021-03-07 17:09:58 · 407 阅读 · 1 评论 -
一文读懂java中方法的参数传递
结论:方法调用的时候涉及到参数传递的问题,实际上传递的是变量中具体的值;首先看两个例子:1.传递参数中保存的是一个字面值代码如下:class Test01 { public static void main(String[] args) { int i = 10; add(i); System.out.println("main方法中i的值是:"+i);//10 } public void static add(int i){ i++; System.out.p.原创 2021-03-07 12:04:00 · 161 阅读 · 0 评论 -
jvm内存分析
1.方法调用的时候所需的内存空间在栈内存中分配,称为压栈。方法执行结束后,栈内存释放,称为弹栈。2.方法区内存片段和整个类代码片段都被存储到方法区中,在类加载的时候在些代码片段会载入。3.new运算符创建的对象,存储在堆内存中,对象内部有实例变量,所以实例变量也存储在堆内存中;4.静态变量存储在方法区内存中。5.三块内存区域中变化最频繁的是方法区内存,最先有数据的是方法区内存,垃圾回收主要针对的堆内存;6.垃圾回收机制什么时候对java对象进行回收?1)当堆内存的java对象变成垃圾数据的时候.原创 2021-03-05 22:42:26 · 959 阅读 · 2 评论 -
PrintStream和PrintWriter的理解
java的标准输入流是什么?是InputStream,正确。那么java的标准输出流是什么?是OutputSteam?No!而是PrintStream。因为标准输入输出流是System类的定义,静态成员为,in是InputStream类型,对应的是标准输入流,err和out都是PrintStream对象,out对应的是标准输出流。此流默认输出在控制台,也可以重定向输出位置,例如txt文件中:下面是System中的定义: public static final InputStream in = n原创 2021-03-03 17:04:26 · 237 阅读 · 1 评论 -
JAVA是如何获取和设置线程名称的(源码解析)
Thread构造方法是如何生成默认线程名称的?无参构造中调用init方法,init的第三个参数传的是一个字符串name,实参是"Thread-" + nextThreadNum(),这个nextThreadNum()方法返回的是一个int类型的整数,也就是调用一次num加1。 public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0); } private static int thread原创 2020-09-19 23:27:55 · 325 阅读 · 0 评论 -
IO中编码方式的详解
为什么存在字节流和字符流? String s = "中国"; byte[] bytes = s.getBytes(); System.out.println(Arrays.toString(bytes)); //[-28, -72, -83, -27, -101, -67] byte[] bytes1 = s.getBytes("GBK"); System.out.println(Arrays.toString(原创 2020-09-12 15:18:18 · 573 阅读 · 0 评论 -
集合相关知识梳理
上图直观的显示了集合的整体结构。Collection有boolean add()方法、boolean remove()方法、void clear()方法、boolean contains()方法 boolean isEmpty()方法,类似python的list,set。迭代器底层实现原理定义在Colletion接口中,iterator()返回一个接口。Iterator<E> iterator();具体实现在ArrayList类中,如下: public Iterato.原创 2020-08-05 22:57:41 · 236 阅读 · 0 评论 -
自定义异常的实现
异常信息是如何打印出来的呢?我们在异常类中定义一个带参构造方法,使用super继承父类的构造方法,然后就可以使用getMessage或者printStackTace来显示异常信息了。public ScoreException(String message){ super(message);}我们跟踪看一下在父类中如何实现打印信息的,首先看Expection类,可以看到message也是继承的,如下: public Exception(String message) {原创 2020-08-04 23:07:31 · 1051 阅读 · 0 评论 -
分别使用继承、多态、抽象类和接口方式实现动物类需求
继承实现问题多态实现问题:父类本身可能是一个具体事务,例如动物类。所以上面的多态的实现是有问题的。下面使用抽闲方式实现。抽象实现总结问题接口实现总结...原创 2020-07-12 20:07:17 · 1234 阅读 · 0 评论 -
java知识盲点记录与补充
2020.7.8栈内存和堆内存:栈内存:存储局部变量。使用完立消失。堆内存:存储实体,对象。用完不会立消失,会在垃回收器空闲时回收。public class TestJava{ public static void main(String[] args){ int i[] ={10,20,30}; System.out.println("修改前的值"+i[1]); exchange(i); System.out.println("修改后的值"+i[1]); //动态初.原创 2020-07-08 22:50:38 · 237 阅读 · 0 评论 -
一个DAO的实现
接口package jdbctest;import java.util.List;public interface DAO { //增加 public void add(Hero hero); //更新 public void update(Hero hero); //删除 public void delete(int id); //获取 public Hero get(int id); //查询 public List<Hero> list(int sta.原创 2020-07-05 00:36:05 · 187 阅读 · 0 评论 -
Operation not allowed after ResultSet closed错误的解决
现象:实现一个删除数据库前10条记录的练习时,出现了Operation not allowed after ResultSet closed的错误。原因:由于要先进行查询操作,在while中也就是意味着rs还没有关闭,因为使用了next()函数,这时候再执行删除操作时,也就是意味着查询的rs会close,也就是没有查询的rs,就无法执行rs.next()。因此就出现了上面的错误。解决:多条操作最好使用多个Statement对象,将查询和删除分开。修改如下:Statement sQuery = c.cr原创 2020-07-04 22:47:27 · 13543 阅读 · 0 评论 -
shutdown()与awaitTermination()的分析
shutdown()源码说明如下:/*** Initiates an orderly shutdown in which previously submitted* tasks are executed, but no new tasks will be accepted.* Invocation has no additional effect if already shut down.** This method does not wait for previously submit.原创 2020-06-14 10:51:46 · 10937 阅读 · 1 评论 -
多线程判断本网段有多少可以ping通的ip
ping命令空格问题,正确如下:Process p = Runtime.getRuntime().exec("ping -n 1 "+ip);//空格引发的灾难线程池关闭方式有误,只使用了threadPool.shutdown()进行关闭,正确如下:// 等待所有线程结束的时候,就关闭线程池 threadPool.shutdown(); System.out.println("终于找完了,可以ping通ip如下:"); //等待线程池关闭,但是最多.原创 2020-06-13 22:20:51 · 279 阅读 · 0 评论 -
java判断本网段有多少可以ping通的ip
使用ArrayList生成本网段所有IP的集合。然后使用增强for循环一个个进行判断是否可以ping通,但存在一个问题是这样遍历ip的方式太慢了,应该考虑使用多线程实现。下一篇文章尝试使用多线程进行ping查询。以下整体实现:package socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;imp原创 2020-06-12 17:27:37 · 236 阅读 · 0 评论 -
java线程方法深入理解之join()方法
join()方法意味着等待当前线程执行完,主线程才能继续往下执行。 也就是将当前线程加入到主线程中。例如下面的例子:我们将ts1加入到主线程,看看会发生什么结果?package testthread;public class TestStart extends Thread{ String name; public TestStart(String name) { this.name = name; } public void run() { System.out.println(原创 2020-06-11 13:26:36 · 268 阅读 · 0 评论 -
单线程穷举法破解密码
穷举使用多层for循环完成:for (int i = 48; i < 122; i++) { for (int j = 48; j < 122; j++) { for (int k = 48; k < 122; k++) { ch[0] = (char)i; ch[1] = (char)j; ch[2] = (char)k; String str = new String(ch); } } }完整实现如下原创 2020-06-08 21:16:15 · 547 阅读 · 3 评论 -
多线程穷举法破解密码
该类主要完成查找密码,完成密码匹配。package testthread;import java.util.ArrayList;import java.util.List;public class GetPasswd extends Thread{ private List<String> passwds; private String passwd; public GetPasswd(List<String> passwds,String passwd) { t原创 2020-06-08 16:31:41 · 1354 阅读 · 0 评论 -
多线程查找指定字符串
多线程查找package iolearning;import java.io.File;/** * <p>Title: TestThreadFindString</p> * <p>Description: </p> * @author MaxLee * @date 2020年6月4日 */public class TestThreadFindString { public static void main(Stri原创 2020-06-04 23:22:05 · 491 阅读 · 0 评论 -
for循环和HashMap查找性能比较
package ioandcollection;import java.util.ArrayList;import java.util.HashMap;import java.util.List;public class HashMapTest { public static void main(String[] args) { //for循环初始化 System.out.println("for循环初始化开始"); List<Hero> hero = new原创 2020-06-03 10:34:34 · 1448 阅读 · 0 评论 -
IO详细总结-结构化表达
字符流Writer字符写出流FileWriterread()PrintWriterReader字符读入流FileReaderwrite()BufferedReader字节流OutputStreamFileOutputStream文件输出流write()InputStreamFileInputStream文件输入流read()File文件对象文件操作1isDirectorylength()size()exists()isF.原创 2020-05-30 12:08:19 · 216 阅读 · 0 评论 -
RemoveComments的实现
遇到的问题:在第一次实现的时候,没有注意到使用缓冲流写入数据的时候会清空原有的数据,大忌!!!改进方法:1.在缓冲流读数据过程中,使用stringBuffer的append()方法把判断为不是//的字符保存起来。在使用缓冲流写数据时作为write方法参数传进去。2.判断是否为//的方法:使用trim()方法去除首位空格,再使用startsWith("//")判断读到字符是不是以//开始。if(!line.trim().startsWith("//")) { sb.append(lin.原创 2020-05-29 15:56:40 · 586 阅读 · 0 评论 -
对编码方式的理解
使用一段java代码来解释字符编码。需要的基础知识有UTF-8、ANSI、GBK、ISO-8859-1 ASCII、UNICODED等编码方式。GBK是针对中文字符的编码,使用2字节存储。ASCII就是平常最容易见的字母和数字的编码方式, 使用1字节存储。UNICODED任何字符都能以UNICODED 编码。为什么呢?因为UNICODED在存储的时候占4字节,范围为0x0000-0xFFFF(0-65536).相当于每一个字符可以有16位表示,一共65536种组合,可以容纳世界上所有的语言文原创 2020-05-28 20:29:19 · 539 阅读 · 0 评论 -
使用Reader流进行字符加密
import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class ReaderTest { public static void main(String[] args) { // TODO Auto-generated method stub File f原创 2020-05-28 16:10:09 · 198 阅读 · 0 评论 -
数字与字符、字符串常见操作总结
数字与字符、字符串拆箱与装箱封装类NumberIntegerDoubleFloatLongCharacterString拆箱将封装类变成基本类型装箱将基本类型变成封装类字符串转换字符数组转字符串new一个String对象,传字符数组字符串转字符数组substring()charAt数字转字符串字符串转数字parseInt()格式化输出printf%d%f%s\n字符串字符串操作StringcharAttr原创 2020-05-24 11:25:04 · 282 阅读 · 0 评论