java
绿风天空
这个作者很懒,什么都没留下…
展开
-
Java 异步回调
回调函数是一个函数对象,可以在异步方法执行完毕后被调用,以便处理异步方法的执行结果。在上面的代码中,定义了一个`sendHttpRequest()`方法,该方法用于异步执行网络请求,并将`RequestCallback`对象作为参数传递给异步方法。在使用异步方法时,可以将`RequestCallback`对象作为参数传递给异步方法,以便在异步方法执行完毕后调用相应的回调方法。使用回调接口可以方便地处理异步方法的执行结果,并且可以将异步方法的执行和结果处理分离开来,使代码更加清晰和易于维护。原创 2023-07-16 22:14:59 · 871 阅读 · 0 评论 -
38/365 java 通过反射获取泛型信息 反射操作注解
1.通过反射获取泛型信息。2.反射操作注解。 getAnnotation(),getAnnotations()原创 2023-02-02 15:48:02 · 119 阅读 · 0 评论 -
37/365 java Class对象
按道理是这个结果没错,但我换成toString()方法后,直接new对象的时间花费最长,反而是反射能更快。调用同一个方法的速度:new 对象 > 反射创建对象并关闭访问检查 > 反射创建对象。得到该类的所有属性,方法(包括private)操作该类的所有属性,方法(包括private)原创 2023-02-02 14:05:33 · 60 阅读 · 0 评论 -
36/365 java 类的加载 链接 初始化 ClassLoader
当一个类加载器收到一个类加载请求时,会将请求先委托给父类加载器去完成,若父类加载器无法完成,才会由这个加载器来加载该类。java.util.ArrayList),会加载Java库中 的类,而非自定义的类。所以如果出现自定义的类与Java库中类重名时(比如。何时会发送类的初始化?时,不会发生类的初始化。时,会发生类的初始化。原创 2023-01-31 13:57:03 · 305 阅读 · 0 评论 -
35/365 java 反射 Reflection Class类
方法一:通过包名+类名获取Class对象,会抛出ClassNotFoundException异常。方法三:通过类的class属性获取Class对象。,并直接操作类所有的属性和方法(包括private修饰的属性和方法)。方法五:通过基本内置类型的包装类型的type属性获取Class对象。获得了类似动态语言的特性,具有了一定的动态性,使得代码更加灵活。方法四:通过子类的Class对象获取父类的Class对象。4.获取Class类型的对象的五种方法。方法二:通过类的对象获取Class对象。原创 2023-01-30 11:41:05 · 240 阅读 · 0 评论 -
34/365 java 注解 Annotation
Retention:表明注解的有效范围(在源码/生成class/运行时有效)格式: @name 或者 @name(parameter="value")@Document:表示该注解会包含在javadoc文档中。@Target:表明注解可以用在哪些地方(方法,类……范围大小:Runtime>Class>Source。@Inherited:表示子类可以继承父类的该注解。用于解释注解的注解,对一般的注解提供提供说明。定义在java.lang这个包中。原创 2023-01-29 14:23:38 · 143 阅读 · 0 评论 -
33/365 java URL下载网络资源
Uniform Resource Locator:统一资源定位器。格式:网络协议 // IP地址 :端口号 / 项目名 /资源。2.用URL下载网络资源。原创 2023-01-29 11:14:45 · 102 阅读 · 0 评论 -
32/365 java UDP通信
Socket是两台机器之间通信的端点,基于TCP、UDP等协议做了一层封装,是一套系统所提供的的用于进行网络通信的编程接口。完成了发送端和接收端的代码并不够,还需要用多线程实现每个用户都可以发送和接收。不同于TCP的客户端-服务器端通信,UDP只有接收端和发送端,二者地位相同。UDP通信无需建立连接,根据地址直接发送包,如果对方没有收到,也不会报错。最后不同的用户分别调用这两个线程。3.UDP用命令行聊天。原创 2023-01-29 10:33:54 · 134 阅读 · 0 评论 -
31/365 java TCP对话 TCP上传文件
【代码】31/365 java TCP对话 TCP上传文件。原创 2023-01-27 11:08:50 · 39 阅读 · 0 评论 -
30/365 java 端口号 InetSocketAddress
服务端有必要确定监听端口号,但是接受服务的客户端没必要确定端口号。应用程序不用自己设置端口号,而全权交给操作系統进行分配。操作系统可以为客户端每个应用程序分配互不冲突的端口号。也可以是一对(主机名+端口号码),在这种情况下,将尝试解析主机名。TCP的端口号可以与UDP相同,但在单个协议下,端口号不能冲突。时序分配法(动态分配法): 49152 -- 65535。标准的既定端口(静态分类):0 -- 1023。程序注册端口: 1024 -- 49151。范围:0 -- 65535。原创 2023-01-26 10:32:42 · 1011 阅读 · 0 评论 -
29/365 java 网络通信 IP InetAddress
IPv6地址使用以冒号分隔的十六进制数字。它分为八个16位块,构成一个128位地址方案。根据IP地址中的网络号和主机号,可以将IPv4地址分为:A,B,C,D,E这5类。IP地址 定位主机, 端口号定位到具体的应用程序。4.java中的IP类: InetAddress。没有构造函数,需要通过静态方法来get对象。如何在主机之间通信(传输数据)?127.0.0.1:表示本机地址。IPv6地址:128位。如何定位到一台主机?原创 2023-01-25 13:59:26 · 659 阅读 · 1 评论 -
28/365 java 线程池
所以可以使用线程池,提取创建好多个线程,使用时直接获取,使用完毕后放回线程池中,避免了大量的创建和销毁操作。创建和销毁大量的线程,开销很大。原创 2023-01-25 11:19:30 · 56 阅读 · 0 评论 -
27/365 java 生产者-消费者
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。使当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法。当生产者向缓冲区成功放入产品后,应notifyAll()来通知正在等待的消费者。当消费者向缓冲区成功取走产品后,应notifyAll()来通知正在等待的生产者。当缓冲区已满时,生产者应当wait()原创 2023-01-25 10:30:12 · 42 阅读 · 0 评论 -
26/365 java lock
锁提供对共享资源的独占访问,同一时刻,只能用一个线程获得锁。原创 2023-01-24 10:31:41 · 50 阅读 · 0 评论 -
25/365 java 守护线程 线程同步 synchronized
线程同步是一种等待机制,多个线程进入该对象的等待池形成队列,等待前一个线程使用完毕,下一个线程再使用。锁机制:当一个线程获得锁,独占资源,其他线程必须等待,直到该线程使用完毕,释放锁。当synchronized修饰方法时,同步监视器默认为该方法的对象,也就是this。当多个线程操作同一个对象,并且有线程想要修改该对象时,就会出现线程同步的问题。Obj为同步监视器,锁定代码块,同一时刻下只有一个线程访问该代码块。守护线程举例:垃圾回收线程,监控内存线程。使用线程和锁来保证线程同步的安全性。原创 2023-01-23 10:40:13 · 1312 阅读 · 0 评论 -
24/365 java 观测线程状态 线程优先级
在Oracle为Linux提供的Java虚拟机中,会完全忽略线程优先级————所有线程都具有相同的优先级。“当虚拟机依赖于宿主机平台的线程实现时,Java线程的优先级会映射到宿主平台的优先级,平台的线程优先级别可能比Java的10个级别多,也可能更少。每当线程调度器有机会选择新线程时,它首先选择具有较高优先级的线程。但是,线程的优先级高度依赖于OS。“线程优先级不能作为程序正确性的依赖,因为操作系统可以完全不用理会JAVA线程对于优先级的设定”默认情况下,一个线程会继承构造它的那个线程的优先级。原创 2023-01-22 11:42:04 · 724 阅读 · 0 评论 -
23/365 java 线程状态
当前的线程从运行状态转为就绪状态,CPU重新进行调度,但不一定礼让成功,因为CPU有可能选择继续运行该线程。join() 该线程变为运行状态,且该线程完全执行完,其他线程才能执行。不建议使用stop(),destory()等JDK不推荐使用的方法。以下代码为用sleep()每隔5s打印一次系统时间。InterruptedException异常。sleep(int n ) 参数的单位为ms。sleep()完成后,线程进入就绪状态。调用sleep()要catch。sleep()不会释放锁。原创 2023-01-21 20:22:57 · 62 阅读 · 0 评论 -
22/365 java lambda表达式
当接口为函数式接口(接口内只有一个方法)时,可以用lamda表达式来创建该接口的对象。直接new 接口并且实现抽象方法,因为这个类是没有名字的,所以叫匿名内部类。可以省略参数类型 (当有多个参数时,是否省略参数类型,需每个参数一致)该类是一个普通类,与其它类不存在嵌套关系。该类在外部类的内部,且用static修饰。(参数)-> { 重写的方法的内容 }当方法内代码只有一行,可以省略{}该类在另一个类的方法内部。1.lambda表达式。1)创建外部类实现接口。5)lamda表达式。原创 2023-01-21 16:08:57 · 1887 阅读 · 0 评论 -
21/365 java 多线程(三) Callable 静态代理
当一个类实现了Runnable接口,创建线程时,并不是直接用该类调用start(),而是创建Thread类(用该类对象作为参数),调用start()方法。代理角色:代理对象内部包含对真实对象的引用,可以操作真实对象,有和真实对象相同的接口,所以可以替代真实对象。可以附加其他操作,对真实对象进行封装。这就是静态代理,该类为真实角色,Thread类为代理角色,Runnable接口为抽象角色。implements Callable抽象角色:真实对象和代理对象的共同接口。真实角色:真正要引用的对象。原创 2023-01-21 15:12:34 · 67 阅读 · 0 评论 -
20/365 java 多线程(二) 实现Runnable接口
线程并发可能会导致资源分配出问题,比如两个线程都取了同一个资源,并且都认为只有自己获得了该资源。从中领会到线程是独立存在的,由CPU调度交替运行,但都有属于线程的局部变量,工作环境。创建Thread类(用该类对象作为参数),调用start()方法。优点:避免单继承局限性,同一个对象可以被多个线程使用。创建一个类implements Runnable。1.实现Runnable接口来创建线程。2.用多线程完成龟兔赛跑代码。多个线程同时去取糖果。原创 2023-01-19 11:38:47 · 104 阅读 · 0 评论 -
19/365 java 多线程
在只有一个CPU时,是通过快速切换不同的线程,来模拟多核。如下图所示,调用该类的run(),就是正常的执行流程,调用start()便会多线程执行。实际上,在具体的一刻,只能执行一个线程。对同一个程序,执行两次,那就是两个进程。多线程:真正的多线程是多个CPU同时执行多个线程(多核)线程是CPU调度和执行的基本单位。进程是系统资源分配的基本单位。线程:一个进程中包含多个(>=1)线程。程序:指令集和数据的集合。进程:对程序的一次执行。4.继承Thread类来创建线程。可以开出确实是交替执行了两个线程。原创 2023-01-18 16:13:24 · 398 阅读 · 0 评论 -
18/365 java 异常
Error一般由JVM生成并抛出,是灾难性的错误,程序不会去处理,而是会种植线程。java把异常当作对象处理,定义了java.lang.Throwable。Exception一般由程序逻辑错误导致,可以被程序捕获和处理。在该类中异常分为Error 和 Exception两大类。捕获了异常之后,程序不会报错,而是会继续向下执行。定义个新的异常类:只需继承Exception类。原创 2023-01-17 10:29:48 · 49 阅读 · 0 评论 -
17/365 java 内部类
静态内部类用static修饰,无法访问外部类普通属性和方法,因为它们的隶属于对象的,而静态内部类早于对象存在。静态内部类可以访问外部类的static属性和方法。内部类可以直接访问外部类的所有属性和方法(包括private),也可以修改属性的值。5)一个文件中可以有多个类,但只能有一个内部类。1)成员内部类:类定义在另一个类(外部类)内。实例没有名字,没有保存到变量中。原创 2023-01-16 10:35:07 · 46 阅读 · 0 评论 -
16/365 java 抽象类 接口
抽象类虽然不能创建实例对象,但是有构造方法,因为创建子类的时候,需要调用父类的构造方法。缺点:类只能单继承,不能多继承,所以一个类最多只能继承一个抽象类,不如接口方便。抽象类没有实例对象(不能new), 子类继承抽象类后,才可以创建实例对象。abstract关键字,修饰类和方法,表示对某一类的类的进一步抽象。接口是规范,定义了一组规则,没有具体的实现,做到了约束和实现分离。抽象方法没有方法体,也就是没有被实现,而是留给派生类去实现。子类必须重写抽象类的所有抽象方法,除非子类也是抽象类。原创 2023-01-15 11:05:36 · 302 阅读 · 0 评论 -
15/365 java static final
当final修饰的引用类型的变量,则该变量的值不能改变(也就是该变量不能指向别的对象,存放的地址不能改),但是指向的对象的内容可以被修改。类内属性或方法用static修饰,表示该属性或方法属于类,不依赖于实例对象,所以不需要用对象调用,而是直接用类名调用。当fina修饰基本类型的变量,则变量一旦被赋值,就不能修改,因为final修饰的变量是自定义常量。final修饰的成员变量必须在所在的类的对象创建之前被初始化,且一旦初始化就不能被修改。如上图的代码,当new一个新对象a时,执行顺序为2-->1-->3,原创 2023-01-14 19:19:37 · 161 阅读 · 1 评论 -
14/365 java 多态 instanceof
a实际是Rabbit,所以是属于Rabbit类的,也是Animal类和Object类的派生类。基本类型:看位数: 64,32,16,8,4 高位数转低位数需要强制类型转换,低转高不需要。该对象是否属于右边的类,或者属于右边的子类 返回boolean。当左边的对象类型与右边的类没有任何继承关系时,会在编译时报错。引用类型:父类转子类需要强制类型转换,子类转父类不需要。static方法:属于类,不属于实例对象,无法重写。看的是对象实际是什么类型,而非看对象的引用类型。private:无法被子类继承。原创 2023-01-14 10:26:38 · 599 阅读 · 0 评论 -
13/365 java 封装 继承
若子类的构造方法中想调用另一个参数不同的构造方法,则代码this();封装:使用private关键字,隐藏类内属性,用户必须通过get,set方法来访问、设置类内属性。如果方法是static的,则不会重写,调用哪个方法,取决于对象的类型。super在子类的方法中使用,表示调用父类的属性或方法。这样即便子类被转换成了父类,也会调用被子类重写的方法。关键字:派生类继承基类的非private的属性和方法。时,会在子类构造方法的第一行隐式调用父类的无参构造器。不然的话会默认去调用父类的无参构造器,会报错。原创 2023-01-13 14:46:54 · 448 阅读 · 0 评论 -
JAVA Stack
注意返回的是Object对象(哪怕你最初push的是int类型,最后pop出来的也是Object类型)在stack中搜索某个Object,判断是否存在,参数可以为任意类型,会自动转换为Object。原创 2023-01-12 19:19:37 · 59 阅读 · 0 评论 -
12/365 java 方法调用 构造方法
当static方法调用非static方法时,有可能类还没有实例化,这时不存在对象,所以非static方法也不存在了,所以不能这样调用。但是若程序员定义了一个有参数的构造方法,再使用无参构造方法,则必须显示定义一个无参构造方法。反过来说,非static方法可以调用任何类型方法(无论是不是static)static方法可以调用static方法, 但不能调用非static方法。非static方法则需要用对象调用 new 类名() . 方法名()因为static方法是属于类的,非static方法是属于对象的。原创 2023-01-12 14:07:07 · 1072 阅读 · 0 评论 -
11/365 java 冒泡排序 面向对象
区别于面向过程,不是一步一步解决问题,而是将许多类似的对象抽象,提取共性(属性,方法),形成一个类,使用类的方法来解决问题。【分类思维,从宏观上处理复杂的问题】以类的方式组织代码,以对象的方式封装数据。OOP的三大特性:封装,继承,多态。类是对象的模板,是对对象的抽象。原创 2023-01-11 18:21:08 · 100 阅读 · 0 评论 -
10/365 java 多维数组 Arrays类
原本一维数组里存的是元素,现在二维数组的每个a[i]里存的是一个一维数组。用于对数组进行操作。里面的方法都是static,所以可以直接用类名调用。工具类:java.util.Arrays。原创 2023-01-10 21:00:30 · 65 阅读 · 0 评论 -
9/365 java 数组 内存
例如声明后,int[] a = new int(5);默认初始化:数组的元素调用该类型的默认初始化(int:0, String:null)创建: int[] a = new int[10];// 需指定数组大小。栈:存放局部变量,基本类型数据(int,chat,long...)动态初始化: int[] a = new int(5);静态初始化: int[] a = {8,9,10};方法区:存放已被加载的类信息,常量,static变量。所有线程共享,不存放对象的引用。声明: int[] a;原创 2023-01-09 20:26:17 · 294 阅读 · 0 评论 -
8/365 java 方法 值传递 引用传递 形参
当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本。指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的。这和C++的引用传递最大的区别就是,JAVA copy了一个副本,而C++是取了变量的地址,不存在副本之说。形参中的最后一个参数,不指定具体个数,可以理解为一个长度不定的数组,元素需为同一类型。普通的类内方法,new一个对象,通过 对象.方法名(参数列表) 来调用。Java不管是原始类型还是引用类型,传递的都是副本。原创 2023-01-08 15:05:24 · 162 阅读 · 0 评论 -
7/365 java 练习题:打印三角形
分解需要打印的内容,每行需要打印的空格递减,需要打印的*递增。用于练习for循环。原创 2023-01-08 22:02:06 · 67 阅读 · 0 评论 -
6/365 java Scanner类 switch case
表达式的值与case对应,决定跳转位置,若没有break,会一直往下执行,执行之后的每一个case的内容。网上说可以设置一个终止符,调用hasNext()的重载方法hasNext(String patten)hasNext()用于判断缓冲区是否仍有数据,若有数据,返回true,继续扫描。如果输入的内容类型正确,就会一致扫描,直到没有数据,阻塞,等到终端输入。若已经无数据,则阻塞,等待终端输入数据。需要注意的是程序不会结束,会一直阻塞。next以空格键作为结束符或分隔符。nextLine得到"I DO"原创 2023-01-07 21:54:47 · 202 阅读 · 0 评论 -
java 5/365 包机制 javadoc
如注释中有中文,命令中间可以加上参数 -encoding UTF8 -charset UTF8。2.IDEA中可以点击Tools --> Generate JavaDoc生成。可以使用import 来导入包 eg: import java.util.*package com.google.www //放在文件首行。1)直接在命令行敲 javadoc file.java。然后打开同路径下的新生成的index.hmtl。使用特定的标签作为注释,生成程序的开发文档。一般写在类或方法的上面,描述类或方法的作用。原创 2023-01-06 11:06:20 · 104 阅读 · 0 评论 -
4/365 java 运算符
答案:2*8 = 2*2*2*2 = 2 10为真,则不会继续判断第二个条件。题目:2*8如何计算速度最快。在底层做运算,效率高。原创 2023-01-06 10:21:38 · 57 阅读 · 0 评论 -
3/365 java 数据类型 变量 常量
实例变量:作用域在class内,如不初始化,会被赋予类型的默认值(0, 0.0, false, null),从属于类,使用时:类名.变量名 eg: tigger.food。经典面试题,逻辑上两个数是一样的,但是由于浮点数的存储方式,会引入舍入误差,此时代码会打印false。强制类型转换:(类型)变量名 高 --> 低 有可能出现内存溢出,或者精度降低的问题。类变量:带有关键字static,可以直接使用(变量名),从属于类。数字对应字符,例如 'a' = 97 = 0x61。原创 2023-01-03 21:24:55 · 62 阅读 · 0 评论 -
java 学习笔记 2/365 java基础知识(二)
静态类型语言:在创建一份数据(变量、参数、返回值等)时需要显式指明该数据的类型。通常情况下,这些数据的类型一旦被定义,在程序的整个生命周期也不再改变。动态类型语言:在创建数据时往往不需要指明该数据的类型,而且数据的类型也会随着值的改变而改变,给数据赋予不同的值,数据将得到不同的类型。这个图里C++是弱类型语言,我听的网课又说是强类型语言,我也就没有改上面的笔记。有一说一,有了整体的认识后,再重新细学,感觉很快乐,有新知,有体会。但C++是有隐式类型转换的,所以不太符合强类型语言定义。原创 2023-01-02 22:42:15 · 55 阅读 · 0 评论 -
java 学习笔记 1/365 java基础知识
C涉及到操作系统硬件资源的接口的,比如进程调度,网络通信等 ,这些接口均为每一个操作系统独有的,windows与 Linux 这些接口有差异,一旦C 程序中使用了这些接口,代码放到另外一个平台就无法编译通过了。每个年龄有每个年龄的风景,当时没学好java,找工作又误打误撞找了个C++,再写java竟然是七年后的今天了。跨平台性好(不同的OS会有不同的解释器,解释器会生成对应的机器码,解释器屏蔽了平台间的不同)我还很执着地问他,为什么for循环一定要从0开始,明明从1开始,我的计数也是正确的。原创 2023-01-01 18:22:26 · 79 阅读 · 0 评论