Java多线程
重头戏,多线程.
绪论线程与进程,并行与并发首先要理解进程(Processor)和线程(Thread)的区别
进程:启动一个LOL.exe就叫一个进程。 接着又启动一个DOTA.exe,这叫两个进程。
线程:线程是在进程内部同时做的事情,比如打开一个图片识别进程,先识别一张图片,再识别下一张这不是多线程,当同时进行时才是.
再补充点什么是并行和并发:
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。
并发的关键是你有处理多个任务的能力,不一定要同时。并行的关键是你有同时处理多个任务的能力。
吃饭的时候先接电话跟后接电话的比较更像是中断优先级高低的不同,并发应该是一手筷子,一手电话,说一句话,咽一口饭。 并行才是咽一口饭同时说一句话,而这光靠一张嘴是办不到的,至少两张嘴。
如果某个系统支持两个或者多个动作(Action)同时存在,那么这个系统就是一个并发系统。如果某个系统支持两个或者多个动 ...
Java聚合操作
在Java笔记11那篇中提到了聚合操作,但是没讲,这篇来看看.
传统方式与聚合操作方式遍历数据遍历数据的传统方式就是使用for循环,然后条件判断,最后打印出满足条件的数据:
1234for (Hero h : heros) { if (h.hp > 100 && h.damage < 50) System.out.println(h.name);}
使用聚合操作方式,画风就发生了变化:
12345 heros .stream() .filter(h -> h.hp > 100 && h.damage < 50) .forEach(h -> System.out.println(h.name));
Stream和管道的概念要了解聚合操作,首先要建立Stream和管道的概念
Stream和Collection结构化的数据不一样,Stream是一系列的元素,就像是生产线上的罐头一样,一串串的出来。
管道指的是一系列的聚合操作。
管道又分3个部分:
管道源:在这个例子里,源是一个L ...
Java泛型
在集合中,集合是不知道向里面添加的是什么的,为了通用性,全都作为Object,导致取出来后要进行强制类型转换.而泛型允许程序在创建集合时指定集合元素的类型.
泛型入门使用泛型1234567891011121314import java.util.ArrayList;/** * @author YL */public class TestGeneric { public static void main(String[] args) { ArrayList<String> strList = new ArrayList<String>(); strList.add("你好"); strList.add("再见"); strList.forEach(str -> System.out.println(str.length())); }}
上面程序成功创建了一个特殊的List集合:strList,这个List集 ...
JVM内存区域划分
本篇转载于https://www.cnblogs.com/dolphin0520/p/3613043.html
先了解了解,以后有空在钻研虚拟机问题.
学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢?
由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在讨论JVM内存区域划分之前,先来看一下Java程序具体执行的过程:
如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类加载器加载各个类的字节码文件,加载完毕之后,交由JVM执行引擎执行。在整个程序执行过程中,JVM会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被称作为Runtime Data Area(运行时数据区),也就是我们常说的JVM内存。因此,在Java中我们常常说到的内存管理就是针对这段空间进行管理(如何分配和回收内存空间)。
在知道了JVM内存是什 ...
探秘Java中String、StringBuilder以及StringBuffer
本篇转载于http://www.cnblogs.com/dolphin0520/p/3778589.html
一.你了解String类吗? 想要了解一个类,最好的办法就是看这个类的实现源代码,String类的实现在\jdk1.6.0_14\src\java\lang\String.java文件中。
打开这个类文件就会发现String类是被final修饰的:
123456789101112131415161718192021public final class String implements java.io.Serializable, Comparable<String>, CharSequence{ /** The value is used for character storage. */ private final char value[]; /** The offset is the first index of the storage that is used. */ private final int o ...
Java集合
本篇是Java笔记10的复习,顺便捎带了点数据结构中的链表和树.
ArrayList与数组的区别如果要存放多个对象,可以使用数组,但是数组有局限性.比如:声明长度是10的数组,不用的数组就浪费了,超过10的个数,又放不下.
为了解决数组的局限性,引入容器类的概念。最常见的容器类就是ArrayList容器的容量”capacity”会随着对象的增加,自动增长只需要不断往容器里增加英雄即可,不用担心会出现数组的边界问题。
常用方法:
add
有两种用法:
第一种是直接add对象,把对象加在最后面
heros.add(new Hero("hero " + i));
第二种是在指定位置加对象
heros.add(3, specialHero);
判断是否存在
通过方法contains判断一个对象是否在容器中
contains(Object o)
判断标准:是否是同一个对象,而不是name是否相同
获取指定位置的对象
get(int index)
通过get获取指定位置的对象,如果输入的下标越界,一样会报错
获取对象所处的位置
indexOf用于判断一个对象 ...
Java方法引用
了解下Lambda的兄弟:方法引用.我是真的觉得这些新特新一点每增加代码可读性,反而越来越难以理解了.
Java8之方法引用一、概述在学习lambda表达式之后,我们通常使用lambda表达式来创建匿名方法。然而,有时候我们仅仅是调用了一个已存在的方法。如下:
1Arrays.sort(stringsArray,(s1,s2)->s1.compareToIgnoreCase(s2));
在Java8中,我们可以直接通过方法引用来简写lambda表达式中已经存在的方法。
1Arrays.sort(stringsArray, String::compareToIgnoreCase);
这种特性就叫做方法引用(Method Reference)。
二、什么是方法引用 方法引用是用来直接访问类或者实例的已经存在的方法或者构造方法。方法引用提供了一种引用而不执行方法的方式,它需要由兼容的函数式接口构成的目标类型上下文。计算时,方法引用会创建函数式接口的一个实例。
当Lambda表达式中只是执行一个方法调用时,不用Lambda表达式,直接通过方法引用的形式可读性更高一些。 ...
Java正则表达式
测试内容测试内容测试内容测试内容测试内容
Java日期时间
日期类型,从1970年计,每过一毫秒就+1.不是+1s,所以也没法用膜法续命.
所有的数据类型,无论是整数,布尔,浮点数还是字符串,最后都需要以数字的形式表现出来。 日期类型也不例外,换句话说,一个日期,比如2020年10月1日,在计算机里,会用一个数字来代替。 那么最特殊的一个数字,就是零. 零这个数字,就代表Java中的时间原点,其对应的日期是1970年1月1日 8点0分0秒 。 (为什么是8点,因为中国的太平洋时区是UTC-8,刚好和格林威治时间差8个小时) 为什么对应1970年呢? 因为1969年发布了第一个 UNIX 版本:AT&T,综合考虑,当时就把1970年当做了时间原点。 所有的日期,都是以为这个0点为基准,每过一毫秒,就+1。
Java 日期时间java.util 包提供了 Date 类来封装当前的日期和时间。 Date 类提供两个构造函数来实例化 Date 对象。
第一个构造函数使用当前日期和时间来初始化对象。
1Date( )
第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。
1Date(long millisec)
...
Cpp位域
内存是以字节为单位进行编址的,编程语言的基本类型中,最小类型的长度一般也就是1个字节。然而,在解决某些问题时,必须要有二进制层面的表达手段,又或者某些情形下根本用不着1个字节,作为强大到令人窒息的C/C++,难道没有解决方法?其提供的完美解决方法就是位域(位段)结构,本文将从定义、说明、内存布局和使用这四个方面对它进行详细的介绍。
1. 位域定义首先,让我们看一下位域的定义。从定义中可以看出位域本质上其实就是结构体,只不过其成员都是按照特定长度的二进制位进行分配而已。
123456struct 位域结构体名{ 位域列表;};其中,位域列表为: 类型说明符 位域名: 长度; 组成
例如:
123456struct BitField{ unsigned char a : 2; // 第一个位域,2位 unsigned char b : 4; // 第二个,4位 unsigned char c : 2; // 第三个,2位};
2. 位域说明其次,我们来看一下位域的一些说明:
\1. 位域可以没有名字的,这时 ...