自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(91)
  • 问答 (1)
  • 收藏
  • 关注

原创 Java学习笔记:Lambda表达式(五)

Lambda强调的是“做什么”而不是“怎么做”,所以凡是可以根据上下文推导得知的信息,都可以省略。备注:掌握这些省略规则后,请对应地回顾本章开头的多线程案例。

2024-10-22 15:42:39 213

原创 Java学习笔记:Lambda表达式(四)

/ 第二个参数为排序规则,即Comparator接口实例。对数组中的Person对象使用Arrays的sort方法通过年龄进行升序排序。new Person("马尔扎哈", 20) };接口的实例(使用了匿名内部类)代表了“按照年龄从小到大”的排序规则。new Person("古力娜扎", 19),new Person("迪丽热巴", 18),new Person("古力娜扎", 19),new Person("迪丽热巴", 18),// 本来年龄乱序的对象数组。接口实例来指定排序的规则。

2024-10-22 15:42:05 638

原创 Java学习笔记:Lambda表达式(三)

另一方面,匿名内部类的语法——

2024-10-22 15:41:06 212

原创 Java学习笔记:Lambda表达式(二)

—这才是我们真正的目的。如果我们将关注点从“怎么做”回归到“做什么”的本质上,就会发现只要能够更好地达到目的,过程与形式其实并不重要。我们的真正目的是到达上海,而如何才能到达上海的形式并不重要,所以我们一直在探索有没有比高铁更好的方式——搭乘飞机。这段代码和刚才的执行效果是完全一样的,可以在1.8或更高的编译级别下通过。从代码的语义中可以看出:我们启动了一个线程,而线程任务的内容以一种更加简洁的形式被指定。不再有“不得不创建接口对象”的束缚,不再有“抽象方法覆盖重写”的负担,就是这么简单!

2024-10-22 15:39:44 199

原创 Java学习笔记:Lambda表达式(一)

在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿什么东西做什么事情”。相对而言,面向对象过分强调“必须通过对象的形式来做事情”,而函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。面向对象的思想:​ 做一件事情,找一个能解决这个事情的对象,调用对象的方法,完成事情.函数式编程思想:​ 只要能获取到结果,谁去做的,怎么做的都不重要,重视的是结果,不重视过程。

2024-10-22 15:38:49 252

原创 Java学习笔记:线程(五)

我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效果。今天我们就来详细讲解一下Java的线程池。

2024-10-22 15:35:46 595

原创 Java学习笔记:线程(四)

这是多个线程间的一种。

2024-10-22 15:34:16 892

原创 Java学习笔记:线程(三)

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中这个枚举中给出了六种线程状态:这里先列出各个线程状态发生的条件,下面将会对每种状态进行详细解析线程状态导致状态发生条件NEW(新建)线程刚被创建,但是并未启动。还没调用start方法。Runnable(可运行)线程可以在java虚拟机中运行的状态,可能正在运行自己代码,也可能没有,这取决于操作系统处理器。Blocked(锁阻塞)

2024-10-22 15:31:31 861

原创 Java学习笔记:线程(二)

如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。System.out.println(name + "正在卖:" + ticket--);// System.out.println(name+"正在卖:"+ticket--);同步方法 :使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。

2024-10-22 15:30:12 733

原创 Java学习笔记:线程(一)

同理,线程也是一样的,从宏观角度上理解线程是并行运行的,但是从微观角度上分析却是串行运行的,即一个线程一个线程的去运行,当系统只有一个CPU时,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度。在操作系统中,安装了多个程序,并发指的是在一段时间内宏观上有多个程序同时运行,这在单 CPU 系统中,每一时刻只能有一道程序执行,即微观上这些程序是分时的交替运行,只不过是给人的感觉是同时运行,那是因为分时交替运行的时间是非常短的。使用线程的内匿名内部类方式,可以方便的实现每个线程执行不同的线程任务操作。

2024-10-22 15:26:50 506

原创 Java学习笔记:集合类与常用数据结构的典型用法(十)

模拟斗地主洗牌发牌按照斗地主的规则,完成洗牌发牌的动作。组装54张扑克牌将54张牌顺序打乱三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。查看三人各自手中的牌、底牌,并按照牌的大小排序(代码二)规则:手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3。

2024-10-21 16:45:43 677

原创 Java学习笔记:集合类与常用数据结构的典型用法(九)

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射。Java提供了专门的集合类用来存放这种对象关系的对象,即接口。Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。Collection中的集合称为单列集合,Map中的集合称为双列集合。需要注意的是,Map。

2024-10-21 16:44:48 802

原创 Java学习笔记:集合类与常用数据结构的典型用法(八)

实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。String类实现了这个接口,并完成了比较规则的定义,但是这样就把这种规则写死了,那比如我想要字符串按照第一个字符降序排列,那么这样就要修改String的源代码,这是不可能的了,那么这个时候我们可以使用。说到排序了,简单的说就是两个对象之间比较大小,那么在JAVA中提供了两种比较实现的方式,一种是比较死板的采用。//以学生的年龄降序。

2024-10-21 16:43:31 861

原创 Java学习笔记:集合类与常用数据结构的典型用法(七)

是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。底层的实现其实是一个支持,由于我们暂时还未学习,先做了解。HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。hashCode与equals方法。我们先来使用一下Set集合存储,看下现象,再进行原理的讲解:Java12345678910111213141516//创建 Set集合//添加元素//遍历。

2024-10-21 16:42:18 830

原创 Java学习笔记:集合类与常用数据结构的典型用法(六)

LinkedList是List的子类,List中的方法LinkedList都是可以使用,这里就不做详细介绍,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以。LinkedList是一个双向链表,那么双向链表是什么样子的呢,我们用个图了解下。

2024-10-21 16:41:37 816

原创 Java学习笔记:集合类与常用数据结构的典型用法(五)

接口继承自Collection接口,是单列集合的一个重要分支,习惯性地会将实现了List接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。看完API,我们总结一下:它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。

2024-10-21 16:40:50 800

原创 Java学习笔记:集合类与常用数据结构的典型用法(四)

写程序这件事,和开车一样,经验可以起到很大作用,但如果你不知道底层是怎么工作的,就永远只能开车,既不会修车,也不能造车。每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。也就意味着,树的键值仍然是有序的。

2024-10-21 16:39:15 660

原创 Java学习笔记:集合类与常用数据结构的典型用法(三)

在前面学习集合时,我们都知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升成Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。大家观察下面代码:Java1234567891011121314//由于集合没有做任何限定,任何类型都可以给其中存放//需要打印每个字符串的长度,就要把迭代出来的对象转成String类型程序在运行时发生了问题。为什么会发生类型转换异常呢?

2024-10-21 16:37:46 934

原创 Java学习笔记:集合类与常用数据结构的典型用法(二)

在调用Iterator的next方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext方法返回false,表示到达了集合的末尾,终止对元素的遍历。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。

2024-10-21 16:36:42 728

原创 Java学习笔记:集合类与常用数据结构的典型用法(一)

在前面基础班我们已经学习过并使用过集合ArrayList ,那么集合到底是什么呢?集合:集合是java中提供的一种容器,可以用来存储多个数据。集合和数组既然都是容器,它们有啥区别呢?数组的长度是固定的。集合的长度是可变的。数组中存储的是同一类型的元素,可以存储基本数据类型值。集合存储的都是对象。而且对象的类型可以不一致。在开发中一般当对象多的时候,使用集合进行存储。

2024-10-21 16:31:03 848

原创 JVM笔记:运行时数据区-堆(堆是分配对象的唯一选择么)

在《深入理解Java虚拟机》中关于Java堆内存有这样一段描述:随着JIT编译期的发展与逃逸分析技术逐渐成熟,栈上分配、标量替换优化技术将会导致一些微妙的变化,所有的对象都分配到堆上也渐渐变得不那么“绝对”了。在Java虚拟机中,对象是在Java堆中分配内存的,这是一个普遍的常识。但是,有一种特殊情况,那就是如果经过逃逸分析(Escape Analysis)后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。这样就无需在堆上分配内存,也无须进行垃圾回收了。这也是最常见的。

2024-10-18 16:20:35 477

原创 JVM笔记:运行时数据区-堆(小结堆空间的参数设置)

在JDK6 Update24之后(JDK7),HandlePromotionFailure参数不会再影响到虚拟机的空间分配担保策略,观察openJDK中的源码变化,虽然源码中还定义了HandlePromotionFailure参数,但是在代码中已经不会再使用它。JDK6 Update24之后的规则变为==只要老年代的连续空间大于新生代对象总大小或者历次晋升的平均大小就会进行Minor GC,否则将进行Full GC。

2024-10-18 16:13:30 171

原创 JVM笔记:运行时数据区-堆 [为对象分配内存:TLAB(线程私有缓存区域)]

System.out.println("我只是来打个酱油~");* 测试-XX:UseTLAB参数是否开启的情况:默认情况是开启的。

2024-10-18 16:12:51 352

原创 JVM笔记:运行时数据区-堆(内存分配策略)

/ 新生代 20m ,Eden 16m, s0 2m, s1 2m。//Eden 区无法存放buffer 晋升老年代。/** 测试:大对象直接进入老年代。// 老年代 40m。

2024-10-18 16:11:52 269

原创 JVM笔记:运行时数据区-堆(堆空间分代思想)

为什么要把Java堆分代?不分代就不能正常工作了么。

2024-10-18 16:11:08 216

原创 JVM笔记:运行时数据区-堆(Minor GC、Major GC、Full GC)

JVM在进行GC时,并非每次都针对上面三个内存区域(新生代、老年代、方法区)一起回收的,大部分时候回收都是指新生代。针对hotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆收集(Full GC)

2024-10-18 16:10:36 500

原创 JVM笔记:运行时数据区-堆(图解对象分配过程)

为新对象分配内存是件非常严谨和复杂的任务,JVM的设计者们不仅需要考虑内存如何分配、在哪里分配的问题,并且由于内存分配算法与内存回收算法密切相关,所以还需要考虑GC执行完内存回收后是否会在内存空间中产生内存碎片。

2024-10-18 16:09:59 704

原创 JVM笔记:运行时数据区-堆(年轻代与老年代)

-XX:-UseAdaptiveSizePolicy :关闭自适应的内存分配策略 '-'关闭,'+'打开 (暂时用不到)其中年轻代可以分为Eden空间、Survivor0空间和Survivor1空间(有时也叫frmo区,to区)* -XX:SurvivorRatio :设置新生代中Eden区与Survivor区的比例。System.out.println("我只是来打个酱油~");* -XX:NewRatio : 设置新生代与老年代的比例。* -Xmn:设置新生代的空间的大小。

2024-10-18 16:08:23 437

原创 JVM笔记:运行时数据区-堆(设置堆内存大小与OOM)

Java堆区用于存储java对象实例,堆的大小在jvm启动时就已经设定好了,可以通过 “-Xmx”和 “-Xms”来进行设置一旦堆区中的内存大小超过 -Xmx所指定的最大内存时,将会抛出OOM异常==通常会将-Xms和-Xmx两个参数配置相同的值,其目的就是为了能够在java垃圾回收机制清理完堆区后不需要重新分隔计算堆区的大小,从而提高性能==默认情况下,初始内存大小:物理内存大小/64;最大内存大小:物理内存大小/4jps。

2024-10-18 16:07:41 790

原创 JVM笔记:运行时数据区-堆(核心概述)

一个进程对应一个jvm实例,一个运行时数据区,又包含多个线程,这些线程共享了方法区和堆,每个线程包含了程序计数器、本地方法栈和虚拟机栈。

2024-10-18 16:06:46 706

原创 JVM笔记:运行时数据区-方法区(方法区的垃圾回收)

有些人认为方法区(如Hotspot,虚拟机中的元空间或者永久代)是没有垃圾收集行为的,其实不然。《Java 虚拟机规范》对方法区的约束是非常宽松的,提到过可以不要求虚拟机在方法区中实现垃圾收集。一般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻。以前 Sun 公司的 Bug 列表中,曾出现过的若干个严重的 Bug 就是由于低版本的 Hotspot 虚拟机对此区域未完全回收而导致内存泄漏。方法区的垃圾收集主要回收两部分内容:常量池中废奔的常量和不再使用的类型。

2024-10-17 18:08:13 155

原创 JVM笔记:运行时数据区-方法区(方法区的演进细节)

从《Java 虛拟机规范》所定义的概念模型来看,所有 C1ass 相关的信息都应该存放在方法区之中,但方法区该如何实现,《Java 虚拟机规范》并未做出规定,这就成了一件允许不同虚拟机自己灵活把握的事情。staticObj随着Test的类型信息存放在方法区,instance0bj 随着Test的对象实例存放在Java堆,localobject则是存放在foo()方法栈帧的局部变量表中。测试发现:三个对象的数据在内存中的地址都落在Eden区范围内,所以结论:只要是对象实例必然会在Java堆中分配。

2024-10-17 18:07:19 648

原创 JVM笔记:运行时数据区-方法区(方法区的使用举例)

123456789int b = 50;Java123456789101112131415163 istore_16 istore_27 iload_18 iload_29 idiv18 iload_319 iload 421 iadd25 return。

2024-10-17 18:06:39 212

原创 JVM笔记:运行时数据区-方法区(方法区的内部结构)

深入理解Java虚拟机》书中对方法区存储内容描述如下:它用于存储已被虚拟机加载的==类型信息、常量、静态变量、即时编译器编译后的代码缓存等。

2024-10-17 18:05:50 1851

原创 JVM笔记:运行时数据区-方法区(3.设置方法区大小与OOM)

方法区的大小不必是固定的,jvm可以根据应用的需要动态调整。Java1234567* jdk7及以前:* 查询 jps -> jinfo -flag PermSize [进程id]* jdk8及以后:* 查询 jps -> jinfo -flag MetaspaceSize [进程id]

2024-10-17 18:04:08 785

原创 JVM笔记:运行时数据区-方法区(2. 方法区的理解)

java虚拟机规范》对如何实现方法区,不做统一要求。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:==元空间不再虚拟机设置的内存中,而是使用本地内存。在jdk8中,终于完全废弃了永久代的概念,改用与JRockit、J9一样在本地内存中实现的元空间(Metaspace)来代替。方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。根据《Java虚拟机规范》得规定,如果方法区无法满足新的内存分配需求时,将抛出OOM异常.

2024-10-17 18:03:38 270

原创 JVM笔记:运行时数据区-方法区(1. 堆、栈、方法区的交互关系)

从是否共享线程的角度。

2024-10-17 18:03:02 228

原创 JVM笔记:执行引擎

执行引擎是Java虚拟机的核心组成部分之一虚拟机是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。

2024-10-17 17:59:27 1876

原创 Java中的深拷贝和浅拷贝

而clone在第一步是和new相似的, 都是分配内存,调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。当改变 B.b 的值时,同时也会改变 A.b 的值,因为其实上面的例子中只是把 A.b 赋值给了 B.b,因为是 b 引用类型的,所以它们是指向同一个地址的。基础类型的拷贝,其中一个对象修改该值,不会影响另外一个(和浅拷贝一样)。

2024-10-17 17:56:32 799

原创 Java是值传递还引用传递

要讨论这个问题,我们先了解什么是值传递?是什么是引用传递?值传递:指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。引用传递:是指在调用函数时将实际参数的地址直接传递到函数中(的形参),那么在函数中对参数所进行的修改,将影响到实际参数。无论是基本类型和是引用类型,在实参传入形参时,都是值传递,也就是说传递的都是一个副本,而不是内容本身,所以Java是值传递。

2024-10-17 17:54:35 725

空空如也

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

TA关注的人

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