自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(44)
  • 问答 (2)
  • 收藏
  • 关注

原创 使用Redis可能会遇到的问题 (缓存穿透 缓存雪崩 缓存击穿)

目录前言缓存穿透出现的原因解决方法缓存雪崩出现原因解决方案大量缓存内容同时过期缓存服务器宕机缓存击穿出现原因解决方案前言在考虑使用redis作为缓存可能出现的问题的时候我们首先明确自己使用缓存的目的,一般情况下人们使用缓存的原因存在以下两种:减少数据库服务器的负载提高查询速度和性能缓存穿透出现的原因缓存穿透是指,当数据库和缓存中都不存在所查询的对象的时候, 所有的类似请求都会落到数据库当中,对数据库造成了大量压力.解决方法首先明确一点,如果你的程序其他模块没有什么较大的问题,这种请求一

2022-03-17 20:16:39 619

原创 GC的类型与回收器选择

目录GC的类型Minor GCMajor GC (Full GC)常用的回收器Serial(串行收集器)ParNew回收器Parallel Scavenge提升系统吞吐量的方式Serial OldParallel OldCMS收集器G1收集器GC的类型GC的类型是分为Minor GC和 Major GC(Full GC),分别对应新生代和老年代Minor GCMinor 对应新生代触发的条件: Edon区满了的时候触发频率:很多次, 因为新生代的很多对象快速产生快速消亡的.Major GC (

2022-03-04 19:38:45 404

原创 JVM垃圾回收机制

学习过C++的同学都知道,C++是需要手动自己回收内存垃圾但是在Java中, 我们并不需要主动的回收内存垃圾, 而是在JVM当中通过一定的策略选择垃圾进行回收.本文旨在简单阐述,可能会忽略掉一些细节,同时可能存在一些错误, 请大家指导通俗来讲, JVM回收垃圾主要通过三个步骤:发现垃圾回收垃圾整理内存(在某些算法中会实现)这其中我们也会把,第二第三步放在一起来处理1. 发现垃圾写过java程序的程序员都知道,程序运行时会不停创建引用与实例, 当一个函数或者代码块运行完成之后, 函数将自

2022-03-03 21:03:30 303

原创 今日学习内容--机器学习的测试集选择方法

机器学习测试集选择方法目录机器学习测试集选择方法留出法多次留出法选择交叉验证法留一法交叉验证自助法总结目前来说总共有三种测试集选择方法:留出法交叉验证法自助法以下分别对三种方法进行讨论本文约定如下:D :代表数据集S :代表训练集T :代表测试集留出法留出法的原理相对简单, 就是从数据集-D中选择一部分出来作为训练集-S,剩下的一部分作为测试集-T需要注意的事项:在选择测试集与训练集的时候双方并没有存在交集, 并且需要保证它们的数据分布性存在一致性比如: 数据集中有100个

2022-03-02 20:05:32 3890

原创 ES物理存储逻辑

前言昨天面试时被问到了ES的物理存储逻辑, 虽然知道基本结构为倒排表的物理结构,但是更详细的就不清楚,今天网上找了资料详细了解下, 引用自知乎大佬(https://zhuanlan.zhihu.com/p/413984787)es基本结构基本结构是倒排表:通过将将文章分词,然后以分词结果作为查询索引,可以快速通过短语查询获得文档比如文档A: “我爱中国” ,分词后为[我, 爱, 中国]则es的倒排索引就变成了[“我” ->A“爱” ->A“中国” ->A]其中 分词

2022-02-22 20:40:41 425

原创 简单约简

除了创建和转换流,更加重要的内容为从流的数据中获取答案。这种操作被称为约简。约简是一种终结操作,它们会将流约简为可以在程序中使用的非流值。在之前的博客当中已经使用过了count方法,这也是一种简单地约简操作。...

2021-04-20 20:22:26 189

原创 1.5 其他的流转换

distinct方法会返回一个值,它的元素是从原有流中产生的,即原来的元素按照同样的顺序剔除重复元素之后产生的。这个流显然能够记住它已经看到过的元素。import java.util.Arrays;import java.util.List;import java.util.stream.Collectors;public class StreamMain { public static void main(String[] args) { String[] sArray

2021-04-17 17:53:41 78

原创 1.4抽取子流和连接流

使用limit方法可以返回一个当前流的子流,limit(n)返回当前流的前n个元素的流。而 skip(n)方法恰恰相反,他会跳过前n个元素然后返回之后的子流。concat()方法可以将两个流的连接在一起,如concat(Stream s1, Stream s2)将会把s1和s2两个stream连接在一起然后返回一个新的流。需要注意的是s1不能是无限流。...

2021-04-17 17:12:22 100

原创 1-3 filter、map和flatMap方法

流的转换会产生一个新的流,它的元素派生自另一个流的元素。例如filter转换会产生一个流,它的流元素与某种条件相匹配。filter 的引元为predicate<T>,即从T转换成boolean函数。通常,程序需要按照某种方式来转换流中的值,此时,可以使用map方法并传递执行该转换的函数。例如:Stream<String> lowercaseWords = words.stream().map(String::toLowerCase);上述代码使用的是带有方法引用的map,但

2021-04-15 21:50:51 212

原创 1.2流的创建

可以使用Collection接口的Stream方法将任何集合转换为一个流。如果你有一个数组,那么可以使用静态的Stream.of方法。Stream<String> words = Stream.of(contents.split("\\PL+"));of方法拥有可变长参数,因此我们可以构建具有任意数量引元的流。package streams;import java.io.File;import java.io.IOException;import java.math.BigInt

2021-03-18 14:27:19 84

原创 1.1从迭代到流的操作

在对每个集合元素进行遍历操作的时候,例如,需要对一本书当中所有的单词进行计数,比如将所有的单词放到一个列表。那么下面的两种操作方式的结果都是一样的。方法一 long count = 0; for (String w :words){ if (w.length()>2) count++; }方法二long count = words.stream() .filter(w -> w.length() > 2).count();流的版本比循环代码的版本更加容易阅读看

2021-02-23 21:10:34 83

原创 第一章 Java SE 8的流库

流提供了比集合更高的概念级别上指定计算的数据视图通过使用流可以说明想要完成什么任务,而不是如何去实现它。将操作的调度留给具体实现去解决。、例如,假设我们想要计算某个属性的平均值,可以指定数据源和具体属性,然后流库可以对计算进行优化,例如:使用多线程计算总和和个数,并将结果合并。...

2021-02-21 19:08:35 59

原创 机器学习 - 代表性示例

支持向量机支持向量机(Support Vector Machine,SVM)是机器学习中最为流行的监督学习方法。该方法仍被广泛的应用于数据挖掘产业。使用支持向量机方法时,它会在每类数据中寻找与其他类最接近的数据,并将其标记为标准。...

2020-11-29 20:42:24 207

原创 机器学习算法-监督学习与无监督学习

即使是一个最简单的分类方法都是存在无数的边界,然而,我们很难讲他们当中哪个才是最好的。这是因为,即使针对已知数据我们可以恰当的分类,这也不能保证对未知数据能够达到相同的效果。不过你可以提高模式识别的准确率。每一种机器学习方法都会设置一个标准来进行更好的模式分类,决定最佳可能的边界——决策边界——从而提高识别的准确率。毫无疑问,这些标准使用不同的方法时差异很大。首先从广义划分当中机器学习可以分为监督学习与无监督学习。这两种分类之间的差异是机器学习使用的数据集实发加入了标签,即有标数据与无标数据。监督学习

2020-11-28 20:23:18 735

原创 Java基础——注解(1)

注解其实是代码里面的特殊标记,这些标记可以在编译、类加载、运行时被读取,并执行相应的处理。通过使用注解,程序开发人员可以在不改变原有逻辑的情况下,在源文件当中嵌入一些补充的信息。代码分析工具、开发工具、和...

2020-10-11 19:20:16 162

原创 深入泛型——擦除和转换

在严格的泛型代码当中,带泛型声明的类总应该带着类型参数。但为了与老的Java代码保持一致,也允许在使用带泛型声明的类时不指定实际类型。如果没有为这个泛型指定实际类型,此时被称为raw type(原始类型),默认时声明该泛型形参时指定的第一个上限类型。当一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被扔掉。比如一个List<String>类型被转换为List,则该List对集合元素的类型检查变成了泛型参数的上限(即Object) 。下面程序示范了这种擦除。

2020-09-09 20:35:54 132

原创 深入泛型—泛型方法

前面介绍了在定义类、接口时可以使用泛型形参,在该类的方法定义和成员变量定义、接口的方法定义中,这些泛型形参可以被当成普通类型来用。在另外一些情况下、定义类、接口时没有使用泛型形参,但定义方法时想自己定义泛型形参,这也是可以的。定义泛型方法假设需要这样的一个方法——该方法负责将数组中的所有元素全部添加到一个Collection集合里static void fromArrayToCollection(Object[] objects,Collection<Object> collection)

2020-09-05 10:44:21 322

原创 深入泛型—类型通配符

当使用一个泛型类的时候,应该为这个泛型类传入一个类型实参。如果没有传入类型实际参数,编辑器就会发出泛型警告。假设需要定义一个方法,该方法里有一个集合形参,集合形参里面的元素类型是不固定的,那该怎么定义呢?考虑如下代码:public void test(List c){ for(var i = 0; i < c.size(); i++ ){ System.out.println(c.get(i)); }}上述代码并没有错误,但是代码当中并没有为List指定泛型实参,所以上述代码将会引起

2020-08-25 20:27:57 235

原创 深入泛型(1)

所谓泛型,就是允许在定义类、接口、方法时使用类型形参,这个类型形参(或叫泛型)将在声明变量、创建对象、调用方法时动态的指定(即传入实际的类型参数,也可称为类型实参)。Java5 改写了集合框架中的全部接口和类,为这些接口类增加了泛型支持,从而可以在声明集合变量、创建集合对象的时候传入类型实参,这就是在前面程序中看到的List<String>和ArrayList<String>两种类型。...

2020-08-22 13:19:30 103

原创 操作集合的工具类:Collections类

Java提供了一个操作Set、List和Map等集合的工具类:Collections,该工具类提供了大量的方法对集合元素进行排序、查询和修改等操作,还提供了将集合元素设置为不可变、对集合对象实现同步控制等方法。排序操作Collections提供了如下的常用的类方法用于对List集合元素排序void reverse(List list):反转指定List集合中元素排序。void shuffle(List list):对List集合元素进行随机排序(模拟了洗牌动作)void sort(List li

2020-08-05 20:23:10 275

原创 HashSet和HashMap的性能指标

对于HashSet及其子类而言,它们采用hash算法来决定决定元素的存储位置,并通过hash算法来控制集合的大小;对于HashMap、Hashtable及其子类而言,他们采用hash算法来决定Map中的key的存储,并通过hash算法来增加key集合的大小。Hash表里可以存储元素的位置被称为“桶(bucket)”,在通常情况下,单个“桶”存储一个元素时,此时有最好的性能;hash算法通常可以根据hashCode值计算出“桶的存储位置”,接着从桶中取出元素。...

2020-07-30 19:57:53 455

原创 夯实基础——java基础学习(Map集合)

Map集合Map是一种用于保存具有映射结构的数据的数据结构,其基本元素是键对值。因此Map当中保存着两组值,一组值用于保存Map当中的key,另外一种值用于保存Map里的value。key和value都可以是任意的引用数据类型,但是,Map当中的key不允许重复。key和value总是存在着单向的一对一关系,即通过指定的key,总能找到对应的value。如果把map的两组值拆开来看,Map当中的key集合又组成了一个set集合(所有的key没有顺序,key之间不重复),实际上Map当中确实包含了一个ke

2020-07-29 21:10:09 223

原创 夯实基础——Java基础学习(Queue集合)

Queue集合Queue是一种模仿队列的数据结构实现,队列通常是指“先进先出”(FIFO)的容器。队列的头部保存在队列中存储时间最长的元素。队列的尾部通常保存存储时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作回返回队列头部的元素。通常,队列不允许随机访问队列中的元素。Queue接口定义了如下几个方法:void add(Object e):将指定元素加入队列的尾部Object element():获取队列头部的元素,但是不删除此元素boolean offer(Obj

2020-07-19 20:17:03 164

原创 夯实基础——Java基础学习(List 集合)

List集合List集合代表着这个有序的、可重复的集合,集合当中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。List集合默认按照元素的添加顺序设置索引。改进的List接口和ListIterator接口List作为Collection的子接口,可以使用Collection里面的所有方法。而且由于List是一个有序集合所以添加了一些根据索引操作的方法。void add(int index , Object element):将元素element添加

2020-07-04 19:41:59 123

原创 夯实基础(Java基础学习)——Set集合

Set集合Set集合类似于一个罐子,程序可以依次把多个对象“丢进去”Set集合,而Set集合通常不能记住元素的添加顺序。Set集合与Collection基本相同,没有提供任何额外的方法。实际上Set就是Collection,只是行为略有不同(Set不允许包含重复元素)。Set集合不允许包含相同的元素。如果试图把两个相同的元素添加进入set,则添加操作失败,add() 返回false,且新元素不会被加入。上面介绍的是Set集合的通用知识,因此完全适用后面介绍的HashSet、TreeSet和EnumSe

2020-07-01 20:47:19 222

原创 夯实基础(Java基础学习)—Collection和Iterator

Collection和IterationCollection接口是List、Set和Queue接口的父接口,该接口里面定义的方法既可以用于操作Set集合,也可以用于操作List和Queue集合。Collection接口里定义了如下操作集合元素的方法。boolean add(Object o):该方法是向集合里面添加一个元素。如果集合对象被添加操作改变了,则返回true。boolean addAll(Collection c):该方法把集合c里的所有元素添加到指定集合里。如果集合对象被添加操作改变了,

2020-06-23 14:26:57 233

原创 夯实基础 - java基础学习(对象和垃圾回收)

对象和垃圾回收Java的垃圾回收时Java语言的重要功能之一。当程序创建对象、数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区中,当这块内存不再被任何引用变量引用时,这块内存就会变成垃圾,等待垃圾回收机制进行回收。垃圾回收机制具有如下特征:垃圾回收机制只负责回收堆内存中的对象,不会回收任何物理资源(例如数据库连接、网络IO等资源)。程序无法精准空着垃圾回收的运行,垃圾回收会在何时的时候运行。当对象永久性地失去引用后,系统就会在合适的时候回收它所占的内存。在垃圾回收

2020-06-11 20:35:02 89

原创 夯实基础 - java基础学习- 枚举类

在某些情况下一个类的对象是有限而且固定的,比如一个季节类的对象只能是春夏秋冬。这种实例有限而且固定的类,在java里被称为枚举类。手动实现枚举类在早期代码当中,可能会直接通过简单的静态常量来表示枚举。public static final int SEASON_SPRING = 1;public static final int SEASON_SUMMER = 2;public static final int SEASON_FALL = 3;public static final int SE

2020-06-07 14:30:33 165

原创 夯实基础--Java基础学习(内部类)

内部类大多数时候,类被定义为一个独立的程序单元。在某些情况下,也会把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类。包含内部类的类也被称为外部类。内部类的作用主要如下:内部类提供了更好的封装,可以把内部类隐藏在外部类里面,不会被同一个包下面的其他类访问。内部类成员可以直接访问外部类的私有数据,因为内部类被当作其外部类的成员。同一个类的成员之间可以相互访问。但外部类不能访问内部类的实现细节,例如内部类的成员变量。匿名内部类适合用于创建那些仅需要创建一次的类。从语法角度来说,

2020-06-03 21:22:02 136

原创 夯实基础(java学习)- 抽象类和接口

抽象类当编写一些类的时候,都会定义一些方法,在某些情况下,某些父类只是知道子类应该包含某些方法,但是无法准确知道子类方法的实现方式。如图形类的计算周长方法,圆形和矩形拥有不同的计算方法。但是父类又必须定义一个这样的方法。此时我们可以使用方法来满足该要求。抽象方法和抽象类抽象方法和抽象类必须使用abstract修饰符来修饰,有抽象方法的类只能被定义为抽象类,抽象类里面可以没有抽象方法。抽象方法和抽象类的定义规则如下。抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修

2020-05-25 20:48:00 126

原创 夯实基础-java学习-final关键词

final修饰符final 关键词可用于修饰类、变量和方法,final关键字用于表示它修饰的类、方法和变量不可改变。final 修饰的变量如果获得了初始值就不可被改变,final就可以修饰成员变量也可以修饰局部变量、形参。final修饰变量final修饰成员变量final变量必须由程序员显示的指定初始值。归纳起来final修饰的成员变量和实例变量可以指定初始值的位置有以下位置:类变量: 静态初始化块中指定初始值或者声明该类变量的地方。(只能在其中之一)实力变量: 必须在非静态初始化块,构造方

2020-05-17 13:42:23 153

原创 夯实基础-java学习(面向对象下)--杂记

目录==与equals方法string对象的创建过程单例类final修饰符==与equals方法java当中判断两个对象是否相等总共有两种方法。分别为“==”方法和“equals”方法。当比较的两个对象都是基本数据类型时,只要两个值相同,则==就会返回true。但对于引用变量类型来说时,只有当两个变量都指向的是一个对象时 ==方法才会返回“true”。equals方法是object类提供的一个方法,但是直接使用这个方法的作用与使用==的结果是相同。 但是我们可以自定义这方法的实际作用。通常来说,正

2020-05-16 20:11:14 91

原创 夯实基础-java基础学习-初始化块

Java使用构造器来对单个对象进行初始化操作,使用构造器先完成整个java对象的状态初始化,然后将java对象返回给程序,从而让该java对象的信息更加完整。与构造器作用非常类似的是初始化块,它也可以完成java对象的初始化工作

2020-05-13 21:25:54 90

原创 夯实基础--java中的继承与多态机制(1)

类的继承类的继承依靠extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类。java当中每一个类只能继承一个父类,与C++不同。子类拓展了父类,大多数情况下子类是一个特殊的父类,子类总是以父类为基础,额外的增加方法和变量。但是有一种情况是例外就是子类的方法的覆盖重写父类的方法子类包含和父类同名的方法被称为方法的覆盖或者方法的重写(Override)。可以说子类覆盖父类的方...

2020-05-11 20:46:28 92

原创 夯实基础: java学习--变量的初始化和内存中的运行机制

成员变量的初始化和内存中的运行机制当系统加载类或者为该类创建实例的时候,系统自动为成员变量分配内存空间,并在分配内存之后。自动为成员变量指定初始值。//创建一个Person对象var p1=new Person();//创建第二个Person对象var p1=new Person();//分别为两个Person对象的name实例变量赋值p1.name="jack";p2.name=...

2020-03-23 21:18:08 203

原创 夯实基础,java学习(成员变量和局部变量)

在Java语言当中根据的定义变量位置的不同,可以将变量分为成员变量和局部变量两种变量。成员变量:成员变量就是指在类里面的定义的变量。局部变量:在方法里面定义的变量。不管是成员变量还是局部变量都应该遵从变量的定义规则。从语法角度来说只需要一个合法的标识符即可。成员变量成员变量分为实例变量和类变量。定义成员变量时没有static修饰的就实例变量。定义成员变量时由static修饰就是类变量...

2020-03-18 20:54:39 89

原创 夯实基础-java学习-形参个数可变的方法

形参个数可变的方法从JDK1.5开始java允许定义形参个数可变的参数。从而运行为方法指定数量不确定的形参。如果在定义方法的时候,在最后的一个形参类型后面添加三个点(…),则表明该形参可以接受多个参数值。下面展示一些 示例代码。public class App { public static void main(String[] args) { test("gpahu...

2020-03-17 20:30:08 110

原创 夯实基础-java学习--没有多维数组

没有多维数组Java 语言当中提供了支持了多维数组的方法。但是如果从java的底层运行机制来说-----没有多维数组根据数组定义语法,type[] array这是一个典型的以为数组的定义方法。,其中type是数组元素的类型,它可以是任何类型,当然也包括引用类型,所以当type类型是一个一维数组的时候,他就实现了二维数组的定义。所以当Java语言采用type[][] arrayname时,它实...

2020-03-17 20:10:50 105

原创 夯实基础-java深入数组

内存中的数据数组引用变量只是一个引用,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存之后,才可以通过该数组变量来访问数组元素。其实在java当中,引用变量是访问真实对象的根本方式。实际的数组对象被存储在堆内存当中(heap),如果引用该数组对象的数组引用变量是一个局部变量。那么他被存储在栈(stack)当中。如果堆内存当中的数据不在由栈内存当中的变量引用,则此块数据成为垃圾数...

2020-03-17 19:47:56 81

原创 轻量级JAVA EE 企业级应用学习(4)

JSP的基本原理JSP的本质是servlet,当用户指定servlet发送请求时,servlet利用输出流动态的生成HTML文件,包括每一个静态的HTML标签和所有在HTML页面中出现的内容由于包括大量的静态资源,导致开发servlet开发效率低下。所有的表现逻辑,包括布局,色彩和图像都必须耦合在java代码里面。JSP的出现弥补了这种不足。JSP在标准的html页面中嵌入java代码,其静...

2020-03-15 11:35:56 68

空空如也

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

TA关注的人

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