java基础
java学习总结
行者老夫
这个作者很懒,什么都没留下…
展开
-
Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试
Java 反射调用方法 - 不跳过安全检查、跳过安全检查和普通方法性能比较测试java中反射提供灵活性同时,给运行效率带来了一定影响。写个代码测试一下package com.xzlf.reflectTest;import java.lang.reflect.Method;import com.xzlf.bean.User;/** * 反射、反射跳过安全检查、普通方法调用性能比较 * @author xzlf * */public class Demo...原创 2020-04-11 18:25:57 · 748 阅读 · 0 评论 -
Java 反射 -- 获取泛型类型
Java 反射 -- 获取泛型类型先写一个类:public class Demo03 { public void test01(Map<String, User> map, List<User> list) { System.out.println("Demo03.test01()"); } public Map<Integer, User> test02(){ System...原创 2020-04-11 18:19:10 · 437 阅读 · 0 评论 -
Java 网络编程 -- 基于TCP实现文件上传
Java 网络编程 -- 基于TCP实现文件上传Java TCP 操作基本流程一、创建服务器1、指定端口, 使用serverSocket创建服务器2、阻塞式连接 accept3、操作:输入流 输出流4、释放资源二、创建客户端1、使用Socket 创建客户端 + 服务器的ip和端口2、操作:输入流 输出流3、释放资源实现文件上传:客户端上传:public class FileClient { public static...原创 2020-04-05 16:37:15 · 767 阅读 · 2 评论 -
Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁
Java 多线程 -- 理解锁:手动实现可重入锁和不可重入锁JDK提供的大多数内置锁都是可重入的,也就是 说,如果某个线程试图获取一个已经由它自己持有的锁时,那么这个请求会立 刻成功,并且会将这个锁的计数值加1,而当线程退出同步代码块时,计数器 将会递减,当计数值等于0时,锁释放。如果没有可重入锁的支持,在第二次 企图获得锁时将会进入死锁状态。现实中,我们一般不会去手动实现锁,而是直接使用JDK或其他框架提供的锁,手动实现主要为了理解。不可重入锁:/...原创 2020-04-04 16:10:34 · 502 阅读 · 0 评论 -
Java 多线程 -- volatile 山寨版的synchronized
Java 多线程 -- volatile 山寨版的synchronized在 多线程中,每个线程会把数据从主内存中拷贝到自己的工作内存中,当线程完成计算后,再把工作内存的数据更新到主内存中,或者当主内存主数据有更新是,线程会去主内存取最新数据。但是,当线程特别忙时,就不会去主内存读最新数据了。在 java 的多线程中 volatile 主要是为了保证数据的可见性同步,是一个轻量级的synchronized,但是 volatile 并不能保证数据的原子性。下面看一下加...原创 2020-04-03 01:45:57 · 532 阅读 · 0 评论 -
Java 多线程 -- 指令重排(HappenBefore)
Java 多线程 -- 指令重排(HappenBefore)指令重排是指:代码执行顺序和预期不一致。代码运行一般步骤为:1、从内存中获取指令解码2、计算值3、执行代码操作4、把结果写回内存而写回内存的操作比较耗时,CPU为了性能,可能不会等它完成,就进行对下一个指令解码计算。发生指令重排是CPU为了提高性能,但必须是对结果不影响的情况,比如:a =1; b =2; 先计算a 或者 b 对结果来说没有影响,就有肯能发送重排;而像 a = 5;...原创 2020-04-03 01:19:24 · 727 阅读 · 2 评论 -
Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法
Java 多线程 -- 协作模型:生产消费者实现方式二:信号灯法使用信号灯法实现生产消费者模式需要借助标志位。下面以演员表演,观众观看电视为列,写一个demo同一资源 电视://同一资源 电视class Tv { String voice; // 信号灯 // T 表示演员表演 观众等待 // F 表示观众观看 演员等待 boolean flag = true; // 表演 public synchronized void play(S...原创 2020-04-02 23:34:35 · 573 阅读 · 0 评论 -
Java 多线程 --死锁及解决方案
Java 多线程 -- 死锁在java 多线程中 过多的同步造成相互不释放资源 从而相互等待,造成死锁线现象,一般发生于同步中持有多个对象锁如以下代码:public class DeadLock { public static void main(String[] args) { WuDao wd1 = new WuDao(0, "金毛狮王"); WuDao wd2 = new WuDao(1, "灭绝师太")...原创 2020-04-01 02:02:24 · 650 阅读 · 0 评论 -
Java 多线程 -- 线程安全 双重检测(double checking)
Java 多线程 -- 线程安全 双重检测(double checking)先看一个经典的12306案例:public class SynBlockTest { public static void main(String[] args) { // 一份资源 SynWeb12306 web = new SynWeb12306(); // 多份代理 new Thread(web,"黄牛").start(); new Thread(web,"码农")....原创 2020-03-31 22:18:15 · 1159 阅读 · 0 评论 -
Java 多线程 -- lambda 表达式推导
Java 多线程 -- lambda 表达式推导jdk 8 开始 java 引入了lambda 表达式。lambda适用场景:1、接口或父类2、接口或父类只有一个方法我们从多线程写法来推导一下:1、外部类写法:package com.xzlf.thread;/** * Lambda 表达式推导一:外部类 * @author xzlf * */public class LambdaTest01 { public stat...原创 2020-03-30 03:35:45 · 933 阅读 · 0 评论 -
Java 多线程实现方式三:实现 Callable 接口
Java 多线程实现方式三:实现 Callable 接口java 通过实现Callable 接口来实现多线程相比较于继承Thread 接口和 实现Runnable 接口比较麻烦,但好处是可以有返回值。基本套路:1. 创建目标对象2. 创建执行服务3. 提交执行4. 获取结果5. 关闭服务6.继续方式一的下载图片,改写一下:public class CDownload implements Callable<Boolean>...原创 2020-03-30 01:28:15 · 904 阅读 · 0 评论 -
Java 多线程实现方式二:实现 Runnable 接口
Java 多线程实现方式二:实现 Runnable 接口由于java是单继承,很多时候为了实现多线程 通过继承 Thread 类后,就不能再继承其他类了。为了方便可以通过实现 Runnable 接口来实现,和Tread 类似需要重写run 方法。下面通过模拟12306 黄牛抢票来简单应用:public class Web12306 implements Runnable{ //票数 private int ticketNums = 99; ...原创 2020-03-30 01:19:57 · 811 阅读 · 0 评论 -
Java 多线程实现方式一:继承Thread类
Java 多线程实现方式一:继承Thread类java 通过继承Thread类实现多线程很多简单:只需要重写run方法即可。比如我们分三个线程去京东下载三张图片:1、先写个下载类:注意导入CommonsIO 包public class WebDownLoad { public void download(String url, String name) { try { FileUtils.copyURLToFile(ne...原创 2020-03-30 01:06:02 · 902 阅读 · 0 评论 -
Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)
Java IO 流 -- 随机读取和写入流 RandomAccessFile (文件分割和合并)RandomAccessFile 相对其它流多了一个seek() 方法指定指针的偏移量。1、指定起始位置读取剩余内容public static void test01() throws IOException { RandomAccessFile raf = new RandomAccessFile("src/com/xzlf/io/CopyFile.java", "r"); // 随...原创 2020-03-29 16:50:15 · 993 阅读 · 0 评论 -
Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStream
Java IO 流 -- 数据流和对象流 DataOutputStream ObjectOutputStDataOutputStream 和 ObjectOutputStream的共同点是:1、写出后读取2、读取顺序和写出一致数据流操作:// 写入 ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(new BufferedOutpu...原创 2020-03-29 16:12:44 · 1050 阅读 · 0 评论 -
Java IO 流 -- 转换流: InputStreamReader OutputStreamWriter
Java IO 流 -- 转换流: InputStreamReader OutputStreamWritjava 中 转换流是以字符流的形式操作字节流,需要注意一下两点:1、操作内容必须是纯文本2、指定字符集避免乱码操作控制台输入输出:try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new Outp...原创 2020-03-29 15:51:38 · 908 阅读 · 0 评论 -
Java IO 流--FileUtils 工具类封装
Java IO 流--FileUtils 工具类封装IO流的操作写多了,会发现都已一样的套路,为了使用方便我们可以模拟commosIo 封装一下自己的FileUtils 工具类:1、封装文件拷贝:文件拷贝需要输入输出流对接,通过输入流读取数据,然后通过输出流写出数据,封装代码如下:/** * 对接输入输出流 * * @param is * @param os */ public static void copy(In...原创 2020-03-27 03:26:59 · 1708 阅读 · 0 评论 -
Java IO 流-- 字节数组流ByteArrayInPutStream ByteArrayOutPutStream
Java IO 流-- 字节数组流ByteArrayInPutStream ByteArrayOutPu字节数组流输于缓冲流,放在jvm内存中,java可以直接操作。我们使用时可以不用关闭,交给GC垃圾回收机制处理、当然我们为了保持良好习惯和代码一致性也可以加上关闭语句。当其实我么打开ByteArrayInputStream 和 ByteArrayOutputStream 源码可以发现字节数组里的colse() 方法是个空方法:/** * Closing a <tt>B...原创 2020-03-27 02:28:45 · 1062 阅读 · 0 评论 -
Java IO 流-- 文件拷贝
Java IO 流-- 文件拷贝IO流操作套路:1、创建源;2、选择流;3、操作;4、释放资源上代码:package com.xzlf.io;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStr...原创 2020-03-27 02:14:45 · 1109 阅读 · 0 评论 -
Java IO基础--File常用操作(递归)
Java IO基础--File常用操作(递归)File中经常会使用递归方法打印属性结构、统计文件夹下文件个数、子文件夹个数以及文件大小,可以作为递归的应用练习。递归的写法,百度一搜一大堆,这里我使用对javabean方式封装了一下:package com.xzlf.io;import java.io.File;public class TestCount { private String dir;//文件夹 private...原创 2020-03-26 03:40:49 · 1079 阅读 · 0 评论 -
理解java容器底层原理--手动实现HashSet
理解java容器底层原理--手动实现HashSetHashSet的底层其实就是HashMap,换句话说HashSet就是简化版的HashMap。直接上代码:package com.xzlf.collection2;import java.util.HashMap;public class MyHashSet<E> { HashMap<E, Object> map; private static fina...原创 2020-03-24 02:28:52 · 1149 阅读 · 0 评论 -
理解java容器底层原理--手动实现HashMap
理解java容器底层原理--手动实现HashMapHashMap结构HashMap的底层是数组+链表,百度百科找了张图:先写个链表节点的类package com.xzlf.collection2;public class Node { int hash; Object key; Object value; Node next;}自定义一个HashMap,实现了put方法增加键值对,并解决了键重复的时候覆盖相应的节点p...原创 2020-03-23 02:30:28 · 1274 阅读 · 0 评论 -
理解java容器底层原理--手动实现LinkedList
理解java容器底层原理--手动实现LinkedListNodejava 中的 LIinkedList 的数据结构是链表,而链表中每一个元素是节点。我们先定义一下节点:package com.xzlf.collection;public class Node { Node previous; // 上一个节点 Node next; // 下一个节点 Object element; // 元素数据 public Node(Objec...原创 2020-03-22 23:58:13 · 1188 阅读 · 0 评论 -
理解java容器底层原理--手动实现ArrayList
理解java容器底层原理--手动实现ArrayList版本一:基础版本实现对象创建、元素添加、重新toString() 方法package com.xzlf.collection;/** * 自定义一个ArrayList,体会底层实现原理 * 初始版本 * @author xzlf * * @param <E> */public class MyArrayList<E> { private Ob...原创 2020-03-22 18:20:14 · 1215 阅读 · 0 评论 -
Java 集合框架总结--导图
Java 集合框架总结--导图原创 2020-03-22 16:42:09 · 1282 阅读 · 0 评论 -
java 容器(collection)--ArrayList 常用方法分析 源码分析
java 容器(collection)--ArrayList 常用方法分析 源码分析原创 2020-03-21 18:13:50 · 1276 阅读 · 0 评论 -
java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列
java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列什么是递归我先看下百度百科的解释:一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的。用递归过程定义的函数,称为递归函数,例如连加、连乘及阶乘等。凡是递归的函数,都是可计算的,即能行的 。古典递归函数,是一种定义在自然数集合上的函数,它的未知值往往要通过有限次运算回归到已知值来求出,故称为“递归”。它是古典递归函数论的研究对象 。简单的说,递归一定要有递归体头和递归体。...原创 2020-03-21 04:30:04 · 1395 阅读 · 0 评论 -
java中String StringBuilder StringBuffer比较和效率(性能)测试
java中String StringBuilder StringBuffer比较和效率(性能)测试string stringbuilder stringbuffer三者的区别从JDK源码看,String、StringBuilder、StringBuffer都是存放在char[] 数组字符串。简单看下三者的部分源码:String定义属性和构造方法:public final class String implements java.io.Serializable, Compara...原创 2020-03-19 03:25:09 · 2233 阅读 · 0 评论 -
Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析
Java 自动拆箱 装箱 包装类的缓存问题--结合源码分析都0202 了 java 1.8 已经是主流自动装箱 、拆箱已经很普遍使用了,那么有时候是不是会遇到坑呢?我们先来看一段代码:public class TestWraperClass { public static void main(String[] args) { Integer a = 200; Integer b = 200; Integer c = 123; ...原创 2020-03-18 02:37:14 · 1534 阅读 · 0 评论 -
java算法-二分法查找实现
java算法-二分法查找实现什么是二分法查找首先,使用二分法查找的前提是:被查找的数组已排好序具体实现:假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。...原创 2020-03-16 03:39:49 · 5501 阅读 · 0 评论 -
Java 排序算法-冒泡排序及其优化
Java 排序算法-冒泡排序及其优化Java 排序算法-冒泡排序及其优化什么是冒泡排序基本写法优化后写法终极版本源码及测试什么是冒泡排序这里引用一下百度百科上的定义:冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经...原创 2020-03-15 01:11:06 · 1822 阅读 · 0 评论