自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 javaScript函数的定义和arguments,result关键字

javaScript函数的定义和arguments,result关键字函数的两种定义方式function abs(x) { if(x>0){ return x; } else { return -x; } }let abs2=function (x) { if(x>0){

2021-08-08 22:43:27 579

原创 javaScript中的Map和Set

javaScript中的Map和SetMap和Set是Es6新增的特性,在javaScrip中是很常用的。Map集合的定义及增删改查注意元素是通过中括号包起来,元素间通过逗号隔开,key和value也是通过逗号隔开的。let map=new Map([["name","打肥肥"],["age","25"]]); /*添加或修改元素*/ map.set("height","156"); /*删除元素*/ map.delete("name"

2021-08-04 23:12:18 122

原创 javaScript循环

在javaScript中循环结构包括while循环,dowhile循环,for循环,forEach循环,前三种循环和java中的循环一样,forEach循环是通过调用funcation函数来实现的,下图为通过for循环和forEach循环来遍历数组。<script> 'use strict'; let arr=[1,2,3,4,5]; for(let i=0;i<arr.length;i++){ console.lo

2021-08-04 21:17:32 101

原创 JavaScript对象

JavaScript对象javaScript中对象的定义如下图所示。在大括号中间添加属性,属性用引号引起来,属性之间通过逗号隔开。let person={ "name":"打肥肥", "age":20 }对象在定义之后,如果需要添加属性,不用向java中那样重新定义,我们可以直接添加。例如给person对象添加height属性,如下即可。person.height=150;如果需要删除某个属性,也只需要通过delete即可删除。

2021-08-02 23:15:11 58

原创 JavaScript严格检查模式

JavaScript严格检查模式严格检查模式只在Es6版本下支持,它可以规范我们的代码,检出出我们代码编写的错误。只需要在头部添加’use strict’;即可。 <script> /*严格检查模式,只能在es6下面使用 * */ 'use strict'; i=4; </script>如上图所示,如果我们不加这行代码,定义i=4;就不会报错。但是加了这句话之后,就会报错,从而规范我们的代码。...

2021-08-01 22:56:59 80

原创 买卖股票的最佳时机

买卖股票的最佳时机给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。动态规划解决我们可以分为有股票和无股票两种情况1. 有股票:前一天就买了,今天没卖,此时余额为hold。还有一种是前一天没买,今天买了,此时余额为noHold - prices[i]。我们取两种情况的最大值。2. 没股票:前一天没买,今天也没买,此时余额为noHold。第二种情况是前一天买了,今天买了,此

2021-07-22 14:57:45 49

原创 删除排序数组中的重复项

删除排序数组中的重复项给你一个有序数组 arr ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。我们可以利用双指针来解决,左指针初始化为0,右指针初始化为1当左指针的值等于右指针时,做指针不变,右指针右移一位当左指针的值不等于右指针时,左指针右移一位,然后在与右指针交换值如图所示,给定一个排序数组,当我们调用方法后,就会返回删除数组的新长度5:public class Demo01 { public static void main(String[

2021-07-22 11:01:08 119

原创 网页页面结构

网页页面结构使用规范的页面结构能够让html具有可读性,常见的标签如下表:元素名描述header标题头部内容footer标记脚步内容section‘页面中独立的部分article独立的文章内容aside侧边栏nav导航类辅助类容...

2021-07-18 16:57:49 72

原创 位运算实现加减乘除

位运算实现加减乘除计算机在在做加减乘除时,实质上是在做异或和与运算例如,计算4+5,4在计算机用二进制表示为00000100,5为00000101做异或运算0000010000000101 00000001做与运算(判断是否需要进位,如果都为0则不需要)0000010000000101 00000100进位(将与运算的结果左移一位)00001000做异或运算(将第一步和第三步的结果做异或运算)0000000100001000 00001001

2021-07-06 18:12:19 342

原创 原码反码补码

原码反码补码源码反码补码是针对有符号数的编码规则。原码:最高位为符号位,其它位为本身的绝对值反码:正数与原码相同,负数最高位不变,其它取反补码:正数与原码相同,负数在反码的基础上+1例如一个8进制数-5源码:1000 0101反码:1111 1010补码:1111 1011...

2021-07-06 16:27:12 306

原创 获取注解信息

获取注解信息通过反射,我们可以获取类上的注解值和属性方法上的注解值,这在mybatis中是很常用的。如下图所示,自定义类注解Table和属性注解Filed,我们在Student类中添加这两个注解,通过反射就能获取注解中的值。public class Test06 { public static void main(String[] args) throws Exception { Class cls = Student.class; //获得注解

2021-07-04 21:54:24 499

原创 java暴力反射

暴力反射如果一个对象的属性是私有的,常规方法只有通过get()方法获取。如果对象中没有get()方法,此时我们就需要通过暴力反射,关闭属性检测,就能获取属性值了。public class Test05 { public static void main(String[] args) throws Exception { //获取类对象 Class cls = Class.forName("com.reflection.Student"); //通过

2021-07-04 16:56:12 484

原创 通过反射动态创建对象操作属性及方法

通过反射动态创建对象操作属性及方法通过反射我们能够获取类的属性及方法,然后我们只需创建该类的对象,就能执行方法和操作属性了。invoke()能够通过对象执行指定方法get() set() 能够设置或获取对象的属性public class Test04 { public static void main(String[] args) throws Exception { Class cls = Class.forName("com.reflection.User02");

2021-07-04 16:40:47 642

原创 获取类运行时结构

获取类运行时结构我们可以在程序运行时,获取类的属性,方法及构造方法。public class Test03 { public static void main(String[] args) throws Exception { //通过反射获取类 Class cls = Class.forName("com.reflection.User"); //获得类的名字 System.out.println(cls.getName());

2021-07-04 16:11:33 48

原创 java中类加载器

类加载器作用类加载器的作用是将字节码文件加载进内存,让静态数据在方法区中变成结构数据,同时在堆中形成这个类的class对象。分类系统加载器扩展类加载器根加载器内置加载器主要是负责加载我们自定义的类,而系统加载器主要是负责加载jdk内置的类,如String类等。双亲委派机制在内加载的过程中,会先使用系统加载器,在使用扩展类加载器,最后才使用根加载器。如果后者能加载前者已经加载了的类,就会重新加载并进行覆盖。这就是双亲委托机制。所以我们在long包下自定义一个Sting类,是无法进行使用的

2021-07-04 15:33:25 54

原创 类的加载与ClassLoader理解

类的加载与ClassLoader理解1.加载将class字节码文件加载到内存中,将这些静态的数据转换为方法区的结构数据,然后生成一个这个类的Class对象2.链接2.1 验证:确保加载的类符合JVM规范,没有安全方面的问题2.2准备:正式为类变量分配内存并设置类变量的初始值,这些内存都在方法区进行分配2.3解析:虚拟机常量池内的符号引用变为地址引用3.初始化执行类构造器< clinit>()方法的过程初始化一个类的时候,如果发现其父类还未初始化,则先初始化父类保证类的&

2021-07-02 22:19:38 76

原创 获取Class类的三种方式

获取Class类的三种方式通过类名.class获取通过实例对象获取通过Class.forName获取三种方式获取的类是同一个,应为它们的hsahCode相同public class Test01 { public static void main(String[] args) throws ClassNotFoundException { //方式一:通过类名获取 Class c1=Person.class; //方式二:通过对象获取

2021-07-02 21:41:56 797

原创 自定义注解

自定义注解如下图的自定义注解,能够在方法或类上使用。String是参数类型,name()是参数名。我们还可以用default为id添加默认值,这样我们在使用的时候就不需要赋值了。参数类型还可以是数组类型等。@custom(name = "大肥肥")public class Test01 {}//在类和方法上使用@Target({ElementType.METHOD,ElementType.TYPE})//运行时有效@Retention(RetentionPolicy.RUNTIME)@i

2021-07-02 21:12:04 177

原创 注解的简介

注解内置注解java自带的注解,常见的有:@override(判断方法是否重写了父类的方法)@deprecated(不推荐使用,但能使用)@suppressWarnings(镇压警告)元注解负责注解其它的注解,由四个注解组成@Target(作用是控制该注解的能在什么地方使用,METHOD表示在方法上使用,TYPE表示在类上使用)@Retention(作用是该注解的有效期,SOURCE在源码有效,CLASS在类中有效,RUNTIME在运行时有效,RUNTIME>CLASS>SOU

2021-07-02 20:53:50 62

原创 通过URL下载资源

通过URL下载资源URL组成部分一个完整的URL通常由四部分组成。协议,IP地址,端口号,全路径组成。全路径包括文件和参数。例如一个URL路径“http://localhost:8080/hello/index.htmlusername=dafeifei”协议:httpip地址:localhost端口号:8080全路径:/hello/index.html?username=dafeifei相关代码如下图所示:public static void main(String[] args) thr

2021-06-26 19:43:03 1125

原创 UDP实现聊天

UDP实现聊天QQ微信等聊天工具,原理是通过UDP实现的,在好友离线的时候也能向好友发送消息,就是因为UDP在发送消息前不需要建立连接。我们可以通过UDP通信来写一个简单的聊天工具。首先我们创建一个发送线程,负责读取控制台的消息,并向接收端发送过去。在读取到"再见"的时候,停止发送,关闭程序。public class Sender implements Runnable { DatagramSocket socket; String ip; int port; Buff

2021-06-26 18:44:26 780

原创 UDP通信

UDP通信UPD通信是以报文的形式发送,不需要建立连接,同样也是通过socket实现的。发送端通过socket发送包,接收端通过socket接收包。发送端 public static void main(String[] args) throws Exception { //创建一个socket DatagramSocket socket = new DatagramSocket(); String msg = "你好服务器"; //创建

2021-06-23 22:27:58 225 2

原创 tomcat使用

tomcat使用启动tomcat在tomcat下的bin文件夹下有如图四个文件,startup.bat实在windows环境下启动服务器,start.sh实在linux环境下启动,其它两个是关闭。出现如图所示则表示启动成功。访问服务器页面在网页上输入http://localhost:8080就可以访问到服务器的首页,该页面是在webapps下的ROOT文件夹下的。在服务器上写文件并通过浏览器访问在webapps文件夹下创建一个creation文件夹,在文件夹中创建一个creation.t

2021-06-22 23:38:51 85

原创 TCP文件上传

TCP文件上传TCP文件上传主要通过socket和io流进行实现的,客户端将本地的文件通过网络流发送到服务器,服务器接收后保存到服务器本地,从而实现文件上传。下图是文件上传的具体实现。要注意的是,在客户端上传完成之后,要通过socket调用shutdownOutput方法关闭输出流,告诉服务器文件已全部发送,否则程序会被卡住。服务器public static void main(String[] args) throws IOException { //创建一个端口号为9999的服务

2021-06-22 23:01:24 548

原创 TCP,Socket实现通信

TCP,Socket实现聊天服务器先创建一个serverSocket,然后等待客户端连接,连接成功之后就会创建一个和客户端配对的socket,然后通过输出流读取客户端发送的消息进行打印。客户端创建socket时,需要ip地址和端口号去定位连接的服务器,连接成功之后通过输入流向服务器发送信息。public class TcpServer { public static void main(String[] args) { ServerSocket serverSocket = nu

2021-06-14 17:36:34 296 3

原创 TCP与UDP的区别

TCP与UDP的区别TCP协议创建通信先要进行三次握手,断开时要进行四次挥手。TCP提供可靠传输,UDP为不可靠传输。TCP面向字节传输,它能将传输的信息分割成组,在接收端再进行重组。而UDP是直接以报文的形式传输,没有分组的开销。TCP提供拥塞控制和流量控制机制,而UDP不提供。TCP协议的三次握手和四次挥手三次握手客户端A向服务器B发送一个SYN包(SYN=k)。服务器B收到客户端A发送的SYN包后,发送一个ACK包(ACK=k+1)以及自己的SYN包(SYN=j)。客户端A接收

2021-06-14 16:24:06 98

原创 端口号介绍

端口号介绍不同的进程有不同的端口号,用来区分软件的。规定范围为:0-65535同一协议下端口号不能相同,不同协议下可以相同。端口可以分为公有端口和私有端口和程序注册端口。公有端口为0-1023,一般为计算机运行所需的端口,http的端口为80,https端口为443。程序注册端口1023-49151,一般为我们所使用的端口,如tomcat的8080,mysql的3306。私有端口49152-65535。public class TestInetSocketAddress { publi

2021-06-14 15:43:23 631

原创 IP地址介绍

IP地址ip地址:inetAddress用于定位唯一一台计算机的,相当于每个人的身份证。本机ip地址:127.0.0.1或 localhostip地址分类ipv4,右四个字节组成,例192.168.226.87ipv6,例如fe80::5d4b:bac7:45b5:46b9%23公网(互联网)和私网(局域网),我们用的网一般为一个大的局域网。通过inetAddress获取IP地址一般我们访问网站的时候,都是通过域名进行访问的,因为域名好记,不像ip地址那么复杂,而一个域名也是对应一个I

2021-06-13 22:56:03 163

原创 线程池的使用

线程池的使用线程池工具类Executors,通过里面的静态方法newFixedThreadPool可以创建线程池,需要传入数字确定线程池的最大容量。通过execute开启线程,不需要通过start方法开启线程,需要传入一个实现runnable接口的类的对象。线程池需要通过shutdown方法进行关闭。public class TestPool { public static void main(String[] args) { //通过线程池工具类Executors创建一

2021-06-10 23:52:55 75

原创 信号灯法控制线程间协作

信号灯法控制线程间协作下图这个例子就是利用信号的法控制线程之间的协作,当flag为true时观众观看节目,当flag为false时演员表演节目。这样就能保证演员表演节目时观众就进行观看,不会出现演员一直表演节或观众一直观看的情况。public class TestPC2 { public static void main(String[] args) { //自创建一个节目,保证同一资源 TV tv = new TV(); //创建演员和观众

2021-06-10 23:38:00 75

原创 线程协作及wait和notifyAll的用法

线程协作及wait和notifyAll的用法线程协作是指多个线程之间能够进行通信,以保证程序能够正常高效的运行,其中就要用到wait和notifyAll两个方法。wait是让线程睡眠,而notifyAll是指唤醒所有线程,都是Object中的方法。下图案例就是一个多线程协作的程序,消费者负责消费产品,生产者负责生产产品,仓库负责存储产品,但最多存储10个。如果存储满了就会通知消费者进行消费,同时如果仓库没有产品了,就会通知生产者生产。这就是生产者线程和消费者线程进行协作的,能够保证程序的高效性。pub

2021-06-09 23:24:53 231

原创 Lock和Synchronized的区别

Lock和Synchronized的区别Lock是显示锁(需要手动加锁和释放),Synchronized是隐式锁,出了作用域会自动释放。Lock只作用于代码块,Synchronized即可作用于代码块,也可作用于方法上。使用Lock锁,不会占用大量JVM资源,性能更好。使用优先级Lock>Synchronized同步代码块>Synchronized同步方法...

2021-06-07 23:38:30 78

原创 Lock锁

Lock锁Lock接口是控制多个线程对共享资源访问的工具。每次只能有一个线程对lock加锁。常用的实现类是ReentrantLock。下图代码买票是一个不安全的线程,当我们加入lock锁之后,线程就安全了。一般上锁放到try里面,释放锁放到finally里,能保证出现异常也能释放锁。public class TestLock { public static void main(String[] args) { //定义多个窗口买票 BuyTicket buyTi

2021-06-07 23:31:03 49

原创 java死锁

死锁死锁是指多个线程拥有资源,并且都需要对方资源,自己的资源又不释放,此时就造成了死锁。产生死锁的四个条件一个资源自能被一个线程使用一个线程因为获取资源被阻塞,不释放自己的资源线程获取资源在未使用完之前,不能被强行剥夺若干线程形成一个头尾相连的环,去获取其它线程的资源我们只需要让一个条件不满足,就避免了死锁。public class DeadLock { public static void main(String[] args) { //创建一个灰姑娘

2021-06-07 23:05:26 117

原创 同步方法同步块Synchronized

同步方法同步块Synchronizedsynchronized可以加在方法上,使方法变成同步方法。也可以当成同步块使用。public class UnSafeBank { public static void main(String[] args) { //创建一个账户 Account account = new Account("蓝色的番茄", 10000); //创建两个取钱线程 Drawing you = new Drawin

2021-06-06 23:27:39 302 2

原创 守护线程和用户线程

守护线程线程分为守护线程和用户线程,默认为用户线程。当所有的用户线程都跑完,守护线程就会自动结束。可以通过setDaemon方法去设置守护线程。gc垃圾回收线程就是一个守护线程。public class TestDaemon { public static void main(String[] args) { My my = new My(); God god = new God(); Thread threadMy = new Thread(my

2021-06-06 21:58:08 117

原创 线程的优先级

线程的优先级线程优先级一共有10个等级1-10,1最低,10最高。优先级高的不一定会先执行,只会提高线程执行的权重。可以通过setPriority()和getPriority()去设置获取线程的优先级。主线程的优先级为5。public class TestPriority { public static void main(String[] args) { //打印主线程的优先级 System.out.println(Thread.currentThread().

2021-06-06 21:36:50 3026

原创 线程的五种状态

线程的五种状态线程一共有5种状态,创建状态(NEW)就绪状态运行状态(RUNNABLE)阻塞状态(TIMED_WAITING,还有WAITING和BLOCKED两种)死亡状态(TERMINATED)public class TestState { public static void main(String[] args) { //创建一个线程 Thread thread = new Thread(new Runnable() {

2021-06-06 21:18:06 367

原创 线程中join的使用

线程中join的使用join和并线程,线程调用该方法后就会强制执行,直到执行完才会执行其它线程。可以理解为插队。public class TestJoin { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(new Join()); thread.start(); thread.join();

2021-06-06 17:14:57 166

原创 线程中yield的使用

yieldyield可以让线程从运行状态变为就绪状态,但礼让不一定会成功,要看cpu去如何调度。public class TestYield { public static void main(String[] args) { Yield yield = new Yield(); new Thread(yield,"a").start(); new Thread(yield,"b").start(); }}class Yield imp

2021-06-06 17:03:53 575

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除