Java基础
萌白在努力
萌白今天也在努力学习与尝试发博客ε≡٩(๑>₃<)۶
展开
-
Java基础:自己编写的一个基于java的socket网络聊天程序
java网络聊天程序刚学习了JavaSocket做的简单的练手程序,若程序存在bug,求大神们指教了!由于我采用的是自己的IP地址,需要修改一下ChatClient的IP地址,以及client下的FileSend的IP地址,有意者可使用一个全局变量进行设置一下。先运行ChatServer,再运行ChatClient。直接上链接http://downl原创 2017-04-18 19:54:59 · 3675 阅读 · 0 评论 -
Java基础:ClassLoader简单理解
问题:什么是ClassLoader?ClassLoader的作用就是在程序运行时加载类到JVM中ClassLoader接收.class,然后产出bytecode给JVM执行引擎去执行问题:为什么需要多个ClassLoader?需要多种方式加载类从文件中加载从内存中加载从网络中加载 。。。加载方式有策略需求:缓存安全统计代理。。。解决版本问题同层不同的ClassLoader加载的类互相不影响子层的ClassLoader可以看到父层的ClassLoader委原创 2021-04-21 21:22:01 · 155 阅读 · 1 评论 -
Java基础:简单理解类的实例对象
注意,本文主要针对常见的Hotspot虚拟机,不同虚拟机实现有所差异。问题:实例对象是什么?实例对象就是根据类创建出来的。例如,人类就是一个类别,这个类别定义了我们人类具有一定的特征(属性)与行为(方法),具体到我和你就是实例对象。问题:实例对象的生命周期是怎样的?加载(load)从磁盘加载到内存——ClassLoader静态数据初始化(包括静态区域“{…}”)——触发原因new xxx()访问该类静态成员手动使用ClassLoader加载完成后进入loaded状态原创 2021-04-21 20:20:14 · 615 阅读 · 0 评论 -
Java基础:尝试构建简单的ClassLoader
目标构建两个简单的ClassLoader任务:生成类字节码。读取类字节码并加载该类。远程读取类字节码并加载该类。生成类的字节码工具使用: <dependency> <groupId>org.javassist</groupId> <artifactId>javassist</artifactId> <version>3.27.0-原创 2021-04-21 17:56:55 · 183 阅读 · 1 评论 -
Java基础:JVM中的GC入门理解
问题:什么是GC?为什么需要GC?GC是JVM中的垃圾回收器,主要用于回收我们不再使用的对象实例。什么情况下不需要GC,程序不创造临时的对象实例时或者内存无限大时。总的来说就是因为计算机资源有限,因此需要GC回收无用资源进行再利用。就像人类为什么需要努力,因为地球资源有限。问题:GC的STW(Stop the world)是什么?GC停止正在执行应用程序业务代码的所有线程,进行空间清理回收。STW的发生时间点在程序执行生产的垃圾比GC清理垃圾的速度快,然后内存占用达到了一定的比例时就会执行S原创 2021-04-20 18:51:06 · 419 阅读 · 0 评论 -
Java基础:JVM中的堆和栈的理解
问题:栈是什么?栈是一种数据结构,特性是先进后出。栈是配合程序(线程)执行的结构体,也就是说程序的执行不能没有栈,但是可以没有堆。程序执行时,栈的作用流程:执行下面代码时,栈的操作流程int add(a, b){ return a+b;} int a = 1; int b = 2; int c = add(a,b); 1和2进行压栈。预留c的值位置压栈。调用程序,预留返回位。将传入的值压栈,计算出值后,将值赋到c上。返回指针位(不删除数据,而是调整指针位进行覆盖)。问题原创 2021-04-20 17:26:28 · 392 阅读 · 1 评论 -
Java并发练习:哲学家聚餐游戏
目标:采用最优方式解答哲学家聚餐游戏问题定义:5个哲学家围在一起吃饭,餐桌上每人都拥有一盘餐食以及每人都拥有一个叉子,但是他们吃饭时需要双手都拿叉子才能吃饭,如何高效的让他们吃饭?哲学家会先进行思考,思考过后会进入饥饿状态,需要吃饭,吃完饭后完成一轮。哲学家类定义了哲学家的可进行的操作。思路定义:竞争分离:将竞争叉子的任务分离到一个单线程进行,其余耗时的操作交给多个工作线程来做创建两个任务队列:一个用于进行哲学家任务(多线程,主IO)。,另外一个进行分配叉子的任务(单线程,无竞争)。哲原创 2021-04-18 20:24:42 · 232 阅读 · 1 评论 -
Java并发练习:无锁编程
目标:利用AtomicStampedReference实现栈的压入弹出无锁编程AtomicStampedReference意义:对数据进行CAS(compareAndSet)无锁自加或者更换栈的表头之类的问题时会出现ABA问题,AtomicStampedReference通过增加版本号(时间戳)来解决这个问题。AtomicStampedReference(V initialRef, int initialStamp):初始化,传入初始数据与初始版本号getReference():获取当前引用数据原创 2021-04-17 17:46:17 · 238 阅读 · 0 评论 -
Java并发练习:构建一个简单的线程池
目标:构建一个简单的线程池功能如下:可提交Runnable任务。任务队列,需要支持DualStack与DualQueue。线程队列,最小线程数(一直存在),可扩展线程数。根据任务量调整线程量,任务繁忙线程数扩展到最大线程数,任务空闲清空所有空闲的扩展线程。任务队列简述:LinkedTransferQueueDualQueue:双向结构,公平的(先进先出),需要使用tryTransfer才是DualQueue的模式,调用offer就相当于普通的LinkedBlockingQueue。原创 2021-04-17 16:09:43 · 159 阅读 · 0 评论 -
Java并发练习:ThreadLocal的理解与使用
问题:ThreadLocal是什么?ThreadLocal线程局部变量,只能在当前线程中调用,其他线程无法访问(包括主线程)。每个Thread线程中都有一个属性threadLocals,通过ThreadLocal才能使用该属性。在应用程序中,所有线程其实是共享同一份内存的,因此数据实际上是可以互相操作的。但是这会带来很大的程序隐患,因此线程需要封闭,避免并发问题。而ThreadLocal就是用来实现把数据进行隔离,数据不共享。ThreadLocal 就是一种以空间换时间的做法,在每个 Threa原创 2021-04-16 23:11:29 · 162 阅读 · 0 评论 -
Java并发练习:volatile详解
问题:为什么要使用volatile?最主要的原因就是CPU的分级缓存问题,每个CPU都具有独立的缓存,而变量的值存在CPU的独立缓存中,没有及时进行刷新导致。CPU与Java虚拟机会对程序代码进行指令重排来优化代码。代码演示:package com.miracle.study.vola;import java.util.concurrent.TimeUnit;/** * @author Miracle * @date 2021/4/15 16:39 */public class原创 2021-04-15 17:07:17 · 111 阅读 · 0 评论 -
Java并发练习:高性能创建单例,面试必备
目标:高性能的创建单例关键问题避免并发创建多个单例降低锁消耗大量性能volatile确保语义上对变量的读、写操作顺序被观察到。volatile变量读写时会增加内存屏障。volatile变量读写时会禁用局部指令重排。保证对volatile的操作happens-before另一个操作。AtomicReference关键方法getAcquire()与setRelease(),它们可以确保代码不被重排序。AtomicReference与volatile的功能相似,但是它对于代码的指令原创 2021-04-15 16:24:03 · 145 阅读 · 0 评论 -
Java并发练习:Phaser的简单使用
目标:使用Phaser构造简单阶段任务反馈Phaser移相器:可重用的同步屏障,功能比CyclicBarrier与CountDownLatch更加灵活。onAdvance:全部线程执行完毕后会进行调用,每次都会使参数phase的值+1,可用于判断阶段。返回true的话会结束phase。register():线程进行注册,实际是进行一次信号+1。arriveAndAwaitAdvance():阻塞并等待其他线程到达,等信号值达到一定值时会通过。arriveAndDeregister():非阻塞,原创 2021-04-14 22:02:59 · 121 阅读 · 0 评论 -
Java并发练习:简单运用CyclicBarrier进行分治策略
目标:利用CyclicBarrier进行任务拆分与整合CyclicBarrier循环栅栏:让一组同时运行的线程到达栅栏阻塞,直到全部线程都到达(可执行一段同步程序),然后继续执行。new CyclicBarrier(int val, Runnable):val为线程数,Runnable为同步时的执行程序。await():线程内执行await()时就会进行阻塞,等待其他线程全部到达屏障。代码实现:package com.miracle.study.concurrent;import jav原创 2021-04-14 20:25:41 · 98 阅读 · 0 评论 -
Java并发练习:CountDownLatch与Callable运用
目标:运用CountDownLatch与Callable进行简单的计数CountDownLatch与CyclicBarrier相似,只是它只实现了一次任务拆分与整合,用来协调多个线程之间的同步。new CountDownLatch(int val):初始化时,需要设置信号值。countDown():每一次进行countDown都会是信号值-1。await():只有当信号值为0时,才会停止阻塞。Callable有返回值的线程运算体。与Runnable类似需要利用FutureTask接收返原创 2021-04-14 18:34:25 · 1007 阅读 · 0 评论 -
Java并发练习:exchange简单使用
目标:两个线程进行数据交换exchangeexchange只能用于两个线程进行数据交换,它的交换速率是高效的exchanger.exchange(object obj):这个方法会阻塞,直到另一个线程也同样调用这个方法进行数据交换,当然也可以使用timeout避免阻塞过长时间。代码实现:package com.miracle.study.concurrent;import java.util.concurrent.Exchanger;/** * @author Miracle *原创 2021-04-14 17:58:23 · 510 阅读 · 0 评论 -
Java并发练习:Semaphore信号工具简单使用
目标使用Semaphore构建简单的生产者消费者模型Semaphore基于AQS实现的,用于控制临界区的线程并行数量。acquire(int val),不填值时,默认消耗一个信号,填值时根据值消耗信号。release(int val),不填值时,默认增加一个信号,填值时根据值增加信号。release的值可以比线程进来时设定的acquire中的信号值要大。代码:思路:运用两个Semaphore,分别是消费者Semaphore与生产者Semaphore进行互相消耗与增加,控制queue中的s原创 2021-04-14 17:45:13 · 91 阅读 · 0 评论 -
Java并发练习:构建简单的AQS实现Semaphore信号锁
目标:使用AQS实现简单的Semaphore信号锁信号锁实现:tryAcquireShared:尝试获取许可tryReleaseShared:尝试释放许可代码:package com.miracle.study.syn;import org.junit.jupiter.api.Test;import java.util.concurrent.locks.AbstractQueuedSynchronizer;/** * @author Miracle * @date 2021/原创 2021-04-13 22:55:19 · 87 阅读 · 0 评论 -
Java并发练习:构建简单的AQS实现互斥锁
目标:使用AQS实现简单的互斥锁互斥锁实现:tryAcquire:尝试获取锁tryRelease:尝试释放锁代码:package com.miracle.study.syn;import org.junit.jupiter.api.Test;import java.util.concurrent.locks.AbstractQueuedSynchronizer;/** * @author Miracle * @date 2021/4/13 19:59 */public cl原创 2021-04-13 20:40:45 · 126 阅读 · 0 评论 -
Java并发练习:synchronize练习简单构造生产者与消费者模型
目标:synchronize基本功能练习功能:上锁、解锁中断休眠与唤醒ReentrantLock同样的实现:相较于synchronize,ReentrantLock相对灵活更多,特别对于condition与中断以及非阻塞层面。https://blog.csdn.net/k295330167/article/details/115675185代码:package com.miracle.study.syn;import java.util.LinkedList;import原创 2021-04-13 19:57:11 · 83 阅读 · 0 评论 -
Java并发练习:ReentrantLock练习简单构造生产者与消费者模型
目标:ReenTrantLock的基本功能练习功能练习:上锁、解锁中断条件信号代码:package com.miracle.study.syn;import java.util.LinkedList;import java.util.Random;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * @author Miracle *原创 2021-04-13 18:36:07 · 120 阅读 · 0 评论 -
SpringBoot练习:注解实践,自动生成查询SQL语句
目标:实现通过注解自动生成SQL语句要求:用户表字段:用户名、年龄、手机号码方便对每个字段的组合条件进行检索,打印SQL模仿JPA代码实现:表注解:@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Table { String value();}字段注解:@Target({ElementType.METHOD})@Retention(RetentionPoli原创 2021-04-11 21:24:20 · 925 阅读 · 0 评论 -
Java练习:动态规划
目标:实现下面游戏的最优路线规则每个方格的数字代表一个分数值,争取从START开始以最大分数值到达END只能有三种移动方式:向下、向右、向右下代码思路将思维放在如何在每一步取得当前格可能获得的最大分数值。如下图所示:根据规则的走法,右下角的值只有3种可能:5、9、13,因此取13。2、为了计算放在边缘的值与计算不是在边缘的值使用同一套算法,我们可以增加1行与1列做哨兵,如下图所示:3、计算出最大分数值后,进行终点逆推得出路线,因此每个坐标都需要记录分数与上一个坐标位置。最佳答案如原创 2021-04-10 19:59:16 · 115 阅读 · 1 评论 -
Java基础:两个栈实现队列,两个队列实现栈
练习一:两个栈实现队列思路:两个栈,一个作为push栈,一个作为pop栈。数据push直接push到push栈中。数据pop,从pop栈中pop,pop栈数据为空时,从push栈中pop出所有数据进入pop栈package com.miracle.study.qs;import org.junit.jupiter.api.Test;import java.util.Stack;/** * 两个栈实现队列(先进先出) * @author Miracle * @date 2021原创 2021-04-09 20:36:50 · 196 阅读 · 0 评论 -
Java练习:构建简单的二叉树
目标:构建简单的二叉树,实现简单的功能功能:构建树结构添加节点先序、后序、中序遍历反转树计算高度或深度广度优先算法难点删除:建议参考以下博客文章https://blog.csdn.net/isea533/article/details/80345507/旋转:建议参考以下博客文章https://blog.csdn.net/saasanken/article/details/80796178代码:package com.miracle.study.tree;原创 2021-04-08 16:40:56 · 112 阅读 · 0 评论 -
Java练习:构造简单的单链表
目标构造简单的单链表实现功能如下插入数据查询数据移除数据获取Size反转数据遍历数据代码:package com.miracle.study.list;import org.junit.jupiter.api.Test;import java.util.Iterator;import java.util.function.Predicate;/** * @author Miracle * @date 2021/4/7 16:34 */public class TL原创 2021-04-07 22:46:34 · 143 阅读 · 0 评论 -
Java练习:桶排序算法
桶排序算法桶排序的两个关键点:如何让需要排序的数组中的数值更加平均的分配到桶里。如何让桶里的数据进行排序。桶排序的两种模式桶的数量大于等于需要排序的数组中的最大值,这样的话可以直接忽略上面两个关键点,只适合于小取值范围的排序,见simpleBucketSort。桶的数量不等于数组中的最大值。需要定义数值分配到桶的算法以及桶内排序的算法。见bucketSortpackage com.miracle.study.sort;import org.junit.jupiter.api.Tes原创 2021-04-07 13:31:16 · 132 阅读 · 0 评论 -
Java练习:快速排序
快速排序https://www.runoob.com/w3cnote/quick-sort-2.htmlpackage com.miracle.study.sort;import org.junit.jupiter.api.Test;import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;/** * @author Miracle * @date 2021/4/6 15:3原创 2021-04-07 00:14:00 · 86 阅读 · 1 评论 -
Java练习:归并排序
归并排序图片来源:https://www.runoob.com/w3cnote/merge-sort.htmlpackage com.miracle.study.sort;import org.junit.jupiter.api.Test;import java.util.Arrays;/** * @author Miracle * @date 2021/4/6 17:20 */public class MergeSort { public int[] mergeSo原创 2021-04-06 22:51:22 · 84 阅读 · 0 评论 -
Java练习:插入排序、选择排序、冒泡排序
实现插入排序:图片来源:https://www.runoob.com/w3cnote/insertion-sort.htmlpackage com.miracle.study.sort;import org.junit.jupiter.api.Test;import java.util.Arrays;/** * @author Miracle * @date 2021/4/5 22:17 */public class InsertionSort { public vo原创 2021-04-05 23:30:26 · 83 阅读 · 1 评论 -
Java练习:Proxy切面编程
目标:利用Proxy完成一个订单业务时间检测知识点:ProxyJDK动态代理:java.lang.reflect.Proxy。动态生成代理类:在程序运行时生成代理类来进行代理,主要利用Java的反射机制。Proxy代理的是接口,并不是类或抽象类。使用:业务代码:package com.miracle.study.aspect;/** * 订单业务接口 * @author Miracle * @date 2021/4/4 12:52 */public interface IO原创 2021-04-04 20:34:42 · 129 阅读 · 1 评论 -
Java练习:文件词频计算
目标:使用单线程与多线程分别进行词频计算随机生成数据文件代码: @Test public void gen() throws IOException { var ramdom = new Random(); var fileName = new File("Test"); var fileStream = new FileOutputStream(fileName); var bufferSize = 4*1024;原创 2021-04-03 23:31:13 · 151 阅读 · 0 评论 -
Java练习:如何分批次将UTF8字节转换中文字符
目标:分批次将UTF8字节转换中文字符关键问题: 1. UTF8中汉字占的字节数3-4个,因此需要注意分批时汉字被切割。 2. “StandardCharsets.UTF_8”未成功解析的字节不会写入新的缓冲区中。 3. 需要记录每次读取的位置。 4. Arrays.copyOfRange会的to位置过大有可能会造成空读,超出部分它照样会创建空间。思路:分批次获取到字节的一部分,每次获取尽量不要小于5是最好的(最低也要3)。利用字节缓冲区的position指针与limit指针计算出未成功原创 2021-04-03 18:19:46 · 1183 阅读 · 0 评论 -
Java基础:@FunctionalInterface说明以及使用
目标:学会如何使用@FunctionlInterface理解@FunctionlInterface通常用于函数式编程除了可以和普通接口一样写Impl之外,还可通过Lambda表达式进行构造,而不用写Impl class。@FunctionlInterface的使用规则该注解只能标记在"有且仅有一个抽象方法"的接口上,该接口继承的接口的抽象方法也计算在内。被注解的接口可以有默认方法/静态方法,或者重写Object的方法使用简单使用:package com.miracle.原创 2021-04-02 22:00:20 · 4461 阅读 · 0 评论 -
Java基础:实现一个基于LinkedHashMap的简要LRUCache类
目标:实现一个基于LinkedHashMap的简要LRUCache类LRUCache的特性LRU:least recently used,翻译为最近最少使用到,设计原则:当数据集合满了之后,添加数据时会将最先进入集合的数据进行删除。缓存:查询速度快,通常基于key-value。LinkedHashMap的特性继承自HashMap:支持Kep-value以及快速查找,但增加了时间和空间上的开销。Entry的双向链表:有序的,插入顺序和访问顺序,默认采用插入顺序思路创建一个类,集成It原创 2021-04-01 21:30:40 · 165 阅读 · 0 评论 -
Java基础:实现Iterable迭代器,让对象支持for循环
目标:创建一个支持for-Each循环并随机获取数据的集合类for-each 是 Java 中的一种语法糖,for-Each循环主要是利用了类中的iterator,写法如下 // 语法糖写法 for (var text : asg){ System.out.println(text); } // 原理 for(Iterator<String> text = asg.iterator();text.hasNex原创 2021-04-01 21:02:15 · 425 阅读 · 0 评论