Java面试题(1) – 语言基础
整理一些来自网络的Java基础面试题,内容涵盖语言基础、并发、JVM、IO模型、中间件、开发框架等等。本章节的面试题有:一个字符占多少个字节,int、long、double占多少字节;Java中的异常有哪几类,分别怎么使用;什么是序列化,如何实现序列化;int和Integer有什么区别?Integer值缓存范围是什么。
整理一些来自网络的Java基础面试题,内容涵盖语言基础、并发、JVM、IO模型、中间件、开发框架等等。本章节的面试题有:一个字符占多少个字节,int、long、double占多少字节;Java中的异常有哪几类,分别怎么使用;什么是序列化,如何实现序列化;int和Integer有什么区别?Integer值缓存范围是什么。
大学时期,我首次使用了Mybase管理笔记和文档。Mybase的界面有点古板,但是功能异常强大。它的缺点也显而易见,没有移动客户端,无法在多平台同步数据。七八年前,我开始使用Evernote(本土化后叫做印象笔记),客户端UI很美观,但是整体响应有点慢,免费用户的空间也很小。后来朋友向我推荐了有道云笔记,它是国内的产品,界面很清爽,同步数据也很快,一直使用至今。国内知名的笔记软件还有语雀、为知笔记等等,这些产品固然做的很好,但是无法解决让我忧心忡忡的问题:数据安全。没有任何一家公司敢保证决不泄露客户数据,要么是被黑客窃取数据,要么被公司内鬼盗卖数据,这些案例比比皆是。随着我的笔记数量越来越多,有一些隐私数据也放在云笔记上。有道云笔记绝不可能让用户自行存储数据,我必须寻找新的产品来解决数据安全问题。
小时候家里生活条件不好,很少吃到猪肉或者牛肉。家里养鸡,鸡蛋比较充足,鸡肉偶尔能吃到。最期盼跟着大人赴宴,农村的宴席没有城市的那么精致,但是食品安全有保障,主家常常用自家的猪和青菜招待客人。我清晰的记得参加爸爸的好友财伯的儿子结婚宴会,十多个菜全是鸡鸭鱼肉,没有一盘纯素菜,财伯非常舍得花钱。最舒服的日子是过年那一段时间,无论在家还是走亲访友,顿顿都可以大鱼大肉。某一年的春节前夕,爸爸把家养的猪赶到屠夫福堂那里屠宰。我第一次观赏了杀猪的全过程,这是技术与艺术的完美结合。
钓龙虾、摸螺蛳、偷萝卜,农村孩子的娱乐方式常常与吃有关,孩子们充分利用环境,进行环保的健身活动。一个炎热的夏天,我和小伙伴在田野上玩,无意间看到路边有几根西瓜藤。我顺着藤蔓拽出来一个拳头大的西瓜,把西瓜掰开,瓜肉有点红瓤,这说明瓜熟了。我顿时就饿了,自己吃了一半,分了一半给小伙伴。西瓜有一点点甜味,水分也很足,恍惚中有点吃冰淇淋的感觉。这份简单的快乐,抚慰了我整个下午。
我挑了一个好看点的地瓜拎回家,去了皮,露出白肉,再切成几大块。这个瓜水分比较足,甜度不足,只能打7分,是一只不努力的地瓜。一只合格的地瓜,应该是口感清脆味道甘甜,跟苹果一样好吃,名副其实的“地里面的瓜”。地瓜的学名叫凉薯或豆薯,一些北方地区所说的地瓜其实是红薯。一些电影里面有烤地瓜的桥段,其实是烤红薯。我偏执的认为红薯是喂猪的,不应该叫做地瓜。农村的初秋,很多蔬菜都枯萎或者减产了,而地瓜正是收获的季节。
协程不是操作系统的底层特性,系统感知不到它的存在。它运行在线程里面,通过分时复用线程的方式运行,不会增加线程的数量。协程也有上下文切换,但是不会切换到内核态去,比线程切换的开销要小很多。每个协程的体积比线程要小得多,一个线程可以容纳数量相当可观的协程。在IO密集型的任务中有着大量的阻塞等待过程,协程采用协作式调度,在IO阻塞的时候让出CPU,当IO就绪后再主动占用CPU,牺牲任务执行的公平性换取吞吐量。
操作系统支持多个应用程序同时执行,每个应用至少对应一个进程,彼此之间的操作和数据不受干扰。当一个进程需要磁盘IO的时候,CPU就切换到另外的进程去执行,提高了CPU利用率。CPU在不同的进程之间切换执行,任务多的时候一直处于工作状态。有了进程,为什么还要线程?因为进程的成本太高了。启动新的进程必须分配独立的内存空间,建立数据表维护它的代码段、堆栈段和数据段,这是昂贵的多任务工作方式。如果两个进程之间需要通信,要采用管道通信、消息队列、共享内存等等方式。线程可以看作轻量化的进程,或者粒度更小的进程。线程之间使用相同的地址空间,切换线程的时间远远小于切换进程的时间。一个进程的开销大约是线程开销的30倍左右。
操作系统的”进程”很早就出现了,许多教科书上定义这个概念总是晦涩难懂。计算机技术发展太快了,简单的概念经过无数次演化,也会变得复杂。我们追溯一下操作系统的发展历史,就能理解进程解决了什么问题、为什么这样设计。进程是独立功能的程序的一次动态执行过程,也是系统资源分配的独立实体。每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,要使用进程间通信,比如管道、文件、套接字等。