- 博客(32)
- 收藏
- 关注
原创 阿里java规范“不要在 foreach 循环里进行元素的 remove/add 操作,remove 元素请使用 Iterator 方式”
先来看一段代码,摘自阿里巴巴java开发规范:List<String> list = new ArrayList<>();list.add("1");list.add("2");for (String item: list) { if ("1".equals(item)) { list.remove(item); }}可以发现是可以执行的,但事实上循环只执行了一次便停止了(原因在下文讲述),但如果要删除"2",便会报如下错误:这个错误是指存在并发修改,通常在
2020-07-03 20:49:05
2022
转载 面向对象与面向过程的本质区别
https://blog.youkuaiyun.com/jerry11112/article/details/79027834
2019-11-28 10:15:14
194
原创 'gbk' codec can't decode byte 0x80 in position 205: illegal multib问题分析
在python3读取txt文件时,有时候会遇到上面的问题。原因:.txt文件是utf-8编码,在计算机中是按照utf-8编码成字节序列后存到硬盘上;在读取文件时,默认编码是gbk,所以写入到硬盘上的编码方式和从硬盘中读取的编码方式不匹配,所以报了以上错误,如下图所示:Unicode是字符集:为每一个字符分配一个唯一的ID(学名为码位/码点/Code Point)utf-8/utf-16/u...
2019-11-01 20:32:42
865
原创 Java中输出流flush()方法
在Java IO流操作中,会遇到如下这样一段代码:out.flush();out.close();现在来分析这段代码运行过程中得具体情境。flush():清空缓冲区。进行流的操作时,数据先被读到内存时,然后再将数据写到文件中,那么当你数据读完时,调用close()关闭读写流,这时就可能造成数据丢失。原因是:读入数据完成时不代表写入数据完成,一部分数据可能会留在缓冲区中,flush()方...
2019-10-17 11:37:33
744
转载 Java实体为什么要实现序列化接口!
所谓的Serializable,就是java提供的通用数据保存和读取的接口,至于从什么地方读出来和保存到哪里去都被隐藏在函数参数的背后了。这样子,任何类型只要实现了Serializable接口,就可以被保存到文件中,或者作为数据流通过网络发送到别的地方。也可以用管道来传输到系统的其它程序中。这样子极大的简化了类的设计。只要设计一个保存功能和一个读取功能就能解决上面说的所有问题。java的“对象...
2019-09-17 20:28:57
1263
原创 对二维数组排序
Arrays.sort()不能对二维数组直接排序。需要把二维数组看成是”每个元素是一维数组的一维数组“,传入外比较器自定义比较规则。import java.util.Arrays;import java.util.Comparator;public class RedBook { public static void main(String[] args) { i...
2019-09-04 08:58:50
241
原创 如何对Map进行排序
可以将Map传入ArrayList的构造器中,按照Map中的元素顺序构造一个泛型为Map.Entry<>的ArrayList,然后传入一个外比较器对ArrayList进行排序。例如:Map<Integer, Integer> map = new LinkedHashMap<Integer, Integer>();List<Map.Entry<I...
2019-08-26 16:25:54
393
转载 HashMap的数据结构
一、JDK1.61.哈希的相关概念Hash 就是把任意长度的输入(又叫做预映射, pre-image),通过哈希算法,变换成固定长度的输出(通常是整型),该输出就是哈希值。这种转换是一种压缩映射,也就是说,散列值的空间通常远小于输入的空间。不同的输入可能会散列成相同的输出,从而不可能从散列值来唯一的确定输入值。简单的说,就是一种将任意长度的消息压缩到某一固定长度的息摘要函数。2.HashMa...
2019-08-05 12:02:50
264
转载 Map综述(二):彻头彻尾理解LinkedHashMap
HashMap 是 Java Collection Framework 的重要成员,也是Map族中我们最为常用的一种。不过遗憾的是,HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。HashMap的这一缺点往往会造成诸多不便,因为在有些场景中,我们确需要用到一个可以保持插入顺序的Map。庆幸的是,JDK为我们解决了这个问题,它为HashM...
2019-08-04 18:12:38
202
转载 守护进程
一、认识守护进程守护进程:其也称为精灵进程,是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理发生的事件。守护进程不受用户登录与注销的影响,它一直在运行着。Linux下的大多数服务器都是利用守护进程实现的。利用ps -axj | more 查看所有用户的作业。ps:表示对进程监测和控制。参数a:表示不仅列出当前用户的进程,也列出所有其它用户的进程。参数x:...
2019-07-30 09:44:42
769
原创 精度问题
问题:int类型是按整除结果算;double、BigDecimal等如果你不设置精度的话,那它默认就会以你的两个数中精度大的那个来设置一个精度!
2019-07-28 12:04:46
507
原创 快速排序最好、最坏、平均时间复杂度分析
我们来分析一下快速排序法的性能。快速排序的时间性能取决于快速排序递归的深度,可以用递归树来描述递归算法的执行情况。如图所示,它是{50,10,90,30, 70,40,80,60,20}在快速排序过程中的递归过程。由于我们的第一个关键字是50,正好是待排序的序列的中间值,因此递归树是平衡的,此时性能也比较好。在最优情况下,Partition每次都划分得很均匀,如果排序n个关键字,其递归树的深度就...
2019-07-25 21:13:28
38392
1
原创 进程间通信(IPC)的几种方式
管道通信或叫做匿名管道通信(pipeInputStream、pipeOutputStream):管道是指连接一个读进程和写进程来实现双方之间通信的一个共享文件,叫pipe文件。pipe文件只存在内存中,所以通信的数据量较小。匿名管道只能用于父子进程或者兄弟进程之间,并且传输的是无结构的字节流。管道具有互斥、同步的能力。一个进程对pipe文件读写操作,别的进程必须等待。若pipe文件数据超过分配的...
2019-07-25 15:04:36
343
转载 Linux echo命令
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。此外,也可以直接在文件中写入要写的内容。echo命令常用的两个选项: -n 和 -e-n:表示输出之后不换行-e:表示对于转义字符按对应的方式进行处理。(若不加-e,那么在输出时转义字符会按照普通字符进行处理,并不会达到自己想要达到的目的。)示例:转义字符定义:用一些普通字符的组合来代替一些特殊字符,由于其组合改...
2019-07-24 16:15:15
193
原创 Linux wc命令
Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数、并将统计结果显示输出。1.命令格式:wc [选项]文件…2.命令功能:统计指定文件中的字节数、字数、行数,并将统计结果显示输出。如果没有给出文件名,则从标准输入读取。wc同时也给出所指定文件的总统计数。3.命令参数:-c 统计字节数。-l 统计行数。-m 统计字符数。这个标志不能与-c标志...
2019-07-24 16:04:26
138
原创 Linux查看文件100到150行
【一】cat 文件名 | tail -n +100 | head -n 50【二】cat 文件名 | head -n 150 | tail -n +100*注意两种方法的顺序分解:tail -n 100:显示最后100行tail -n +100:从100行开始显示,显示100行以后的head -n 100:显示前100行【三】用sed命令sed -n ‘100,150p’ 文件名...
2019-07-24 15:48:26
2267
原创 经典进程同步问题
生产者消费者问题:是同步互斥的综合。一个生产者进程和一个消费者进程共享一个初始为空、大小为n的缓冲区。缓冲区没满生产者才能放东西,缓冲区不空消费者才能取东西。设置三个信号量,mutex表示对缓冲区的互斥访问,初值为1。empty表示还没有被消息占据的缓冲区大小,初值为n。full表示已经被消息占据的缓冲区大小,初值为0。semaphore mutex = 1;//互斥信号量semaphore...
2019-07-22 21:14:04
300
原创 JVM堆区新生代为什么有两个Survivor?
JVM内存模型中,Heap区被分为新生代和老年代两个区域,新生代又分为Eden+Survivor1+Survivor2.新生代收集算法主要使用复制算法,老年代收集算法只要使用标记-整理算法。堆内存划分:为什么不是0个 Survivor 空间?这个问题等价于:为什么需要 Survivor 空间。我们看看如果没有 Survivor 空间的话,垃圾收集将会怎样进行:一遍新生代 gc 过后,不...
2019-07-13 22:24:27
590
原创 新生代为什么不使用“标记-整理算法”?
首先要明确的是“新生代使用的是复制算法”!从三个角度考虑这个问题:移动比复制开销更大:假设这个考虑的角度是对的,但是老年代中存活的对象要比新生代中要多得多,既然多的存活对象都可以使用这种开销较大的移动,那么少的对象也可以,所以排除这个角度。内存碎片问题:复制算法和标记-整理算法都是将存活的对象整理好了,所以也排除这个角度。清理内存空间:排除了以上两个角度,那么就只剩这一个考虑问题的角度了...
2019-07-13 21:57:41
5255
9
原创 MVCC
什么是MVCC?MVCC是一种多版本并发控制机制。MVCC是为了解决什么问题?大多数的MySQL事务型存储引擎,如InnoDB,Falcon以及PBXT都不使用一种简单的行锁机制,而是都和MVCC来一起使用。大家都应该知道,锁机制可以控制并发操作,但是其系统开销较大,而MVCC可以在大多数情况下代替行级锁,使用MVCC,能降低其系统开销。MVCC实现:MVCC是通过保存数据在某一时...
2019-07-10 16:18:32
152
原创 进程、线程
进程:就是一定功能的程序段在某个数据段上的一次运行活动,每个进程有一个PCB进程控制块,进程实体由程序段、数据段和PCB进程控制块组成。为什么要引入进程?如果没有进程概念的系统执行IO程序和计算程序,那么必须顺序执行,CPU,IO设备等资源会浪费。为IO程序和计算程序分别分配各自独立资源,分别建立进程,这样可以并发执行,就可以同时使用IO设备和CPU,提高系统吞吐量。进程是在操作系统中独立运...
2019-07-10 10:03:15
93
原创 管程、协程
管程:信号量机制的引入解决了进程同步的描述问题,但信号量的大量同步操作分散在各个进程中不便于管理,还有可能导致系统死锁。所以把所有进程对某一种临界资源的同步操作都集中起来,这里简记为A(对所有进程对另一种临界资源的同步操作都集中起来记作B)。管程相当于围墙,它把共享变量和对它操作的若干个过程(A,B等等)围了起来,所有的进程要访问临界资源时,都必须经过管程才能进入,而管程每次只允许一个进程进入管...
2019-07-10 09:34:01
1020
原创 TCP三次握手建立连接、四次挥手连接释放
第一次握手:客户端向服务端发送连接请求报文段,TCP报文段首部同步位SYN=1,初始序号seq=x。客户端进程进入同步发送状态。第二次握手:服务端收到连接请求报文段后,向客户端发送确认报文段。把TCP报文段首部SYN位和ACK位置为1,初始序号seq=y,确认号ack=x+1。服务端进入同步接收状态。第三次握手:客户端接收到确认报文段后,向服务端发送ACK报文段,ACK位置为1,初...
2019-07-09 17:05:28
151
原创 HashMap与HashTable(ConcurrentHashMap)的区别
HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java5提供了ConcurrentHashMap,它是Hashtable的替代,比Hashtable的扩展性更好。由于Hashtable是线程安全的也是sync...
2019-07-08 21:58:53
103
原创 字符串三个类之间的区别
Java中的String、StringBuffer、StringBuilder三者的区别:这三个类之间的区别主要是在两个方面:运行速度和线程安全。1.首先说运行速度,或者说是执行速度,在这方面***运行速度快慢为:StringBuilder > StringBuffer > String***String最慢的原因:String为字符串常量,而StringBuilder和Stri...
2019-07-08 21:47:08
378
原创 Scanner
//Scanner类中的方法 //优点一: 可以获取键盘输入的字符串 //优点二: 有现成的获取int,float等类型数据,非常强大,也非常方便; public static void ScannerTest(){ Scanner sc = new Scanner(System.in); System.out.println("ScannerTest, Pleas...
2019-07-08 14:24:38
3018
原创 我以前不知道的Session
之前只知道Session是服务器与客户端的一个会话,有默认过期时间,是服务端的技术,与之对应的是Cookie技术,是客户端技术。下面的几点是之前不知道的:1.Session是什么时候创建的?2.SessionId的组成?3.Session存储在哪里?回答上面的问题:1.在java中,Session是在调用HttpServletRequest实例的getSession()时创建的【不同语...
2019-07-08 11:06:58
132
原创 方法引用
Java双冒号运算就是Java中的[方法引用][方法引用]的格式是: 类名::方法名一般是用作Lambda表达式。形如ClassName::methodName或者ObjectName::methodName的表达式,我们把它叫做方法引用(Method Reference)。例如:1.表达式:person -> person.getName();可以替换成:Person::g...
2019-07-07 09:52:53
136
原创 Comparable和Comparator区别
一、Comparable简介Comparable是排序接口。若一个类实现了Comparable接口,就意味着"该类支持排序"。实现了Comparable接口的类的对象的List或数组可以通过Collections.sort或Arrays.sort进行排序。Comparable定义Comparable接口仅仅只包括一个函数,它的定义如下:package java.lang;import j...
2019-07-06 15:55:33
424
原创 单例模式
定义:保证一个类只有一个实例,并且提供一个访问它的全局访问点。构造器私有化,提供静态方法getInstance()得到类的示例。七种写法:1.饿汉式public class Singleton { private static Singleton instance = new Singleton(); private Singleton (){ } ...
2019-07-06 10:21:51
84
转载 Java只有值传递,不存在引用传递!
先来看一个作为程序员都熟悉的值传递的例子://定义了一个改变参数值的函数 public static void changeValue(int x) { x = x *2; } ... ... //调用该函数 int num = 5; System.out.println(num); changeValue(num); System.out.println(num);答案显...
2019-07-05 15:05:56
170
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人