![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
NeverGiveUpU
这个作者很懒,什么都没留下…
展开
-
Java Socket原理
Socket功能通过IP和端口号将两台主机建立连接,提供通信。Socket原理主机A的应用程序要能和主机B的应用程序通信,必须通过Socket建立连接,而建立Socket连接必须由底层TCP/IP协议来建立TCP连接。建立TCP连接需要底层IP协议来寻找网络中的主机。虽然网络层的IP协议可以帮助我们根据IP地址找到目标主机,但是一台主机可能运行着多个应用程序,如何才能与指定的应用程序通信就要...原创 2019-02-06 08:29:41 · 1161 阅读 · 0 评论 -
Java多线程——守护线程
在Java中有两种线程,一种是用户线程,另一种是守护线程。守护线程是一种特殊的线程,它的线程有“陪伴”的含义,当进程中不存在非守护线程了,则守护线程自动销毁。典型的守护线程就是垃圾回收线程,当进程中没有非守护线程了,则垃圾回收线程也就没有存在的必要了,自动销毁。用个比较通俗的比喻来解释一下“守护线程”:任何一个守护线程都是整个JVM中所有非守护线程的“保姆”,只要当前JVM实例中存在任何一个非守...原创 2019-01-17 17:06:27 · 147 阅读 · 0 评论 -
Java多线程——阻塞队列
现在已经了解了形成Java并发程序设计基础的底层构件块。然而,对于实际编程来说,应该尽可能远离底层结构。使用由并发处理的专业人士实现的较高层次的结构要方便的多、安全的多。对于许多线程问题,可以通过使用一个或多个队列以优雅且安全的方式将其形式化。生产者线程向队列插入元素,消费者线程则取出它们。使用队列,可以安全的从一个线程向另一个线程传递数据。例如,考虑银行转账程序,转账线程将转账指令对象插入一个...原创 2019-01-11 15:25:56 · 209 阅读 · 0 评论 -
Java多线程——join() 指定线程插队运行
在Java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join方法后面的代码。简单的说,就是将两个线程合并,用于实现同步功能。具体而言,可以通过线程A的join()方法来等待线程A的结束,或者使用线程A的join(2000)方法来等待线程A的结束,但最多只等待2s。我的理解:threadA.join()相当于threadA插队运行。试想这样的场景:有A、B...原创 2019-01-11 15:21:42 · 651 阅读 · 0 评论 -
Java基础——日期格式化
SimpleDateFormat类年 yyyy月 MM日 dd时 HH分 mm秒 ss毫秒 SS日期格式化显示(Date转换成String)Date date=new Date();//日期格式化显示,首先定义格式SimpleDateFormat sdf1=new SimpleDateFormat("yyyyMMdd");//2019011SimpleDateFor...原创 2019-01-11 14:58:36 · 2642 阅读 · 0 评论 -
Java基础——生成随机数
Math.random()Math.random()方法会产生0到1之间的浮点数。可以使用以下方法产生0到N的正整数:int random = (int)(Math.random()*N);如何利用Math.random()方法产生随机一个小写字符呢?//也就是产生97到122的随机数,然后int转char(ASCII码)char random = (char) ('a' + Mat...原创 2019-01-11 14:28:09 · 622 阅读 · 0 评论 -
Java多线程——局部变量
线程间有时要避免共享变量,使用ThreadLocal辅助类为各个线程提供各自的实例。例如,SimpleDateFormat类不是线程安全的。public static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");如果两个线程都执行以下操作:String dateStamp = dateFo...原创 2019-01-10 23:52:04 · 649 阅读 · 0 评论 -
Java多线程——通过管道进行线程间通信
管道流在Java语言中提供了各种各样的输入/输出流Stream,使我们能够很方便的对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于不同线程间直接传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助于类似临时文件之类的东西。在Java的JDK中提供了4个类来使线程间可以进行通信:1) PipedInputStr...原创 2019-01-10 16:38:23 · 275 阅读 · 0 评论 -
Java多线程——wait(),notify()(等待通知机制)
需要说明的是,多个线程之间通过共同访问同一个变量也可以实现通信,但那种通信机制不是“等待/通知”,两个线程完全是主动式的读取一个共享变量,在花费读取时间的基础上,读到的值是不是想要的,并不能完全确定。所以现在迫切需要一种“等待/通知”机制来满足上面的需求。wait()与nonify()方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前...原创 2019-01-10 16:30:39 · 475 阅读 · 0 评论 -
Java多线程——为什么弃用stop、suspend、resume方法
初始的Java版本定义了一个stop方法用来终止一个线程,以及一个suspend方法用来阻塞一个线程直至另一个线程调用resume。stop和suspend方法有一些共同点:都试图控制一个给定线程的行为。stop、suspend和resume方法已经弃用。stop方法天生就不安全,经验证明suspend方法会经常导致死锁。首先来看看stop方法,该方法终止所有未结束的方法,包括run方法。当...原创 2019-01-18 13:57:59 · 1072 阅读 · 1 评论 -
Java多线程——如何正确的停止线程
大体上有两种方法:标志法,异常法标志法class MyThread implements Runnable{ private volatile Boolean flag = true; public void run(){ while(flag){ //do something } } public v...原创 2019-01-18 15:00:32 · 200 阅读 · 0 评论 -
Java基础——IO类库
纵览Java的I/O操作类在包java.io下,大概有将近80个类,这些类大概可以分成如下四组。基于字节操作的I/O接口:OutputStream和InputStream。基于字符操作的I/O接口:Writer和Reader。基于磁盘操作的I/O接口:File。基于网络操作的I/O接口:Socket。基于字节这里说明两点:一是操作数据的方式是可以组合使用的;二是流最终写到什么地方...原创 2019-02-05 22:29:29 · 538 阅读 · 0 评论 -
Java进阶——hashCode方法原理
原文地址Java的Object类中有一个方法:public native int hashcode();hashcode方法的作用对于包含容器类型的程序设计语言来说,基本上都会涉及到hashCode。在Java中也一样,hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,这样的散列集合包括HashSet、HashMap以及HashTable。为什么这么说呢?考虑一种情况...转载 2019-02-01 23:37:03 · 626 阅读 · 0 评论 -
Java多线程——synchronized
什么是线程安全?“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。而“线程安全”就是已获得的实例变量的值是经过同步处理的,不会出现脏读的现象。非线程变量”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。两个线程同时访问一个没有同步的方法,如果两个线...原创 2019-01-10 00:09:36 · 158 阅读 · 0 评论 -
Java多线程——Callable和Future
Callable类Runnable封装一个异步运行的任务,可以把它想象成为一个没有参数和返回值的异步方法。Callable与Runnable类似,但是有返回值。Callable接口是一个参数化的类型,只有一个方法call。public interface Callable<E>{ E call() throws Exception;}类型参数是返回值的类型。例如,Ca...原创 2019-01-09 21:08:55 · 198 阅读 · 0 评论 -
Java多线程——线程池
Executor类(产生线程池)构建一个新的线程是有一定代价的,因为涉及与操作系统的交互。如果程序中创建了大量的生命期很短的线程,应该使用线程池(thread pool)。一个线程池中包含许多准备运行的空闲线程。将Runnable对象交给线程池,就会有一个线程调用run方法。当run方法退出时,线程不会死亡,而是在池中准备为下一个请求提供服务。另一个使用线程池的理由是减少并发线程的数目。创建大...原创 2019-01-09 20:53:03 · 172 阅读 · 0 评论 -
Java进阶——HashMap的原理
原文地址:https://www.cnblogs.com/chengxiao/p/6059914.html什么是哈希表哈希表的主干就是一个数组。如果要新增或删除一个元素,可以把该元素的关键字,通过某个函数映射到数组中的某个位置,通过数组下标一次定位就可完成操作。这个函数叫哈希函数。然而万事无完美,如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈...转载 2019-01-09 14:37:44 · 141 阅读 · 0 评论 -
Java多线程——概述
什么是线程?线程是指程序在执行过程中,能够执行程序代码的一个执行单元。在Java语言中,线程有4种状态:运行、就绪、挂起和结束。进程是指一段正在执行的程序。而线程有时也被称为轻量级进程,它是程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间。为什么使用线程?在操作系统级别...原创 2019-01-18 15:55:44 · 202 阅读 · 0 评论 -
Java多线程——Thread执行自己的run方法还是Runnable的run方法?
众所周知,Runnable的run方法可以交给Thread执行,如果Thread有自己的方法,那执行谁的run方法?从Thread类可以看到,当传入Runnable对象时,运行的是Runnable的run方法。...原创 2019-01-18 15:19:37 · 2248 阅读 · 0 评论 -
Java多线程——volatile关键字
volatile关键字关键字volatile的主要作用是修饰变量,每次使用强制从内存中取最新值。在Java语言编写的程序中,有时为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量时有可能会直接从缓存(例如寄存器)中来读取这个值,而不会从内存中读取。这样做的一个好处是提高了程序的运行效率,但当遇到多线程编程时,变量的值可能因为别的线程而改变了,而缓存...原创 2019-01-10 15:17:27 · 136 阅读 · 0 评论 -
Java基础——strictfp关键字
关键字strictfp是strict float point的缩写,指的是精确浮点,它是用来确保浮点数运算的准确性。JVM在执行浮点数运算时,如果没有指定strictfp关键字,此时计算结果可能会不精确,而且计算结果在不同平台或厂商的虚拟机上会有不同的结果,导致意想不到的错误。而一旦使用了strictfp来声明一个类、接口或者方法,那么在所声明的范围内,Java编译器以及运行环境会完全依照IE...原创 2018-12-20 10:29:53 · 6796 阅读 · 0 评论 -
Java基础——lambda表达式
为什么要引入lambda表达式lambda表达式是一个可传递的代码块,可以在以后执行一次或多次。到目前为止,在Java中传递一个代码段并不容易,不能直接传递代码段。Java是一种面向对象语言,所以必须构造一个对象,这个对象的类需要有一个方法能包含所需的代码。在其他语言中,可以直接处理代码块。Java设计者很长时间以来一直拒绝增加这个特性,毕竟,Java的强大之处就在于其简单性和一致性。设计者...原创 2018-12-20 10:27:50 · 353 阅读 · 0 评论 -
Java基础——数组
Java中数组是不是类?java中数组不仅有自己的属性(例如length属性),也有一些方法可以被调用(例如clone方法)。从这个角度来讲,数组可以被看作是类(被实例化、被分配空间的类)。不属于原生类(未被实例化的类)。一维数组的初始化int[] a = new int[5];int[] b = {1,2,3,4,5};int[] c = new int[5]{1,2,3,4,5};...原创 2018-12-20 09:34:09 · 141 阅读 · 0 评论 -
Java接口——static关键字
static成员变量虽然Java语言中没有全局的概念,但可以通过static关键字来达到全局的效果。static修饰的变量叫静态变量,静态变量属于类,在内存中只有一个复制(所有对象实例的该变量都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间。局部变量不允许定义为static。static成员方法static方法与static变量类似,属于类。static方...原创 2018-12-20 09:32:31 · 1599 阅读 · 0 评论 -
Java基础——switch
switch(expr),expr只能是一个整型表达式、字符或字符串。从本质上讲,switch对字符串的支持,其实是int类型值的匹配。它的实现原理如下:通过对case后面的String对象调用hashCode()方法,得到一个int类型的hash值,然后用这个hash值来唯一标识这个case。那么当匹配时,首先调用switch后字符串的hashCode()方法,获取一个hash值(int类型)...原创 2018-12-20 09:29:31 · 229 阅读 · 0 评论 -
Java基础——this,super,构造函数
thisthis是正在访问的代码所属的对象,是一个对象!关键字this有两个用途:引用隐式参数。调用该类其他的构造器。supersuper关键字有两个用途:调用超类的方法。调用超类的构造器。构造函数构造函数可以重载,但是不能被继承(也就没有重写)。构造方法只能通过new自动调用,不能手动调用。当开发人员没有提供构造函数时,编译器在把源代码编译成字节码的过程中会提供一...原创 2018-12-20 09:26:10 · 193 阅读 · 1 评论 -
Java基础——格式化输出
printf方法System.out.printf("%8.2f",33.3333);8代表浮点数占8个字符,少的用空格代替。2代表小数点后保留2位。System.out.printf("%,.2f",10000.0/3.0);打印3,333.33,用“,”分隔。可以使用多个标志,例如 %,(.2f 使用分组的分隔符并将负数括在括号内。String.format方法可以使用静...原创 2018-12-20 09:24:01 · 155 阅读 · 0 评论 -
Java基础——泛型
Java泛型是什么?泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也可定义成参数形式(类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型...原创 2018-12-19 23:16:03 · 82 阅读 · 0 评论 -
Java基础——反射
反射机制Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。获取Class对象的3种方法Random r1 = new Random();//这一new,产生一个Random对象,一个Class对象Class rClass1 = r1...原创 2018-12-19 21:30:03 · 94 阅读 · 0 评论 -
Java基础——继承,多态
在覆盖一个方法时,子类方法不能低于超类方法的可见性。特别是超类方法是public,子类方法一定要声明为public。finalfinal类:该类不能被继承。且类的所有方法自动变为final方法(不包括变量)。final方法:该方法不能被覆盖(重写)。final变量:该方法初始化之后不允许改变值了。向上转型和向下转型记住一点:无论是向上还是向下转型,对象的类型在内存中是不会...原创 2018-12-19 21:13:31 · 141 阅读 · 0 评论 -
Java基础——字符串
字符串创建与存储机制字符串的声明与初始化有两种情况。第一种:String s1 = new String(“abc”)String s2 = new String(“abc”)。存在两个引用对象s1,s2,两个内容相同的字符串对象“abc”,它们在内存中的地址是不同的,只要用到new总会生成新的对象。第二种:String s1 = “abc”String s2 = “abc”在J...原创 2018-12-20 09:35:58 · 68 阅读 · 0 评论 -
Java基础——作用域
Java语言中,变量的类型主要有3种:成员变量、静态变量、局部变量。成员变量的声明周期与类的实例化对象相同。只要一个类被加载,JVM就会给类的静态变量分配存储空间。...原创 2018-12-20 09:37:50 · 76 阅读 · 0 评论 -
Java基础——深复制,浅复制
引用对象Person a = new Person();Person b = a;这里的b是对象的引用,相当于C++中的指针。b和a是同一个对象,指向内存中的同一段。对b修改就相当于对a修改。那么怎么可以对b修改而不影响a呢?答案是使用clone方法。clone方法Java中的所有类默认继承自Object类,而Object类中提供了一个clone()方法。这个方法的作用是返回一个O...原创 2018-12-20 10:11:42 · 102 阅读 · 0 评论 -
Java基础——内部类
内部类在Java语言中,可以把一个类定义到另外一个类的内部,在类里面的类叫做内部类,外面的类叫外部类。这种情况下,内部类可以看作外部类的一个成员。内部类分为一下4种:静态内部类,成员内部类,局部内部类,匿名内部类。class outerClass{ static class innerClass1{} //静态内部类 class innerClass2{} //成员内部...原创 2018-12-20 10:08:45 · 68 阅读 · 0 评论 -
Java基础——枚举
理解枚举类型枚举类型是Java 5中新增特性的一部分,它是一种特殊的数据结构,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束。枚举的定义package t6;// 定义枚举类型enum Day{ MONDAY, TUESDAY, WEDNEDAT, THURSDAY, FRIDAY, SATURDAY, SUNDAY}public cla...原创 2018-12-20 10:00:59 · 138 阅读 · 0 评论 -
JVM——栈和堆
栈:存放基本数据类型和对象的引用变量。堆:存放对象。堆主要是用来存放对象的,栈主要是用来执行程序的。相较于堆,栈的存取速度更快,但栈的大小和生存期必须是确定的,因此缺乏一定的灵活性。而堆却可以在运行时动态的分配内存,生存期不用提前告诉编译器,这也导致了其存取速度的缓慢。堆和栈的存取如下例所示:class Rectangle{ private int width; priva...原创 2018-12-20 09:56:06 · 72 阅读 · 0 评论 -
Java基础——值传递,引用传递
值传递8种基础类型是值传递。传递的是副本,方法里的参数被修改不影响原数据。引用传递类,接口,数组是引用传递。传递的是对象所在的内存地址,将内存地址拷贝一份,然后作为值传递给参数。引用对象的实际内容可以被改变,但是引用对象的地址不会改变(因为内存地址是值传递,形参改变了不影响实参)。引用传递中的不可变类public class Test{ public static voi...原创 2018-12-20 09:53:46 · 172 阅读 · 0 评论 -
Java基础——Java类的关系
继承extends,不必多说。实现implements,不必多说。依赖简单的理解,就是一个类A中的方法使用了另一个类B。这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。比如说,我用笔写字,首先需要一个类来代表我自己,然后需要一个类来代表一支笔,最后,“我”要调用“笔”里的方法来写字。public class Pen{ public void wri...原创 2018-12-20 09:49:58 · 111 阅读 · 0 评论 -
Java基础——native方法
什么是native方法(本地方法)native方法就是java调用非java代码的接口。native方法是这样一个java方法:该方法的实现由非java语言实现,比如C。定义一个native方法,不提供方法体(类似于抽象方法)。因为其方法体是由非java语言在外面实现的。例如Object类:package java.lang; public class Object { ........原创 2018-12-20 09:41:38 · 1477 阅读 · 0 评论 -
Java基础——序列化
什么是序列化?在分布式环境下,当进行远程通信时,无论是何种类型的数据,都会以二进制序列的形式在网络上传送。序列化时一种将对象以一连串的字节描述的过程,用于解决在对对象流进行读写操作时所引发的问题。序列化可以将对象的状态写在流里进行网络传输,或者保存到文件、数据库等系统里,并在需要的时候把该流读取出来重新构造一个相同的对象。如何实现序列化?所有要实现序列化的类都必须实现Serializabl...原创 2018-12-20 09:39:27 · 71 阅读 · 0 评论