java
java学习
白小白的小白
你知道的越多,你不知道的越多!
展开
-
java中hashMap原理
jdk7数据结构组成:数组(查询快 插入慢)+链表jdk8数据结构组成:数组+链表+红黑树原创 2021-09-04 11:39:19 · 118 阅读 · 0 评论 -
java实现一个简单的单向链表
public class Node { private Object object; private Node next; public Node(Object object, Node next) { this.object = object; this.next = next; } public static void main(String[] args) { Node header原创 2021-09-04 10:51:09 · 143 阅读 · 0 评论 -
jvm的一些理解
1. jvm的优点(与c相比) 1. 跨平台 2. 自动内存管理,垃圾回收机制 3. 数组下标越界检查 4. 多态(这个python也没有)2. jvm与jdk jre的区别 jvm:java运行环境 jre:java运行环境 + 基础类库 jdk:java运行环境 + 基础类库 + 编译工具 javaSE程序:JDK+idea工具 javaSE程序:JDK+idea工具 + 应用服务器3. 存放地址 栈:空间小,速度比较快, 用来放对象的引用、方法(线程包含方法原创 2021-08-30 12:33:14 · 398 阅读 · 0 评论 -
java中枚举类的作用
当作常量来使用public enum Constant { RED, GREEN, BLANK, YELLOW; public static void main(String[] args) { System.out.println(Constant .BLANK); System.out.println(BLANK.ordinal()); System.out.println(Constant .RED); Syste.原创 2021-08-20 15:13:27 · 410 阅读 · 0 评论 -
spring boot 中异步Async的使用
在项目中,我们一般会和第三方去交互,比如发送短信验证码,比如发送邮件,那么,在请求这些第三方时,有可能就会造成等待,那么对用户的体验是非常不好的,那么就需要我们异步去执行这些浪费时间的操作,而不需要一直等待堵塞到那里,那在spring boot 里面是如何实现的那?利用Async在启动项中开启异步@EnableAsync(proxyTargetClass=true)server层import org.springframework.scheduling.annotation.Async;pu.原创 2021-08-10 17:18:41 · 689 阅读 · 0 评论 -
spring boot 发送邮箱
一般我们邮箱的选择最多的是 qq邮箱 网易邮箱,如何申请使用第三方发送邮件,都要得到授权码才可以:qq邮箱:网易云邮箱:拿到授权码后,就可以使用spring boot 开发了,建议使用qq邮箱,因为使用网易云邮箱发送时,网易云很容易把邮件当成垃圾邮件不让发送,报554,必须要抄送给自己一份或者直接发送给自己,抄送给其他用户才可以,极其不稳定,所以建议使用qq邮箱来发送pom中:<!-- 邮箱 --><dependency> <groupId&g.原创 2021-08-10 16:09:14 · 266 阅读 · 0 评论 -
spring boot 生成图片验证码
第一种方法:使用hutool生成图片验证码: 1.1 引入jar包:<!-- 糊涂工具包 --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>4.1.13</version> </dependency> 1.2 在代码中生成图片原创 2021-07-19 17:50:32 · 1128 阅读 · 0 评论 -
centos7下安装Maven
去官网下载:http://maven.apache.org/download.cgi找到合适的位置解压:tar -zxvf apache-maven-3.8.1-bin.tar.gz配置环境变量:vim /etc/profile重新加载环境变量:source /etc/profile查看是否安装成功:mvn -version设置国内镜像 在你的安装目录下 找到conf文件下的 settings.xml 然后vim settings.xml 找到mirrors标签对,添加一下代码:&.原创 2021-07-06 17:14:10 · 2336 阅读 · 0 评论 -
java知识点
地址原创 2021-07-05 15:22:20 · 240 阅读 · 0 评论 -
java中的方法引用
通过对象名引用成员方法public class MethodRerObject { //定义一个成员方法,传递字符串,把字符串按照大写输出 public void printUpperCaseString(String str){ System.out.println(str.toUpperCase()); }}/* 定义一个打印的函数式接口 */@FunctionalInterfacepublic interface Printable .原创 2021-05-29 18:37:10 · 1330 阅读 · 0 评论 -
java中的steam流
当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个"模型"步骤方案,然后再按照方案去执行它 这张图展示了过滤 映射 跳过 计数等多步操作,这是一种集合元素的处理方案,而方案就是一种"函数模型",图中的每一个方框都是一个“流”,调用指定的方法,可以从一个流模型转换为另一个模型流,而最右侧的数字3是最终结果。 这里的filter map skip都是在对函数模型进行操作,集合元素并没有真正被处理,只有当终结方法count执行的时候,整个模型才会按照指定策略执原创 2021-05-29 18:12:26 · 2417 阅读 · 1 评论 -
java中函数式调用Function
import java.util.function.Function;/* java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据, 前者称为前置条件,后者称为后置条件。 Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。 使用的场景例如:将String类型转换为Integer类型。 */public class Demo01Func原创 2021-05-29 16:49:31 · 2057 阅读 · 0 评论 -
java中函数式调用Predicate
import java.util.function.Predicate;/* java.util.function.Predicate<T>接口 作用:对某种数据类型的数据进行判断,结果返回一个boolean值 Predicate接口中包含一个抽象方法: boolean test(T t):用来对指定数据类型数据进行判断的方法 结果: 符合条件,返回true 不符原创 2021-05-29 16:43:36 · 1107 阅读 · 0 评论 -
java函数式调用Consumer
import java.util.function.Consumer;/* java.util.function.Consumer<T>接口则正好与Supplier接口相反, 它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。 Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。 Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据 至于具体怎么原创 2021-05-29 16:14:35 · 609 阅读 · 0 评论 -
java中函数式调用Supplier
import java.util.function.Supplier;/* 常用的函数式接口 java.util.function.Supplier<T>接口仅包含一个无参的方法:T get()。用来获取一个泛型参数指定类型的对象数据。 Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据 */public class Demo01Supplier { //定义一个方法,方法的参原创 2021-05-29 16:03:02 · 902 阅读 · 0 评论 -
java中函数式Comparator排序
package com.itheima.demo03.LambdaTest;import java.util.Arrays;import java.util.Comparator;/* 如果一个方法的返回值类型是一个函数式接口,那么就可以直接返回一个Lambda表达式。 当需要通过一个方法来获取一个java.util.Comparator接口类型的对象作为排序器时,就可以调该方法获取。 */public class Demo02Comparator { //定义一个方法原创 2021-05-29 15:55:09 · 335 阅读 · 0 评论 -
java的序列化流
import java.io.Serializable;public class Person implements Serializable{ // 声明id,防止序列化后再反序列化发现id不一致报错 private static final long serialVersionUID = 1L; private String name; //private static int age; 静态变量不能反序列化 //private transient int a原创 2021-05-29 13:22:15 · 209 阅读 · 0 评论 -
java中的缓冲流和转换流
// 字符缓冲流 和 redis中的管道非常像,就是将数据都放到一个缓冲的地方(redis中称为管道),然后最后一起执行操作import java.io.*;public class Demo33Class { public static void main(String[] args) throws IOException { // 1. 定义写缓冲字符流 BufferedWriter bw = new BufferedWriter(new FileWr原创 2021-05-29 13:09:26 · 168 阅读 · 0 评论 -
java中的I/O基本操作
// 字节流, 没有字符流兼容性强,中文容易乱码import java.io.*;import java.util.Properties;import java.util.Set;public class Demo32Class{ public static void main(String[] args) throws IOException { // 1. 定义写字节流 append表示追加写 FileOutputStream fos = new原创 2021-05-29 08:40:35 · 115 阅读 · 0 评论 -
java中对文件的操作
// file操作文件import java.io.File;import java.io.IOException;public class Demo31Class { public static void main(String[] args) { // ; System.out.println(File.pathSeparator); // \ System.out.println(File.separator);原创 2021-05-28 14:51:02 · 79 阅读 · 0 评论 -
java函数式编程和lambda匿名函数
lambda的语法非常简介,完全没有面向对象复杂的约束, 但是使用时有几个问题需要特别注意;使用lambda必须具有接口,且要求接口中有且只有一个抽象方法无论是jdk内置Runnable Comparator接口还是自定义的接口,只有当接口的抽象方法存在且唯一时,才可以使用Lambda使用Lambda必须具有上下文推断也就是方法的参数或局部变量类型必须为lambda对应的接口类型,才能使用lambda作为该接口的实例有且仅有一个抽象方法的接口,叫做函数式接口// 函数式编程, lambda匿名函原创 2021-05-28 10:35:15 · 151 阅读 · 0 评论 -
java线程之间的通信
// 线程之间的通信,类似与订阅者和消费者之间的关系,比如一个线程生产包子,另一个线程用来吃包子// 线程之间的通信,前提: 同一个对象中线程的通信public class Demo28Class extends Thread { public static void main(String[] args) { Object obj1 = new Object(); // 使用匿名类生成第一个对象(顾客) new Thread(){原创 2021-05-27 15:24:37 · 131 阅读 · 0 评论 -
java线程池
创建线程池的第一种方法:/*使用线程池的好处:1. 降低资源的消耗。线程本身是一种资源,创建和销毁线程会有CPU开销;创建的线程也会占用一定的内存。2. 提高任务执行的响应速度。任务执行时,可以不必等到线程创建完之后再执行。3. 提高线程的可管理性。线程不能无限制地创建,需要进行统一的分配、调优和监控。使用线程池的坏处:1. 频繁的线程创建和销毁会占用更多的CPU和内存2. 频繁的线程创建和销毁会对GC产生比较大的压力3. 线程太多,线程切换带来的开销将不可忽视4. 线程太少,多核C.原创 2021-05-27 13:59:05 · 68 阅读 · 0 评论 -
java多线程资源竞争
先看一下java多线程资源竞争的案例/* 当多个线程访问同一个变量时,这个变量被称为共享变量,而当多个线程操作同一个变量时,就会出现资源竞争的问题,* 举例, 有个变量num为100, 每个线程对其的操作就是减去1(想想一下卖票系统,100个票,有三个售票员[三个线程]),有一个* 在cpu哪里累死累活抢到了使用权,拿到了100,还没来的及去减1, 完了,cpu被第二只线程抢了过去,一看num还是100,然后执行了100-1* num就这样变为了99,这时第一个cpu终于抢到了cpu的使用权.原创 2021-05-27 11:19:15 · 1275 阅读 · 1 评论 -
java匿名多线程
实现代码:// 并发:就是交替执行, python中一般叫串行, 也就是多线程的执行方式// 并行:就是各执行个的,互不干扰,就是多进程的执行方式// 匿名多线程 java中的多线程是抢占式调用,而不是这个线程执行一个,下一个就是另外一个线程来执行,而是// 进程会随机选择一个线程当做"亲"儿子,让他多执行一会public class Demo24Class { public static void main(String[] args) { // Thread匿名多线原创 2021-05-26 10:52:04 · 1193 阅读 · 0 评论 -
java实现多线程
java实现多线程有两种方法Thread和RunnableThread实现代码实现类Demo19Class代码:// 多线程用法一public class Demo19Class extends Thread { @Override public void run() { // 打印子线程的名字 1 String stringName1 = getName(); System.out.println(stringName1);.原创 2021-05-26 10:27:40 · 333 阅读 · 1 评论 -
java中的自动拆箱和装箱
自动拆箱和自动装箱(包装类和数据类型)// 将int变为包装类(这里隐含了自动装箱) System.out.println("==========装箱"); Integer num1 = 99; // 装箱 Integer num2 = Integer.valueOf(100); System.out.println(num1); System.out.println(num2); // 将包原创 2021-05-25 10:47:20 · 82 阅读 · 0 评论 -
java中的异常捕捉
java中的异常捕捉和python的很相似,catch里面的错误一般都会写到日志中,而不是程序因为一些意外原因报错而让其停止运行,而是捕捉到放到日志中去查询// 什么是包装类: 一些变量原来没有对应的方法来操作他们,所以要搞一些方法来操作他们,而管理这些方法的类叫做包装类import java.lang.reflect.Array;import java.util.*;public class Demo14Class { public static void main(String[]原创 2021-05-25 10:24:31 · 272 阅读 · 0 评论 -
java中hashmap遍历
java中hashmap遍历有两种方法,第一种就是将所有的key放到set中,然后通过遍历set通过key来获取value,可以选择使用迭代器遍历也可以使用增强for来遍历,第二种可以使用entryset来循环,推荐使用entryset,因为entry里面放的是key和value,所以效率更快// hashmap操作(key value, key不可以重复, 无序)key 经过hash加密,并且equal对比来确定其内存地址 System.out.println("hashmap操作===原创 2021-05-25 10:09:38 · 3684 阅读 · 0 评论 -
Java基础之int和Integer有什么区别
转载:地址转载 2021-05-22 10:26:12 · 90 阅读 · 0 评论 -
java的内存
Java的内存需要划分为5个部分:栈(Stack): 存放的都是方法中的局部变量(方法的运行一定要在栈当中运行)局部变量:方法的参数,或者是方法{}内部的变量作用域: 一旦超出作用域,立刻从栈内存当中消失堆(Heap): 凡是new出来的东西,都在堆里面堆内存里面的东西都有一个地址值:16进制堆内存里面的数据,都有默认值,规则:如果是整数 默认为0如果是浮点数 ...原创 2020-02-12 19:07:04 · 111 阅读 · 0 评论 -
java中方法的重载
对于功能类似的方法来说,因为参数列表不一样,却需要记住那么多不同的方法名称,太麻烦。方法的重载(Overload):多个方法的名称一样,但是参数列表不一样。好处:只需要记住唯一一个方法名称,就可以实现类似的多个功能。方法重载与下列因素相关:参数个数不同参数类型不同参数的多类型顺序不同方法重载与下列因素无关:与参数的名称无关与方法的返回值类型无关举例说明:public ...原创 2020-02-04 12:27:41 · 236 阅读 · 0 评论 -
java中方法的定义
定义方法的完整格式修饰符 返回值类型 方法名称(参数类型 参数名称, …) {方法体return 返回值;}参数说明修饰符:初始阶段的固定写法,public static返回值类型:也就是方法最终产生的数据结果是什么类型方法名称:方法的名字,规则和变量一样,小驼峰参数类型:进入方法的数据是什么类型参数名称:进入方法的数据对应的变量名称PS:参数如果有多个,使用逗号进行分...原创 2020-02-04 12:05:44 · 504 阅读 · 0 评论 -
java基础知识
标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符命名规则:标识符可以包含 英文字母26个(区分大小写) 、 0-9数字 、 $(美元符号) 和 _(下划线) 。标识符不能以数字开头。标识符不能是关键字。类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。变量名规...原创 2020-01-11 21:48:32 · 150 阅读 · 0 评论 -
计算机存储单元
位(bit):一个数字0或者一个数字1,代表一位。字节(Byte):每逢8位是一个字节,这是数据存储的最小单位。1 Byte = 8 bit1 KB = 1024 Byte1 MB = 1024 KB1 GB = 1024 MB1 TB = 1024 GB1 PB = 1024 TB1 EB = 1024 PB1 ZB = 1024 EB...原创 2020-01-11 20:34:21 · 515 阅读 · 0 评论