java
文章平均质量分 52
人山人海肉最可爱
目前菜鸟一枚,希望大佬们多多指教,渴望有一天可以和大佬们肩并肩。
展开
-
补充-Java内存模型
想一想为什么要有内存模型呢?众所周知,计算机在执行程序的时候,每一条指令都是在CPU中执行的,在指令执行的时候又需要用到数据,但计算机上的数据是存在计算机的物理内存(主存)上的,所以每次指令在CPU中执行的时候都需要先在主存上把数据取出来,刚开始的时候还可以,但是随着CPU的高速发展,CPU的执行速度越来越快,但内存的技术并没有太大提升,所以从内存中读取和写入数据的过程需要很漫长的时间,但是CP...原创 2019-05-06 19:39:22 · 330 阅读 · 0 评论 -
TreeMap
TreeMap是一个可以排序的Map子类,它是按照key的内容排序的。import java.util.HashMap;import java.util.Map;import java.util.TreeMap;public class Test { public static void main(String[] args) { Map<Integer, ...原创 2019-02-17 17:30:56 · 192 阅读 · 1 评论 -
ConcurrentHashMap
为什么已经有了Hashtable还需要ConcurrentHashMap呢?因为Hashtable效率比较低,它的实现是在方法上加synchronized。也就是说导致了所有并发操作都要竞争同一把锁,一个线程在进行同步操作时,其他线程只能等待,大大降低了并发操作的效率。ConcurrentHashMap的内部结构:它是将桶的内部进行了分段处理。每个桶里还是以链表的形式存储数据。Concu...原创 2019-02-17 15:36:32 · 177 阅读 · 0 评论 -
Hashtable与HashMap的区别
原创 2019-02-17 12:59:31 · 163 阅读 · 0 评论 -
Map接口
Map接口有四个常用子类:Hashtable、HashMap、TreeMap、ConcurrentHashMap。Map接口的定义:public interface Map&amp;lt;K, V&amp;gt;Map接口的常用方法:public V put(K key, V value)-----向Map中追加数据public V get(Object key)--------根据key值取得对应...原创 2019-02-17 12:51:26 · 175 阅读 · 0 评论 -
如何利用TreeSet实现数据的排序(Comparable、Comparator )
排序实际上针对的是对对象数组进行的排序处理,如果要对对象数组进行排序,对象所在的类一定要实现Comparable接口(可比较接口)并且覆写compareTo()方法,但如果这个类不是我们自己定义的,那就没办法比较了,所以这个方法很不灵活。例:Person.javapublic class Person implements Comparable<Person>{ priv...原创 2019-02-17 10:55:46 · 1041 阅读 · 0 评论 -
线程池
线程池在juc包下。线程池是用来实现多线程的,那已经有Runnable和Callable实现多线程了,为什么还要线程池呢?因为使用线程池有以下三个优点:降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁带来的消耗(当一个线程跑完一个任务之后,不会被销毁,会再次给这个线程分配一个新任务)提高响应速度:当任务到达时,任务可以不需要等待线程创建就能立即执行(因为线程池中一直有空闲的线程在...原创 2019-02-16 19:22:38 · 202 阅读 · 0 评论 -
Java内存模型
1. 主内存与工作内存主内存:指的就是操作系统内存工作内存:指的是创建线程所使用的内存线程对变量的读写操作不是直接对主内存操作的,而是在工作内存操作的。线程、主内存、工作内存三者的交互关系就和下图一样:2. 内存间交互操作Java内存模型中定义了8种操作来完成一个变量从主存中拷贝到工作内存、从工作内存同步回主存的实现细节。JVM实现时必须保证以下这8种操作的每一种操作都是原子的、不可...原创 2019-02-15 16:17:03 · 196 阅读 · 0 评论 -
JVM的垃圾回收算法
1. 标记-清除算法标记-清除算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象。但该算法也有不足之处:效率问题:标记和清除这两个过程的效率都不高空间问题:标记清除后会产生大量不连续的内存碎片,空间碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾回收。2. 复制算法(新生代回收算...原创 2019-02-14 17:47:09 · 239 阅读 · 0 评论 -
抽象类与接口的区别
原创 2019-01-16 14:43:31 · 100 阅读 · 0 评论 -
什么是进程?什么是线程
进程进程指的是一个程序的生命周期,也就是一段程序从开始执行到结束,这就是该程序的进程。线程一般一个程序中会有多个任务,一个任务就叫做一个线程。创建、撤销一个线程比创建、撤销一个进程的开销要少得多...原创 2019-02-23 16:03:01 · 1585 阅读 · 0 评论 -
什么是JVM
首先我们大家都知道java是跨平台的,那它为什么会跨平台呢?我们可以先来看看这幅图:Java源码编译成字节码,字节码才会运行,字节码运行时操作系统是没办法直接运行的,我们需要java运行环境(JRE),JRE(包含java运行时需要的一系列类库、JVM(虚拟机))将java的字节码解释成机器能识别的指令。JVM其实就是一个虚拟机,执行java编译好的字节码文件。区分JDK、JRE、JVM...原创 2019-02-13 10:43:32 · 401 阅读 · 0 评论 -
ReentrantLock----独占式重入锁的深入理解
ReentrantLock是重入锁重入:表示能够对共享资源重复加锁,即当前线程再次获取锁时不会被阻塞。1. 那重入锁是如何实现的呢?如果该同步状态不为0,表示此时同步状态已被线程获取。再判断持有同步状态的线程是否是当前线程,如果是,同步状态再次+1并返回true,表示持有线程重入同步块。释放过程:当且仅当同步状态减为0并且持有线程为当前线程时表示锁被正确释放。否则调用setState(...原创 2019-02-28 12:22:46 · 219 阅读 · 0 评论 -
小项目----追踪器
功能可以按文件名搜索可以按文件类型搜索实现文件监听意义解决Windows下命令行搜索文件不方便问题提高全局搜索时的速度跨平台使用锻炼编码能力涉及的技术文件操作数据库多线程JDBC问题用单线程遍历电脑文件还是用多线程遍历?解决:如果用多线程遍历会复杂很多,会出现重复统计,就要考虑避免防止重复提交了。但如果是多个盘,可以分盘遍历,一个盘创建一个线程,各自遍历...原创 2019-04-13 21:56:56 · 565 阅读 · 1 评论 -
小项目---游戏公告
功能当某一玩家登陆进游戏时,服务器会对在线所有玩家发一条公告,告诉所有在线玩家该玩家上线了;当某一玩家退出游戏时,服务器也会发公告告诉所有在线玩家该玩家下线了;每一个玩家可以发公告,也可以和某一玩家进行私聊。涉及的技术Scoket编程、多线程实现的思路创建两个工程,客户端和服务器端服务器端的实现:准备ServerSocket对象,接收客户端连接,得到Socket对象,接收客户端发...原创 2019-04-01 20:46:18 · 445 阅读 · 0 评论 -
反射
在说反射之前,我们先来思考一个具有争议的问题:Java到底是不是纯面向对象语言?那如何判断呢?只要Java中的元素能够被类所描述、能够通过实例化获取到对象,就说这是面向对象的。因为Java中的8大基本数据类型是不能实例化对象的,比如:int a = 8;我们是不能通过a调用一个方法的,所以会有人说Java不是纯面向对象的语言。但其实Java就是一个纯面向对象的语言,因为基本类型它又有包装类...原创 2019-03-05 09:53:45 · 194 阅读 · 0 评论 -
JVM如何判断对象已“死”(可达性分析算法)
Java堆上存放着几乎所有对象实例,垃圾回收器在对堆进行垃圾回收前需要判断哪些对象还存活?哪些对象已经“死去”(不再被引用)?除了可达性分析算法外还有引用计数法。引用计数法例:A对象引用了B对象,给B对象的计数器+1C对象也引用了B对象,给B对象的计数器再+1当引用失效时,计数器-1任何时刻计数器为0的对象就是不能再被使用的,即对象已“死”,才可以被回收。这就是引用计数法虽然引用...原创 2019-02-14 14:38:31 · 1029 阅读 · 0 评论 -
lock体系
之前本来在写完多线程之后就写lock体系的,可以作以对比,但之后又写了其他知识的博客,一直拖到今天才写lock相关的知识,大家在看lock锁的时候,可以对比着看内建锁,对比对比lock锁和内建锁的优缺点。这是我那篇关于内建锁的博客链接:https://blog.csdn.net/huaijiu123/article/details/85242821lock在Java的util包下lock体系...原创 2019-02-25 13:41:40 · 364 阅读 · 0 评论 -
Condition接口的await、signal机制
1. Condition中的await、signal与内建锁wait、notify的区别Object类提供的wait与notify方法是与对象监视器monitor配合完成线程的等待与通知机制,属于JVM底层实现。而Cobdition与Lock配合完成的等待通知机制属于java语言级别,具有更高的控制与扩展性。Condition独有特性:I.支持不响应中断,而Object不支持II.支...原创 2019-02-28 17:22:53 · 560 阅读 · 0 评论 -
HashMap源码剖析
HashMap是Map集合中的一个子类。那我们来想想它的底层到底是怎样实现的,比如:它存储数据是以链表存储还是数组存储?它的容量是多大?如果是数组存储,会不会扩容?什么时候扩容?这些问题都需要我们看源码,通过分析源码来得出结论。实际上HashMap可以看作是数组和链表结合组成的复合结构。说它是一个复合结构,那它到底是怎样复合的呢?我们可以先来看一幅图:看到这幅图,我决定大家心中都理解...原创 2019-02-13 16:53:21 · 109 阅读 · 0 评论 -
Java内存区域与内存溢出异常
1. 运行时数据区域线程私有区域:程序计数器、Java虚拟机栈、本地方法栈线程共享区域:Java堆、方法区、运行时常量池1.1 程序计数器( 线程私有)程序计数器指的是当前线程执行的代码的位置。程序计数器是为了方便指令跳转,记录下当前指令的位置,等执行完跳转指令后可以根据计数器里的地址回到跳转前的位置,继续往下执行。如果当前线程正在执行的是一个java方法,这个java方法正在执行一个...原创 2019-02-13 16:25:41 · 141 阅读 · 0 评论 -
ReentrantReadWriteLock----可重入读写锁
读写锁:允许同一时刻被多个读线程访问,但是在写线程访问时,所有的读线程与其他的写线程均会阻塞。写线程能够获取到锁的前提条件:没有任何读、写线程拿到锁。1. 写锁-WriteLock-独占锁1.1 写锁的获取 - 模板方法tryAcquire()源码:protected final boolean tryAcquire(int acquires) { /* ...原创 2019-02-28 13:27:29 · 273 阅读 · 0 评论 -
Java中的代理模式
代理模式的特点:两个子类共同实现一个接口,其中一个子类负责真实业务实现,另一个子类完成辅助真实业务主题的操作。代理模式其实在我们生活中特别常见,特别是近些年来,大家都喜欢用国外的东西,但又特别贵,特别是女生的化妆品,它贵主要是因为有税和运费,所以大家都喜欢去找代购买化妆品,可以剩下好多钱。在这个模式中,真实的主题类是你自己,因为掏钱和使用的是你,而代购就是代理类,它只是负责辅助你完成买化妆品这...原创 2019-01-16 14:30:12 · 3763 阅读 · 2 评论 -
Java中的工厂设计模式
引出工厂模式package www.java.test;interface Computer{ void printComputer();}class MacbookPro implements Computer{ @Override public void printComputer() { System.out.println("This i...原创 2019-01-16 11:29:09 · 3638 阅读 · 0 评论 -
Java中的接口
在Java中有一个接口优先原则(在一个操作即可以使用抽象类又可以使用接口的时候,优先考虑使用接口)为什么会有接口优先原则呢?主要是因为抽象类局限于单继承原则,而接口可以实现多继承,子类实现接口使用implements关键字,子类可以同时实现多个父接口。什么是接口呢?接口就是一个抽象方法与全局常量的集合(JDK8之前)接口使用interface关键字定义例:定义一个简单的接口inter...原创 2019-01-16 09:54:57 · 269 阅读 · 0 评论 -
JavaIO
JavaIO在java,io包中。有五个核心类:File、OutputStream、InputStream、Reader、Writer有一个接口:Serializable1.File文件操作类File类是唯一一个与文件本身操作(创建、删除、取得信息)有关,与文件内容无关的程序类。1.1 File类(可以是文件也可以是文件夹)的使用File类有两种实例化方式:public File(S...原创 2018-12-09 09:37:29 · 175 阅读 · 2 评论 -
JAVA数组----引用数据类型
1.数组初始化1.1 动态初始化(声明并开辟空间)数组类型[] 数组名称 = new 数组类型[长度]例:开辟一个长度为5的字符型数组:char[] arr = new char[5];数组是通过下标索引来取得元素,下标默认从0开始,数组下标超过数组长度就会发生数组越界异常(属于运行时异常)。数组中每个元素都有默认值,默认值是该数组的类型默认值数组名称.length:取得数组长度...原创 2018-11-27 18:36:19 · 1579 阅读 · 1 评论 -
java中三个特殊的类------String类、Object类、包装类
1.String类1.1 String类的两种实例化方式直接赋值String str = &amp;amp;amp;quot;hello&amp;amp;amp;quot;通过构造方法实例化String类String str = new String(&amp;amp;amp;quot;hello&amp;amp;amp;quot;)1.2 字符串相等比较(内容)public boolean equals(S原创 2018-11-19 16:16:41 · 239 阅读 · 0 评论 -
java中单例模式
1.单例模式定义:一个类只允许产生一个实例化对象。我们先想想类的实例化对象是如何产生的?它是通过类的构造方法产生的。现在只让一个类产生一个实例化对象,我们就要考虑从它的构造方法入手,我们可以把构造函数私有化,这样它就不能在类的外部被调用了。但如果我们还想在类的外部调用类内函数,就必须通过类的实例化对象来调用,但构造函数已经被私有化了,我们就需要在类内部产生一个实例化对象。我们先来看一个简...原创 2018-11-23 16:59:58 · 155 阅读 · 0 评论 -
JAVA数据类型划分
java总共有8大基本数据类型:数据类型的默认值需要结合类来观察,主方法中,变量必须先赋值再使用,不存在默认值例:我们会发现通过创建Test类对象,然后调用a属性,它的默认值是0.如果把a放到主函数中,没有对它进行初始化,输出它,就会报错。...原创 2018-11-05 09:34:21 · 174 阅读 · 0 评论 -
在JAVA中如何将字符串首字母转成大写
分析:在JAVA中String类没有提供将首字母大写的操作,那这就需要我们自己来实现了。但String类有提供将字符串转大写和字符串截取的操作,我们可以结合提供的这两个操作来实现字符串首字母大写。步骤:先将字符串的第一个字符截取出来,截取出来后是一个字符串将截取出来的字符串转大写将这个字符串中除了第一个字符外的其他字符截取出来将第2步的结果和第3步的结果拼接起来具体代码实现:pu...原创 2018-10-27 18:39:52 · 26524 阅读 · 0 评论 -
内部类的定义与使用
基本概念:就是在一个类内部进行其他类结构嵌套操作。内部类的优点内部类与外部类可以方便地访问彼此的私有域(包含私有方法、私有属性)。eg:class Outer{ private String msg = &amp;amp;quot;Hello World&amp;amp;quot;; //内部类 //-------------------------------- class Inner{ ...原创 2018-10-20 21:53:40 · 886 阅读 · 0 评论 -
Java中super关键字
super用于方法用于构造方法当子类调用父类无参构造时,super()可写可不写,表示调用父类无参构造当子类调用父类有参构造时,super(参数列表)必须要写,要告诉编译器当前调用的是哪个有参构造。子类构造方法中调用父类构造必须是第一行语句this与super不能同时调用用于普通方法------super.方法名(参数)用于在子类中明确调用父类被覆写的方法...原创 2018-10-19 10:51:01 · 715 阅读 · 0 评论 -
Java中final关键字
在Java中final被称为终结器,可以用来修饰类(包括String类以及8大基本数据类型的包装类,Integer)。final修饰类当一个类被final修饰,表示该类不能拥有子类(该类不允许被继承)。一旦一个类被final修饰,该类的所有方法都会默认加上final(成员变量不会加final)。final class A{}; //A类不能有子类final修饰方法当一个方法被fin...原创 2018-10-19 10:41:37 · 153 阅读 · 0 评论 -
ArrayList与Vector的区别
产生版本:Vector是JDK1.0产生的,ArrayList是JDK1.2产生的线程安全:Vector采用在方法上添加synchronized来保证线程安全,性能较低;ArrayList采用异步处理,性能较高,不安全。初始化以及扩容策略:Vector对象产生时就初始化数组大小为10,当数组不管用时,扩容为源数组2倍;ArrayList使用懒加载策略,在第一次添加元素时才初始化数组...原创 2018-12-09 09:52:28 · 146 阅读 · 0 评论 -
Java-----文件拷贝
分析:要想实现数据的拷贝,肯定要通过流的方式来完成,因为我们并不知道是文字数据还是什么类型的数据,所以我们采用字节流在进行拷贝的时候:开辟一个固定大小的字节数组,每次读入字节数组大小的数据,然后把这些数据写入另一个目标文件中,直至将目标文件的数据读取完毕。在while这其实也就是边读边写的过程。例如:将桌面上的一个图片文件进行拷贝,也拷贝到桌面上package www.java.tes...原创 2018-12-07 09:09:02 · 176 阅读 · 2 评论 -
JAVA中多线程
我们可以先来看一幅图,多线程就算围绕这幅图展开的。1. 进程与线程的概念进程:操作系统中一个程序的执行周期。线程:一个线程同时执行多个任务。通常来讲,每一个任务就称为一个线程。进程与线程比较与进程相比,线程更加“轻量级”,创建、撤销一个线程比启动、撤销一个进程开销要小的多。一个进程中的所有线程共享此进程的所有资源。没有进程就没有线程,进程一旦终止,其内的线程也将不复存在。进程是操...原创 2018-12-24 17:10:36 · 2221 阅读 · 0 评论 -
Java----剖析代码块
阿里巴巴笔试题原创 2019-01-15 18:04:41 · 192 阅读 · 0 评论 -
Java-----模板设计模式
模板设计模式是基于抽象类的,它的核心是封装算法我们可以先用代码实现泡茶和冲咖啡的过程:泡茶的步骤:将水煮沸用沸水浸泡茶叶把茶倒进杯子加柠檬冲咖啡的步骤:5. 将水煮沸6. 用沸水冲泡咖啡7. 将咖啡倒进杯子8. 加糖和牛奶代码实现:package www.java.test;class Coffe{ //咖啡的冲泡方法 void prepareRe...原创 2019-01-14 21:42:01 · 213 阅读 · 0 评论 -
Java----抽象类
什么是抽象类?抽象类只是在普通类的基础上扩充了一些抽象方法而已。用abstract来定义。抽象方法:指的是只声明而为实现的方法(没有方法体)。也是用abstract来定义。为什么会存在抽象类呢?那是因为继承不能强制让子类覆写父类的所有方法,而抽象类可以。例:package www.java.test;abstract class Person{ private String...原创 2019-01-14 20:31:05 · 135 阅读 · 0 评论