java
梦想远航
既往不恋,纵情向前
展开
-
Java同步回调 异步回调机制
参考这篇博客http://www.importnew.com/24220.html例子中老师类实现Callback接口,里面拿到一个学生实例(真实场景中可以拿到学生类的集合,挨个提问)实例化一个老师,提出一个问题。有个学生类,实例化一个具体的学生,回答这个问题,学生回答问题的时候需要把老师这个类当做参数传进去,线程睡3s,模拟学生思考问题,学生给出答案,因为已经拿到老师类了,可以回调老师类中的...原创 2018-06-29 20:47:22 · 1466 阅读 · 1 评论 -
Java反射机制
三种方法得到字节码package com.company.反射与内省.ForName初始化类;/** * Created by jason on 2017/12/8. * java团长 https://mp.weixin.qq.com/s/2a80YJGGBe4wjUp5reCZlw */public class Run { public static void mai...原创 2018-06-24 23:14:53 · 143 阅读 · 0 评论 -
多线程 程序完成指定任务,开启多少并发线程最合适
首先要考虑执行的任务是什么类型: 1、IO密集型 2、计算密集型IO密集型:以大量任务读写数据库,读写文件为主,内存中的运算很少,线程基本阻塞在IO上面。这种情况下,尽量多开启一些线程并发做IO操作,因为在IO过程中,CPU几乎是闲置的。 计算密集型:任务以内存中的计算为主。这时候CPU是满负荷工作,即使开再多的线程,只会徒增线程上下午切换的成本。这种情况下,CPU是几核,就开几个线程。...原创 2018-05-14 12:26:14 · 3377 阅读 · 0 评论 -
负数的 二进制表示
首先理解以下概念 原码:正数原码就是最简单的二进制表示,比如5 就是0000 0101 有八位的话负数原码 -5 就是有最左边以为是符号位 1000 0101如果用负数的原码表示buye 只能表示 -127~127之间的数,因为0会有两种表示方法 0000 0000 和 1000 0000这导致一个问题,只能表示255个数。即使考虑用1000 0000表示-128,又引出一个问题,...原创 2018-04-25 22:40:45 · 1309 阅读 · 0 评论 -
如何设计一个高并发的系统
① 数据库的优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 ② 使用缓存,尽量减少数据库 IO ③ 分布式数据库、分布式缓存 ③ 服务器的负载均衡...原创 2018-05-03 23:03:33 · 4117 阅读 · 0 评论 -
面向对象三大特性
https://www.jianshu.com/p/c34aac5646e9 而松耦合恰好就是解决这种依赖关系,通过接口访问数据信息。 不允许直接访问其它服务的数据,因为它破坏了封装性,造成了一种内部依赖。当服务的内部状态发生改变,则这改变带来的影响会散播到所有依赖该服务的地方 —— 做软件的人都知道,这是最头疼的事情,各种莫名的bug往往在这种情况下产生。作者:王宝花 链接:https...原创 2018-04-24 14:46:17 · 112 阅读 · 0 评论 -
JVM内存模型
分为 一、线程私有: 虚拟机栈,程序计数器,本地方法栈 虚拟机栈在 二、线程共享: 堆,方法区,常量池 方法区中有类信息,类变量。类变量是静态字段,类虽然有多个实例,静态变量只有一份。这在类加载的过程中就能确定大小,在类加载的时候就分配内存空间,放在方法区中的静态区。从编译原理的角度理解内存分配策略 这段摘自https://www.cnblogs.com/langtianya/p...原创 2018-03-27 22:24:07 · 110 阅读 · 0 评论 -
内存泄漏和内存溢出
https://www.cnblogs.com/panxuejun/p/5883044.html 这篇博客写的很好几句话总结如下: 一、内存泄漏:不再使用的对象持续战友内存或者无用的内存得不到释放,从而造成内存空间的浪费。 产生原因:长生命周期的对象持有短生命周期对象的引用。 如下2个例子: 1、静态集合类引起内存泄漏 像HashMap、Vector等的使用最容易出现内存泄露,这些...原创 2018-04-15 15:06:28 · 229 阅读 · 0 评论 -
彻底理解Java的Future模式
转载https://www.cnblogs.com/cz123/p/7693064.html 先上一个场景:假如你突然想做饭,但是没有厨具,也没有食材。网上购买厨具比较方便,食材去超市买更放心。实现分析:在快递员送厨具的期间,我们肯定不会闲着,可以去超市买食材。所以,在主线程里面另起一个子线程去网购厨具。但是,子线程执行的结果是要返回厨具的,而run方法是没有返回值的。所以,这才是难点,...转载 2019-07-13 17:11:46 · 332 阅读 · 1 评论 -
BIO Socket网络编程实例 附代码
Server端package com.wp.bio;import java.io.IOException;import java.net.ServerSocket;import java.net.Socket;public class Server { final static int PROT = 8765; public static void main(...原创 2018-06-28 10:16:46 · 496 阅读 · 0 评论 -
JDK8写代码比较好的技巧 Future FutureTask Callable Stream Predict Function Optional Lombok Google中的ImmuableMap
Future模式原创 2019-07-13 17:10:28 · 291 阅读 · 0 评论 -
Java Hashcode和equals方法
为什么在重写equals方法的同时,必须重写hashCode方法? 在使用set集合的时候,往其中放入内容相同的对象,如果没有重写hashCode()方法,那么set中将会放入内容相同的对象(因为2个对象地址不同),这和set集合的性质不同。因此需要再重写equals方法的同时,必须重写hashCode方法。...原创 2018-07-12 08:03:05 · 127 阅读 · 0 评论 -
Java类加载机制
参考https://mp.weixin.qq.com/s/x3Z6srrlTJsPzPS8QMSyWg首先能看到 ExtClassLoader 确实是 AppClassLoader 的双亲,不过却没有看到 BootstrapClassLoader。事实上,上文就提过, BootstrapClassLoader比较特殊,它是由 JVM 内部实现的,所以 ExtClassLoader.ge...原创 2018-07-11 22:39:40 · 125 阅读 · 0 评论 -
泛型讲解
https://blog.csdn.net/harvic880925/article/details/49883589这篇博客写的很好转载 2018-07-23 10:25:54 · 1185 阅读 · 0 评论 -
Socket BIO编程实例 NIO编程
源本教育 https://www.bilibili.com/video/av16773924?from=search&seid=11920440178139597593 一、每个socket实例都有一个线程负责 BIO 同步非阻塞形式 实例见博客 BIO Socket网络编程实例 附代码二、优化 使用线程池 仅仅只是做了个改良,还是阻塞式的三、NIO 阻塞:接收数据...原创 2018-06-28 10:25:41 · 318 阅读 · 0 评论 -
Http中有关缓存的首部字段有哪些?Http浏览器缓存机制
一、 Last-Modified 存在服务器发往客户端的Http response中 if-Modified-Since 存在客户端发往服务器的Http request中二、Etag if-None-Match三、Expires Cache-Control原创 2018-04-07 16:57:15 · 354 阅读 · 0 评论 -
从浏览器中输入网址到呈现页面发生了什么
如输入www.baidu.com 一、获得baidu.com的IP地址,通过UDP的包给DNS服务器解析,返回baidu.com的IP,通常浏览器会把IP地址缓存起来,这样下次访问更快。 二、知道服务器IP后,发起HTTP请求 三、建立TCP连接,需要知道服务器IP和端口,默认HTTP服务是80。本机IP也是知道的,本机端口操作系统可以给浏览器随机分配一个。 四、建立TCP连接后,发送HT...原创 2018-03-19 23:08:06 · 589 阅读 · 0 评论 -
静态内部类 单例设计模式举例
单例设计模式可以用静态内部类实现,下面解释它的优点和原因。懒加载 创建方式是用内部静态类中的一个静态方法返回实例对象。在不使用的时候这个单例是不会存在的。这个就和懒汉式是一样的。线程安全 如果有多个线程同时创建实例,根据类加载的机制,多线程初始化一个类,JVM能保证只有一个线程执行初始化方法,其他线程进入阻塞状态。但是它能被反射来重复构造对象。从静态内部类能复习类初始化时的顺序,先父类静原创 2018-01-17 19:14:24 · 271 阅读 · 0 评论 -
子类继承和覆盖父类的静态方法 解释了静态工厂方法不方便扩展
子类可以继承和覆盖父类的静态方法,但是如果在定义时用的是父类,即使实例化的是子类也无法方法覆盖后的静态方法。这样在用静态工厂方法的时候会导致无法像产品类一样提供抽象层,也无法通过具体类进行扩展。 静态方法是类方法,类不同,静态方法就不同了。下面代码运行结果是输出 super class。 如果都将static去掉,输出就是sub class。 如果只去掉某一个static,会报错,说明静态方法原创 2018-01-17 10:45:02 · 1227 阅读 · 0 评论 -
TCP/IP协议三次握手和四次挥手
一、TCP/IP三次挥手 1、客户端请求连接,发送SYN包(同步序列编号),SYN =j。 2、服务器收到客户端SYN包并确认Ack = j+1,同时向客户端发送SYN包,SYN=k,客户端进入Established状态 3、客户端收到服务器发送的SYN包,发送Ack报文(Ack = k+1),服务器接收到后才进入Established状态这时候有个问题,为什么是三次握手,不是两次握手或...原创 2018-02-01 00:00:33 · 202 阅读 · 0 评论 -
Java垃圾回收机制
JVM垃圾回收不是必须的,只有在堆空间不足的时候回收。 一、首先,JVM判断对象是否存活,有两种方法 1、引用计数法 对象每被引用一次,加1。如果引用次数为零,判断对象不可再使用。会有循环引用问题 2、可达性分析法 通过一系列GC Roots对象作为起点,从这些起点开始找它的引用,它的引用的引用。如果某个对象到达不了,说明该对象不可用。GC Roots对象可以有: 1、虚拟机栈中引原创 2018-01-31 21:18:53 · 168 阅读 · 0 评论 -
多线程同步
多线程买票,用synchronized和lock两种方法 用了线程池,注意线程池用完要关闭,不然程序结束不了。public class ThreadDemo4 { public static void main(String[] args){ MyRunnable5 mr5 = new MyRunnable5(); ExecutorService ex原创 2018-01-07 13:10:02 · 132 阅读 · 0 评论 -
java创建对象的方式有几种
有4中创建对象的方式 一、通过new语句实例化一个对象 二、通过反射机制创建对象 Class.forName(“类的路径”) 类名.Class 实例.getClass(); 三、通过clone()方法创建一个对象 四、通过反序列化的方式创建对象原创 2017-12-02 23:21:49 · 289 阅读 · 0 评论 -
详解OutputStream和InputStream Reader和Writer InputStreamReader
OutputStream和InputStream 字节输入和输出流,有字节文件流,字节对象流。ObjectOutputStream是对象序列化用的。FileInputStream/FileOutputStream用来读写文件。Reader和Writer 字符流,字节流中包含FileRead,InputStreamReader和BufferedReader。最重要的类是InputStreamR原创 2018-01-19 20:59:58 · 3072 阅读 · 0 评论 -
TreeSet HashSet放入自定义类
如果是本地方法的hashcode,那每个new出来的对象的值都不一样写了TreeSet自定义类排序,重写了HashCode和equals方法,写了自定义比较器Compatator类,但是new出相同内容的对象的时候容器里还是有两个一模一样的对象。查阅网上资料后发现是因为TreeSet 通过compareTo(Object obj)方法是否返回0比较两个对象是否相等。原创 2017-12-17 22:32:05 · 309 阅读 · 0 评论 -
HashMap
HashMap里的键值可以是null HashMap里不管有没有null map.get(null)返回null原创 2018-01-01 10:02:10 · 148 阅读 · 0 评论 -
单例模式 饿汉式和懒汉式
单例模式需要:构造方法私有化提供一个自身的私有静态成员变量提供一个公有的静态工厂方法一、饿汉式 在定义静态变量的时候就实例化单例类。 根据类加载机制,在加载,链接(验证,准备,解析)的阶段,单例类中的静态变量已经被分配了内存,并且设置了变量的初始化的值。这个在运行的时候只要初始化就行了,就比懒汉式节省时间了。 这是我个人的理解,因为我在运行如下实验代码的时候,如果不出现SingleTo原创 2018-01-17 20:05:19 · 209 阅读 · 0 评论 -
触发类初始化的四种情况
需要先触发类初始化(加载-验证-准备自然需要在此之前): 1)1.使用 new 关键字实例化对象 2.读取或设置一个类的静态字段 3.调用一个类的静态方法。 2)使用 java.lang.reflect 包的方法对类进行反射调用时,若类没有进行初始化,则需要触发其初始化 3)当初始化一个类时,若发现其父类还没有进行初始化,则要先触发其父类的初始化。 4)当虚拟机启动时,用户需要制定一个要执行原创 2018-01-17 20:06:16 · 731 阅读 · 0 评论 -
计算机网络常见知识
首先 网络主要分成四层,从高到低分别是 【TCP/IP分层模型】 分层的好处:解耦,在每个层次内部能够自由改动。 应用层,传输层,网络层,数据链路层。 应用层:http,ftp协议 传输层:TCP和UDP协议 传输层:IP协议 数据链路层:为传输的数据加入一个以太网协议头,进行CRC编码。 OSI参考模型注重“通信协议必要的功能是什么”,TCP/IP更强调“在计算机上实现协议应...原创 2018-03-13 21:56:33 · 384 阅读 · 0 评论 -
JAVA intern()
http://blog.csdn.net/seu_calvin/article/details/52291082 这个博客intern方法介绍的很好 总结起来就是如下: 前提了解:引号声明的字符串都是会直接在字符串常量池中生成的,而 new 出来的 String 对象是放在堆空间中的。 JAVA1.6之前 调用intern方法会去常量池中检查是否有该字符串,如果有直接返回指向常量池中该字符...原创 2018-03-17 15:59:57 · 146 阅读 · 0 评论 -
Mac环境Java通过jni调用C++ OpenCv代码
【Jni】 Java Native Interfac,可以实现和C++的通信。 【目标】 C++ OpenCv执行图像处理速度较快,程序是java,可以调用C++写的OpenCv代码。 【安装JDK和OpenCV】现在检查Mac下JDK和OpenCV。 Mac终端输入:java -versionjava version "1.8.0_161"Java(TM) SE Runtim...原创 2018-02-13 14:43:59 · 686 阅读 · 0 评论 -
SQL增、查、改语句
SQL语句INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,….) SELECT */列名称 FROM 表名称 UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值 DELETE FROM 表名称 WHERE 列名称 = 值SELECT {COLA,COLB,*} FROM {TABLE} WHERE {CON原创 2017-12-02 22:57:04 · 465 阅读 · 0 评论 -
SpringIoC实现原理 附代码
IoC称作控制反转。控制反转是一种思想,实现它的方式叫依赖注入(DI),其实是一回事。 它的思想是实现对象间的解耦,一般我们在实现业务的时候必然会使得两个对象相互联系共同完成业务。比如要再对象A中实例化对象B,这样的代码就需要再对象A中初始化,可能在A的构造函数中就要对成员对象B初始化,耦合度较高。 现在spring中把所有对象的控制权从各个对象剥夺出来,照理对象A要用到对象B,对象A对B有控原创 2018-01-24 13:13:03 · 540 阅读 · 0 评论 -
原型模式 深拷贝
发送邮件,邮件中有附件,深拷贝实现了附件也拷贝了一份。在附件中再加入了一个对象,序列化后也复制了,实验证明深拷贝会将引用对象的引用对象也都复制public class Test { public static void main(String[] args) { Email email = new Email(new Attachment()); Email原创 2018-01-18 14:30:55 · 368 阅读 · 0 评论 -
对象序列化
序列化可以实现深拷贝 1. 深拷贝 复制对象将所有原对象引用的对象全部复制一份。注意是所有的引用对象,包括引用对象的引用对象都会复制一份的。这个在代码的实验中证明了。详见另一篇博客 设计模式——原型模式——深拷贝 在Attachment中加入了Cat对象,cat对象序列化后== 结果是false 将对象写入文件流或者字符流中代码public class Test {原创 2018-01-18 14:25:07 · 179 阅读 · 0 评论 -
原型模式 浅拷贝
当需要创建大量相同或者相似的对象时,可以通过对一个已有对象的复制获取更多对象。浅拷贝 被复制对象的所有普通成员变量具有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。 在下面的示例代码中,email实例对象中有指向附件Attachment的实例对象,在浅拷贝中,这个附件对象是不会复制的。代码中会有== 和 equals的验证。2.浅拷贝步骤 在java中,可以通过覆盖Ob原创 2018-01-18 12:47:39 · 213 阅读 · 0 评论 -
java对象比较
hashCode()和equals 基本数据类型 直接用 == 比较是否相等 Object类中 == 比较的是指向的内存地址是否相同 自定义类中的equals方法如果没有重写,相当于== String类中重写了equals方法,使得equals方法比较的是内容是否相等。 在hashset,hashmap,treeset,treemap中需要hashcode和equals比较 如果hash原创 2017-12-17 20:57:26 · 1793 阅读 · 0 评论