Java特殊字符串分隔
首先看一段代码:
1 | String[] splitArr = "1|23242|3|4".split("|"); |
输出结果是:
1 | 1 |
在Java中有三个特殊字符:.
,\
,|
,这几个字符分割的时候,需要用\\
进行转义.
正确的代码如下:
1 | String[] splitArr = "1|23242|3|4".split("\\|"); |
首先看一段代码:
1 | String[] splitArr = "1|23242|3|4".split("|"); |
输出结果是:
1 | 1 |
在Java中有三个特殊字符:.
,\
,|
,这几个字符分割的时候,需要用\\
进行转义.
正确的代码如下:
1 | String[] splitArr = "1|23242|3|4".split("\\|"); |
今天学习了python的list和tuple的使用,python中的数组类型的结构比其他语言更为灵活,下面我们说说他们的用法:
定义一个list
1 | >>> arr=[1,2,3,4,5,6] |
arr
就是定义的数组,使用索引来获得数组里面的数据如:arr[0],arr[1]
等等,在python数组有一个特殊的用法,使用-1,-2
可以取倒数第一或第二的值。
1 | >>> arr[0] |
如果超出界限,会抛出异常:
1 | Traceback (most recent call last): |
由于python是弱类型的语言,所以数组里面可以存储不同类型的数据:
1 | >>> arr=[1,2,"hello",[1,2,34]] |
如果想拿到34
这个值,可以类似二维数组那样arr[3][2]
可以使用range
函数快速定义个有序的数组:
1 | >>> list(range(10)) |
range
的具体的使用方法range(start, stop[, step])
。
range(1,10,2)
代表的从1-10
每次长度的2
数组的相关的函数
len
获得数组的长度
1 | >>> len(arr) |
append
增加一个元素
1 | >>> arr.append("1111") |
insert
插入数据
1 | >>> arr.insert(1,213) |
insert(1,213)
代表在1
位置,插入一个213
的数字
- `pop`删除元素
`pop`是`python`中删除元素的方法,`arr.pop()`默认删除最后一个元素,`arr.pop(i)`代表可以删除指定位置的元素:
1
2
3
4
5
>>> arr.pop()
'1111'
>>> arr
[1, 213, 2, 'hello', [1, 2, 34]]
>>>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> arr.pop(1)
213
>>> arr
[1, 2, 'hello', [1, 2, 34]]
```
#### tuple的使用
`tuple`是一个有序的数组,和`list`类似,`tuple`的特点是定义后不能在被修改,这样可以让代码中的数据更加安全。
定义`tuple`使用`()`,例如定义一个`tuple`如下:
```python
>>> tup=(1,2,3)
>>> tup
(1, 2, 3)
由于tuple
不可修改,所以不能使用append
,insert
等修改元祖的方法。
如果定义一个只有一个元素的tuple
:
1 | >>> tup=(1) |
这样我们发现,tup
不是一个元祖,而是一个数字。原来是只用一个元素的时候,tuple
中的()与数学运算中的括号冲突了,所以当定义只有一个元素的tuple
的时候,需要在最后加一个,
,方法如下:
1 | >>> tup=(1,) |
在多线程的使用中,有时会碰到死锁,死锁会造成应用程序阻塞,浪费系统资源。下面探讨如何发现和解决死锁:
首先先写一段能够产生死锁的代码:
1 | private static Object lock1=new Object(); |
运行上面的结果,线程会各自阻塞在同步锁的那个地方,产生了死锁,运行结果如下:
1 | 线程1获得 lock1 |
我们使用jps
命令, 查询Java
的线程,如下:
使用jstack 16071
命令查看堆栈信息
nested
类型是一个特殊object
数据类型,允许数组的object
的字段可以被独立的查询出来。
在lucene中没有嵌套object
的概念,所以ES的用一个简单的数据数据列表来表示一个复杂的层次数据实体,例如一个博客和评论的实体:
1 | PUT nesttest/_doc |
其中commet
类型会被转化成一个数组的形式如下:
1 | { |
而当执行查询的时候:
1 | GET nesttest/_search |
发现查询结果如下:
1 | { |
最近看到线上的项目线程数过大的报警,开始还是不知道什么原因,因为很多项目都使用同样的线程池管理代码,认为那个项目是偶然的因素造成的,后来经过分析,发现线程数每天都在增加。其他的项目由于发布导致线程会从零开始计算,所以没有那么快达到报警值。 触发报警的代码大概如下:
1 | boolean start=true; |
上面的代码存在两个问题:
start
是个主线程的变量,在主线程修改值,子线程的while
循环不会停止
上述代码能够停止,因为在内部调用`Thread.sleep方法,导致线程内的变量刷新
newFixedThreadPool
线程池没有调用shutdown方法,导致线程不会被回收。
改正方法:
start
设置成线程共享变量volatile
类型
在最后调用停止的时候,让线程池进行回收
修改后代码如下:
1 |
|
在mysql中,可以使用join
来实现表与表之间的数据连接,在es中如何实现这个问题?
相对于mysql来说,es有几个不同的地方
对于上面的几个问题,es的解决方案是**在一个索引下,借助父子关系,实现类似Mysql中多表关联的操作**
1 | PUT myorder |
定义join关系为order_join
,其中order
是父文档,suborder
是子文档。
1 | put myorder/_mapping/_doc |
安装和升级pip工具 python.exe -m pip install --upgrade pip
安装tensorflow pip install --upgrade tensorflow
安装openvc: pip install opencv-python
在python3中多线程出现了很多变化,原来的thread
变成_thread
,官方更推荐使用threading
.
创建线程使用Thread
方法,使用方法和传递参数如下:
1 | # coding: utf-8 |