
- java8新写法

```java
//万能的list存储数据,利用反射存储数据
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
ArrayList
- 编码经验(if判断时应该要吧常量放前面)- Java集合类型主要有3种:set(集)、list(列表)和map(映射)- JAVA 2021 学习计划表- java集合类- 编码方式- 常用的Java工具库- 单元测试- JMX- JMS- 注解- Java序列化- java各种常用变量- 数据类型- byte- int- short- long- float- double- boolean- char- 枚举- EnumSet- EnumMap- Java IO&Java NIO,并学会使用- Java常用的关键字- 访问修饰符- 循环条件,控制流程<a name="VMYUg"></a># 工作日常代码记录2021.10.17List 排序<br />responses.sort(Comparator._comparing_(KoiReadingSequenceResponse::getReadSortNo));.reversed()倒序<br />RBAC权限模型---2021.10.18 postgreSQL<br />postgreSQL为基础的对象关系型数据库管理系统<a name="T39nD"></a>## postgis扩展进入postgresql数据库,增加postgis扩展<br />//添加空间数据库的相关插件<br />CREATE EXTENSION postgis;//用于创建空间数据库的插件,仅支持矢量数据扩展<br />CREATE EXTENSION address_standardizer;//使空间数据库支持地址标准化<br />CREATE EXTENSION ogr_fdw;//使空间数据库支持不同数据库之间的跨库操作<br />CREATE EXTENSION pgrouting;//使空间数据库支持网络分析<br />CREATE EXTENSION pointcloud;//使空间数据库支持点云数据存储<br />CREATE EXTENSION pointcloud_postgis;//使空间数据库支持点云数据操作<br />CREATE EXTENSION postgis_raster;//使空间数据库支持栅格数据扩展<br />CREATE EXTENSION postgis_sfcgal;//使空间数据库支持2D和3D的数据操作<br />CREATE EXTENSION fuzzystrmatch;//使空间数据库支持地理编码的模糊匹配<br />CREATE EXTENSION postgis_tiger_geocoder;//使空间数据库支持地理编码<br />CREATE EXTENSION postgis_topology;//使空间数据库支持拓扑检查<br />//移除相关插件<br />DROP EXTENSION 插件名称;<br />例:DROP EXTENSION postgis;<br />//更新插件<br />ALTER EXTENSION 插件名称 update to "版本号";<br />例:ALTER EXTENSION postgis update to "3.0.1";<br />安装 <br />postgres:[http://pan.baidu.com/s/1o69WORK](http://pan.baidu.com/s/1o69WORK)<br />postgres空间扩展:[http://pan.baidu.com/s/1c0fPfpe](http://pan.baidu.com/s/1c0fPfpe)<a name="sjefb"></a>## WKT定义几何对象格式POINT(0 0) ——点<br />LINESTRING(0 0,1 1,1 2) ——线<br />POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1)) ——面<br />MULTIPOINT(0 0,1 2) ——多点<br />MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4)) ——多线<br />MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1))) ——多面<br />GEOMETRYCOLLECTION(POINT(2 3),LINESTRING((2 3,3 4))) ——几何集合<a name="FmaJr"></a>## 常用函数添加几何字段 AddGeometryColumn(模式(public),表名,几何字段名,srid(如4490),type ,2维/3维 )<br />删除几何字段 DropGeometryColumn(模式(public),表名 , 几何字段名)<br />更改空间列坐标系 UpdateGeometrySRID(模式(public),表名 , 几何字段名,目标srid(如4549));<a name="F3iMf"></a>## 几何对象关系函数获取两个几何对象间的距离 ST_Distance(geometry, geometry)<br />如果两个几何对象间距离在给定值范围内,则返回true ST_DWithin(geometry, geometry, float)<br />判断两个几何对象是否相等(比如LINESTRING(0 0, 2 2)和LINESTRING(0 0, 1 1, 2 2)是相同的几何对象) ST_Equals(geometry, geometry)<br />判断两个几何对象是否分离 ST_Disjoint(geometry, geometry)<br />判断两个几何对象是否相交 ST_Intersects(geometry, geometry)<br />判断两个几何对象的边缘是否接触 ST_Touches(geometry, geometry)<br />判断两个几何对象是否互相穿过 ST_Crosses(geometry, geometry)<br />判断A是否被B包含 ST_Within(geometry A, geometry B)<br />判断两个几何对象是否是重叠 ST_Overlaps(geometry, geometry)<br />判断A是否包含B ST_Contains(geometry A, geometry B)<br />判断A是否覆盖 B ST_Covers(geometry A, geometry B)<br />判断A是否被B所覆盖 ST_CoveredBy(geometry A, geometry B)<br />通过DE-9IM 矩阵判断两个几何对象的关系是否成立 ST_Relate(geometry, geometry, intersectionPatternMatrix)<br />获得两个几何对象的关系(DE-9IM矩阵) ST_Relate(geometry, geometry)<a name="QhHyr"></a>## 几何对象处理函数获取几何对象的中心 ST_Centroid(geometry)<br />面积量测 ST_Area(geometry)<br />长度量测 ST_Length(geometry)<br />返回曲面上的一个点 ST_PointOnSurface(geometry)<br />获取边界 ST_Boundary(geometry)<br />获取缓冲后的几何对象 ST_Buffer(geometry, double, [integer])<br />获取多几何对象的外接对象 ST_ConvexHull(geometry)<br />获取两个几何对象相交的部分 ST_Intersection(geometry, geometry)<br />将经度小于0的值加360使所有经度值在0-360间 ST_Shift_Longitude(geometry)<br />获取两个几何对象不相交的部分(A、B可互换) ST_SymDifference(geometry A, geometry B)<br />从A去除和B相交的部分后返回 ST_Difference(geometry A, geometry B)<br />返回两个几何对象的合并结果 ST_Union(geometry, geometry)<br />返回一系列几何对象的合并结果 ST_Union(geometry set)<br />用较少的内存和较长的时间完成合并操作,结果和ST_Union相同 ST_MemUnion(geometry set)<a name="hWX3o"></a>## 几何对象存取函数获取几何对象的WKT描述 ST_AsText(geometry)<br />获取几何对象的WKB描述 ST_AsBinary(geometry)<br />获取几何对象的空间参考ID ST_SRID(geometry)<br />获取几何对象的维数 ST_Dimension(geometry)<br />获取几何对象的边界范围 ST_Envelope(geometry)<br />判断几何对象是否为空 ST_IsEmpty(geometry)<br />判断几何对象是否不包含特殊点(比如自相交) ST_IsSimple(geometry)<br />判断几何对象是否闭合 ST_IsClosed(geometry)<br />判断曲线是否闭合并且不包含特殊点 ST_IsRing(geometry)<br />获取多几何对象中的对象个数 ST_NumGeometries(geometry)<br />获取多几何对象中第N个对象 ST_GeometryN(geometry,int)<br />获取几何对象中的点个数 ST_NumPoints(geometry)<br />获取几何对象的第N个点 ST_PointN(geometry,integer)<br />获取多边形的外边缘 ST_ExteriorRing(geometry)<br />获取多边形内边界个数 ST_NumInteriorRings(geometry)<br />同上 ST_NumInteriorRing(geometry)<br />获取多边形的第N个内边界 ST_InteriorRingN(geometry,integer)<br />获取线的终点 ST_EndPoint(geometry)<br />获取线的起始点 ST_StartPoint(geometry)<br />获取几何对象的类型 GeometryType(geometry)<br />类似上,但是不检查M值,即POINTM对象会被判断为point ST_GeometryType(geometry)<br />获取点的X坐标 ST_X(geometry)<br />获取点的Y坐标 ST_Y(geometry)<br />获取点的Z坐标 ST_Z(geometry)<br />获取点的M值 ST_M(geometry)<a name="z686p"></a>## 几何对象构造函数参考语义:<br />Text:WKT<br />WKB:WKB<br />Geom:Geometry<br />M:Multi<br />Bd:BuildArea<br />Coll:Collection<br />ST_GeomFromText(text,[])<br />ST_PointFromText(text,[])<br />ST_LineFromText(text,[])<br />ST_LinestringFromText(text,[])<br />ST_PolyFromText(text,[])<br />ST_PolygonFromText(text,[])<br />ST_MPointFromText(text,[])<br />ST_MLineFromText(text,[])<br />ST_MPolyFromText(text,[])<br />ST_GeomCollFromText(text,[])<br />ST_GeomFromWKB(bytea,[])<br />ST_GeometryFromWKB(bytea,[])<br />ST_PointFromWKB(bytea,[])<br />ST_LineFromWKB(bytea,[])<br />ST_LinestringFromWKB(bytea,[])<br />ST_PolyFromWKB(bytea,[])<br />ST_PolygonFromWKB(bytea,[])<br />ST_MPointFromWKB(bytea,[])<br />ST_MLineFromWKB(bytea,[])<br />ST_MPolyFromWKB(bytea,[])<br />ST_GeomCollFromWKB(bytea,[])<br />ST_BdPolyFromText(text WKT, integer SRID)<br />ST_BdMPolyFromText(text WKT, integer SRID)<a name="WTsko"></a>## 测试创建一张测试表<br />CREATE TABLE test2( id int4, name varchar(255))增加geometry类型字段SELECT AddGeometryColumn ('public','test2', 'the_geom', 4326, 'POINT', 2);<br />或者<br /> CREATE TABLE 表名 ( id SERIAL PRIMARY KEY, name VARCHAR, the_geom geometry(表名,srid-4326), the_geom_2 geometry(表名,srid-4490) );<br />删除空间列:<br />SELECT DropGeometryColumn('public', 'test2', 'the_geom');<br />查询空间列the_geom的坐标系(srid):<br />SELECT Find_SRID('public', 'point', 'the_geom');<br />更改空间列the_geom_2坐标系<br />SELECT UpdateGeometrySRID('public','point','the_geom_2',4549);<br />插入数据<br />INSERT INTO test1 (id, the_geom, name) VALUES (1,ST_GeomFromText('POINT(-0.1257 51.508)',4326),'London, England');INSERT INTO test1 (id, the_geom, name) VALUES (2,ST_GeomFromText('POINT(-81.233 42.983)',4326),'London, Ontario');INSERT INTO test1 (id, the_geom, name) VALUES (3,ST_GeomFromText('POINT(27.91162491 -33.01529)',4326),'East London,SA');<br />在指定范围内<br />select count(*) from poi5 a,poi5 b where st_within(b.the_geom,st_buffer(a.the_geom,0.001));select count(*) from poi5 a,poi5 b where st_dwithin(b.the_geom,a.the_geom,0.001);<br />获取几何对象的中心<br />SELECT astext(ST_Centroid(the_geom)) FROM country;<br />面积量测<br />SELECT st_area(the_geom) FROM china where name='丰台区' ;<br />长度量测<br />SELECT st_length(the_geom) FROM china WHERE name='海淀区';<a name="eWpkd"></a>## Reference[http://postgis.net/docs/postgis_installation.html#make_install_postgis_extensions](http://postgis.net/docs/postgis_installation.html#make_install_postgis_extensions)<br />[http://postgis.net/docs/reference.html#Spatial_Relationships_Measurements](http://postgis.net/docs/reference.html#Spatial_Relationships_Measurements)<br />[https://blog.csdn.net/aliasone/article/details/80549095](https://blog.csdn.net/aliasone/article/details/80549095)<br />[https://blog.csdn.net/qq_42158942/article/details/107106726](https://blog.csdn.net/qq_42158942/article/details/107106726)<br />[https://www.cnblogs.com/ytwy/p/6826549.html](https://www.cnblogs.com/ytwy/p/6826549.html)---clickhouse 创建标的代码```javaCREATE TABLE magpie.mp_daq (id UInt64,meter_id Nullable(UInt64),instantaneous_flow Nullable(Decimal(10, 2)),net_flow Nullable(Decimal(10, 2)),positive_flow Nullable(Decimal(10, 2)),negative_flow Nullable(Decimal(10, 2)),meter_voltage Nullable(Decimal(10, 2)),collect_voltage Nullable(Decimal(10, 2)),remark Nullable(String),create_time DateTime64,creator_id Nullable(UInt64),update_time Nullable(DateTime64),updater_id Nullable(UInt64),flag Nullable(UInt16),dept_id Nullable(UInt64),partition_code String,pressure Nullable(Decimal(10, 2)),factory_code Nullable(String),factory_name Nullable(String),user_code Nullable(String),meter_code Nullable(String))ENGINE = MergeTreePARTITION BY partition_codeORDER BY idSETTINGS index_granularity = 8192
1.运行代码——是的,这是阅读代码的第一步。这可能不会给你过多关于项目的细节,但是,你将知道如何构建它并运行它,你将了解它使用的库、它所依赖的开发框架等等,这是提高你对某个特定项目理解的好方法。如果你想编写与你正在探究的特定项目类似的自己的软件,你可能会对你应该使用的框架或库有一些想法。
2.找到高层次的逻辑——当你开始阅读一个项目的代码时,你可能会陷入到每一个细节当中。这是有问题的,相反的,你应该专注于高层次的结构。要找到切入点,并从那里开始,大部分的软件项目都有一个主要的方法,就从那里开始。此外,如果这是一个web应用程序,请开始查看不同的包,比如业务逻辑存放在何处、UI代码保存在哪里、控制器在何处等等。大致来说,就是浏览整个项目并获得一个基本的想法,然后问自己想专注于什么地方,就先从那个部分读起。你可以不读完整的代码库,而只是读它可能会引起你兴趣的一部分。当你找到你的切入点,你可以通过方法调用,看它引领你到何处,从而了解项目的业务逻辑。
3.使用/了解工具——有很多工具可以用来阅读和探究源代码,有助于可视化代码。例如,IntelliJIdea工具具有导航源代码的功能,允许你通过单词、单词的一部分,甚至是单词的缩写来搜索。你也应该学习键盘快捷键。用鼠标导航源代码可能会相当枯燥和缓慢,用键盘快捷键可以更快地跳转。你可以快速地从源代码的一部分跳转到另外一部分。
还有一个阅读代码的好软件,叫Sourcegraph,这是由两个斯坦福大学的毕业生创建的,他们是Quinn Slack 和 Beyang Liu,他们在花费时间去查看缺少文档说明的代码以后,决定开发一个工具来帮助他们更好地阅读和理解代码。
4.了解语言/约定——深入了解某个特定语言有助于提高代码阅读技能。每种语言都有自己的一套约定、样式和语法。这些知识帮助你快速地熟悉一个特定的代码。例如,在java语言中,方法名以小写字母开头,而在C#语言中,方法名以一个大写字母开头。知道这个区别可以帮助你从源代码中识别方法。
5.阅读最佳实践/设计模式——你正在阅读的代码,或者它的某个结构,可能看起来很晦涩,或者你可能不熟悉它,这是很自然的。有许多良好的实践和设计模式,人们用它来正确地和最佳地做事。例如,有一种模式称为Singleton,它的构造函数保持私有。你可能会问,究竟为什么有人想保持构造函数私有呢。我一直认为它是公有的,否则,我如何创建一个类的实例。嗯,这背后有一个原因。Singleton模式防止你不止一次地实例化一个类,其中有许多实际的应用案例。如果你了解这种模式,你就不会为此而头撞南墙了。因此,对于某些模式的了解,例如,Gang of Four(Erich Gamma, Richard Helm, Ralph Johnson,John Vlissides软件设计领域的四位世界顶级大师.)有23种有文档说明的设计模式,可以显著地帮助你提高代码阅读能力。
6.代码审查——软件开发是一个非常讲究协作的工作。没有人可以单独构建一个大型的或重要的软件。每个软件都是由一个团队构建的。在一个团队中,每个人都贡献自己的一份力量去塑造这个项目。在项目结束的那一天,每个人的贡献都会合并成一份对用户真正有价值的工作。除了做实际的编码以外,现在每一个团队都有另外一种做法,那就是在进行观察、建议和相互学习时,互相审查对方的代码。这是一个构建代码库知识的强有力的工具,在团队中建立牢固的纽带,提高代码质量,从而减少系统中的错误,并使客户满意。
做代码检查,你不得不阅读团队中其他人的代码,最终会提高你的代码阅读能力。
7.临时重构——临时重构也可以帮助您提高代码阅读技能。你可以找取一段长的方法代码,然后不断地把方法细分成多个部分。持续分解,直到你了解这一大段方法代码背后真正的意义。之后,你可以对这些方法做些注释,然后回滚这些更改。
这可以帮助你理解方法的架构,也可以增加你代码重构的知识。
所有的知识要做到先会用在研究多去写代码
概念
操作集合的常用方法 :理解为对象的一个容器,实现了对对象的一些操作,集合和数组的区别,
集合和数组的 区别
数组:可以存储基本类型和引用类型,的长度定义好不能被改(数组是一个连续的空间)
集合:只能存储引用类型,集合可以通过装箱来存储基本数据类型
List
1.1ArrayList:更适合于访问,底层数组实现有序有下标,(添加元素后集合默认容量是10,没有添加元素他的默认容量是0,每次扩容一点五倍)
LinkedList:更适合于插入和删除,底层双向链表实现
List<String> list=new ArrayList<>()
list.subList(int fromIndex, int toIndex) :分割集合 返回两个下标之间的元素
• fromIndex - 截取元素的起始位置,包含该索引位置元素
• toIndex - 截取元素的结束位置,不包含该索引位置元素
list.add():添加
list.clear():清空集合
list.size():集合的数量
list.toString():将集合转换为对象字符串
list.get(int index):获取下标
list.set(int a,"需要修改的值"):a是需要修改元素的下标
list.remove(int index):删除下标的元素
Collections.sort(lsit):集合字母排序
Collections.max(list):取出集合最大值
Collections.min(list):取出集合最小值
| add() | 将元素插入到指定位置的 arraylist 中 |
|---|---|
| addAll() | 添加集合中的所有元素到 arraylist 中 |
| clear() | 删除 arraylist 中的所有元素 |
| clone() | 复制一份 arraylist |
| contains() | 判断元素是否在 arraylist |
| get() | 通过索引值获取 arraylist 中的元素 |
| indexOf() | 返回 arraylist 中元素的索引值 |
| removeAll() | 删除存在于指定集合中的 arraylist 里的所有元素 |
| remove() | 删除 arraylist 里的单个元素 |
| size() | 返回 arraylist 里元素数量 |
| isEmpty() | 判断 arraylist 是否为空 |
| subList() | 截取部分 arraylist 的元素 |
| set() | 替换 arraylist 中指定索引的元素 |
| sort() | 对 arraylist 元素进行排序 |
| toArray() | 将 arraylist 转换为数组 |
| toString() | 将 arraylist 转换为字符串 |
| ensureCapacity () |
设置指定容量大小的 arraylist |
| lastIndexOf() | 返回指定元素在 arraylist 中最后一次出现的位置 |
| retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
| containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
| trimToSize() | 将 arraylist 中的容量调整为数组中的元素个数 |
| removeRange() | 删除 arraylist 中指定索引之间存在的元素 |
| replaceAll() | 将给定的操作内容替换掉数组中每一个元素 |
| removeIf() | 删除所有满足特定条件的 arraylist 元素 |
| forEach() | 遍历 arraylist 中每一个元素并执行特定操作 |
1.2(list集合的用法)list.stream().collect(Collectors.groupingBy(MpMeterQueryNavy::getStampno));:判断集合里重复的元素List list = Arrays.asList("123", "456", "789");
遍历集合的数据
会放一个我写的一个demo的链接:for (String s : list) {对集合里面数据的一些常规操作}
判断集合包含
//查看当前集合是否包含给定的元素
boolean contains(Object o);
boolean a = list.contains(o);
//返回boolean类型值
list.contains(list.get(index));
//list2的元素是否都存在list1中
list1.containsAll(list2);
//正序:
list.stream().sorted().collect(toList());
//倒序
list.stream().sorted(Comparator.reverseOrder()).collect(toList());
//分割
list:list.subList()
把大于一千的list分割为以前次操作一次int toIndex = 1000;int changeLogSize = meterList.size();for (int i = 0; i < changeLogSize; i += 1000) {if (i + 1000 > changeLogSize) {toIndex = changeLogSize - i;}mpMeterList = meterList.subList(i, i + toIndex);
List接口实现类
| 操作 | 方法(与接口Collection相同的不再写出) |
|---|---|
| 增 | add(E e)、add(int index, E element)、 addAll(Collection<? extends E> c)、 addAll(int index, Collection<? extends E> c) |
| 删 | remove(int index) |
| 查 | get(int index)、indexOf(Object o)、lastIndexOf、 lastIndexOf(Object o) |
| 其他 | subList(int fromIndex, int toIndex) |
| 遍历 | listIterator()、listIterator(int index) |
| 改 | set(int index, E element) |
Collection接口(属于父级接口)常用方法
概念:
| 操作 | 方法 |
|---|---|
| 增 | add(E e):添加一个对象、addAll(Collection<? extends E> c):将一个集合中的所有对象添加到集合中、 |
| 删 | clear()、remove(Object o)、removeAll(Collection<?> c)、retainAll(Collection<?> c)、 |
| 查 | contains(Object o):判断集合是否包含一个对象、containsAll(Collection<?> c)、equals(Object o)、isEmpty()、size() |
| 其他 | hashCode()、 |
| 遍历 | iterator()、foreach |
迭代器
//迭代器用法
Collection sites = new ArrayList<String>();
//第二种遍历方式 迭代器
Iterator iterator = sites.iterator();
//如果有下一个元素就遍历没有就退出 判断是否有这个元素,如果有就吧元素取出来,如果集合有空就返回false
iterator.hasNext();
//获取下一个元素
iterator.next();
//在迭代器 迭代遍历中不能 使用删除方法 删除元素
iterator.remove();
Object next = iterator.next();
while (iterator.hasNext()) {
System.out.println("迭代器遍历 = " + next); }
System.out.println("next = " + next);
/
Map
特点:键不能重复,值可以重复
链表是什么:链表是一个连续的空间如果删除一个元素的话直接修改指针就行
底层是:链表散列,即数组和链表的结合体。
HashMap:非线程安全的,如果想用线程安全的可以使用Collections.synchronizedMap,常用的是ConcurrentHashMap具有线程安全的hashMap();
线程安全的map
1.ConcurrentHashMap:对每个hash进行了按照(segment)数据空间分段在每个数据空间都加了锁 称为锁分段
锁分段:将锁分解技术,进一步扩展为,对一组独立的对象,上的锁进行分解
用法new ConcurrentHashMap<>();
2.synchronizedMap:通过synchronized关键字进行同步控制
所有单个操作都是线程安全的,但是多个操作会组长操作序列可能会导致数据争用
具有线程安全但是效率低
用法Collections.synchronizedMap(new HashMap<>());
(Map 接口四种类型的方法):put、remove、get、containsKey
HashMap<Integer, String> map = new HashMap<>();
map.put();//存储键值对,返回值是 值的类型
V put(K key, V value);//存储需要简直类型对应
map.containsKey();//通过键得到值,返回值是一个boolean
map.get();//得到键,返回的是键映射的值如果包含映射关系返回null

map.remove();//map中有两个删除方法
V remove(Object key);//已键为参数删除
default boolean remove(Object key, Object value)//方法必须键和值都要对应方可删除
2.0 (map 的长用方法)
map .put(1, "小花");
map .put(2, "中花");
map .put(3, "大花");
map .size();//查看map中的元素数量
Collection<String> values = map .values();//遍历map中的所有元素
//判断一个集合和一个值是否有相同的值
Map<String, List<MpMeterQueryNavy>> collect =mpMeterQueryNavyList.stream().collect(Collectors.groupingBy(MpMeterQueryNavy::getStampno));
//用查看重复的值分组
List<MpMeterQueryNavy> queryNavies =collect.get(meter.getCode());
//判断qureyNavies非空就可以查出分组后的值了
//map缓存
public static Map<Long, List<Dog>> cache = new HashMap<>();
Java常用工具库
1.
工具类StringUtils :
// 如果字符串都是空格的话,
StringUtils.isBlank(" ") = true;
StringUtils.isEmpty(" ") = false;
Set
特点(Map,Set的实现类都是基于Map来实现的,HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,LinkedHashSet是通过LinkedHashMap来实现的 )
特点不允许出现重复元素 无重复
不保证集合中元素的顺序 无序没有下标
允许包含值为null的元素,但最多只能有一个null元素
HashSet(使用哈希表实现的)
HashSet这个类实现了Set集合,实际为一个HashMap的实例。
set就是重写了equals ,a1.equals(a2)来判断重复的
set集合由set接口和set实现类组成(LinkedHashSet父类是HashSet,存取有序,元素不能重复)
hashSet存储值的时候会调用equals来判断,
遍历(迭代器,增强for)
TreeSet(使用(红黑树)(二叉树查找树)实现的)
遍历(增强for,迭代器)
TreeSet:实现排序
LinkedHashSet
linkedHashSet是一个非线程安全的集合,LinkedHashSet是一个哈希表和链表的结合,且是一个双向链表。
ConcurrentSkipListSet
CopyOnWriteArraySet
Java8
Java8 用法(并行流**parallelStream(),串行流stream()**)
串行流stream()
常用的事串行流(数据来源可以事,集合,数组,io,channel,生产器generator)
语法
Filter:中间操作,接受一个Boolean类型的变量,并将所有流对象中的元素进行过滤。collection.stream().filter(person -> "男".equals(person.getGender())
根据条件过滤studentList.stream().filter(s->s.getGender() && s.getHeight() >= 1.8).collect(Collectors.toList());
Sorted:是一个中间操作,能够返回一个排过序的流对象的视图。可指定排序规则!默认正序,逆序
并行流parallelStream()
Java高级用法知识复习
1.string的常用方法
String a=(只要右边是常量的就在常量池里面找没有的话就造一个,如果右边是有变量的就是在堆里面new一个)
和长度有关的方法
返回类型 方法名 作用
int length() 得到一个字符串的字符个数(一个中文是一个字符,一个英文是一个字符,一个转义字符是一个字符)
和数组有关的方法
返回类型 方法名 作用
byte[] getBytes() 将一个字符串转换成字节数组
char[] toCharArray() 将一个字符串转换成字符数组
String[] split(String) 将一个字符串按照指定内容劈开
和判断有关的方法
返回类型 方法名 作用
boolean equals(String) 判断两个字符串的内容是否一模一样
boolean equalsIgnoreCase(String) 忽略大小写的比较两个字符串的内容是否一模一样
boolean contains(String) 判断一个字符串里面是否包含指定的内容
boolean startsWith(String) 判断一个字符串是否以指定的内容开头
boolean endsWith(String) 判断一个字符串是否以指定的内容结尾
和改变内容有关的方法
和改变内容有关的方法,都不会直接操作原本的字符串 而是将符合条件的字符串返回给我们,所以注意接收
返回类型 方法名 作用
String toUpperCase() 将一个字符串全部转换成大写
String toLowerCase() 将一个字符串全部转换成小写
String replace(String,String) 将某个内容全部替换成指定内容
String replaceAll(String,String) 将某个内容全部替换成指定内容,支持正则
String repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容
String substring(int) 从指定下标开始一直截取到字符串的最后
String substring(int,int) 从下标x截取到下标y-1对应的元素 String trim() 去除一个字符串的前后空格
和位置有关的方法
返回类型 方法名 作用
char charAt(int) 得到指定下标位置对应的字符
int indexOf(String) 得到指定内容第一次出现的下标
int lastIndexOf(String) 得到指定内容最后一次出现的下标
容易搞错的逻辑运算符(if逻辑判断)
| 符 | 用法 | 含义 | 说明 | 实例 | 结果 |
|---|---|---|---|---|---|
| && | a&&b | 短路与 | ab 全为 true 时,计算结果为 true,否则为 false。 | 2>1&&3<4 | true |
| || | a||b | 短路或 | ab 全为 false 时,计算结果为 false,否则为 true。 | 2<1||3>4 | false |
| ! | !a | 逻辑非 | a 为 true 时,值为 false,a 为 false 时,值为 true | !(2>4) | true |
| | | a|b | 逻辑或 | ab 全为 false 时,计算结果为 false,否则为 true | 1>2|3>5 | false |
| & | a&b | 逻辑与 | ab 全为 true 时,计算结果为 true,否则为 false | 1<2&3<5 | true |
- && 与 & 区别:如果 a 为 false,则不计算 b(因为不论 b 为何值,结果都为 false)
- || 与 | 区别:如果 a 为 true,则不计算 b(因为不论 b 为何值,结果都为 true)
注意:短路与(&&)和短路或(||)能够采用最优化的计算方式,从而提高效率。在实际编程时,应该优先考虑使用短路与和短路或。
结果为 boolean 型的变量或表达式可以通过逻辑运算符结合成为逻辑表达式。逻辑运算符 &&、|| 和 !按表 2 进行逻辑运算。
Java 并行,并发
并行,并发(并行并发 不是线程安全的)
含义:并发(交替执行),,,并行(两个以上同时发生)
线程,线程是进程中的执行单元(一个进程可以包含多个线程)
定义:进程定义(进入到内存的程序叫进程,一个内存中的应用程序)
函数式接口
函数试接口的定义:有且只有一个抽象方法的接口
