《Java编程思想》(Thinking in Java)读书笔记——01对象导论

Posted WhoMercy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《Java编程思想》(Thinking in Java)读书笔记——01对象导论相关的知识,希望对你有一定的参考价值。

1.9 容器

关于容器,最常用的就是Collection接口里的Set、List和Map所衍生的各种实现类,还有较为少用但又不可或缺的Queue。

它们都有相同的点,即:提供了类似数组类型的数据聚合功能(有部分类型也是用数组实现)简单的说,就是能够像数组一样,将同种类型的数据绑定在一起,放在同一个地方(指针、索引)下等待使用。

但容器子类(接口)间又各有不同,有着各自的特点。

各个容器的依赖关系如下:

 

Set类型

子元素间有不可重复性。如,将“1,1,2,3”这样四个元素存入Set的实现类中,容器中就只有“1,2,3”这三个元素。

(但其具体构造器与实现方法与使用还未深入研究,等后续再行补充)。

List类型

子元素可重复存放。如,将“1,1,2,3”这样四个元素存入Set的实现类中,容器中就只有“1,1,2,3”这四个元素。

其底层仍是由数组实现,默认的构造器会使用“10”的容量来构造数组(也可以在实例化时指定容量大小)。

当子元素数量超过容量后,会以当前数组1.5倍的容量来构造新的数组,之后再把当前数组复制到新的数组中。

Map类型

子元素以<Key,Value>的形式进行存放(即常说的的K-Y形式),其中Key部分不能重复,而Value可以重复。

Key多是形似指针或者索引的数据,用于表示Value中的某种数据特性(这种特性一般是独一无二的)。如,将身份证号(idm,Identity Document Number)作为Key,将个人信息(info,Information)作为Value,组成<idm,info>的Map数据就可以通过idm查询info。

Queue类型

 队列功能用于实现任务的先进先出(FIFO,First In First Out),常见于生产者-消费者模式消息机制、多线程应用等的任务存储。

 

 

书中最后提到一点建议:

我们可以在一开始使用LinkedList构建程序,而在优化系统性能时改用ArrayList

应用这个技巧能很好地结合LinkedList的高效顺序增加特性与ArrayList的高效随机获取特性

 

在1.9.1 参数化类型 中提到了使用泛型来规范化类型格式,但不能过度依赖泛型,也要注意到“泛型擦除”可能会带来的问题。


 

1.10 对象的创建和生命期

 书中提到:

Java完全采用了动态内存分配方式。每当想要创建新对象时,就要使用new关键字来构建此对象的动态实例。

...

对于允许在堆栈上创建对象的语言,编译器可以确定对象存活的时间,并可以自动销毁它。然而,如果是在堆上创建对象,编译器就会对他的生命周期一无所知

堆栈和堆的不同点在于:

  • 栈存储在连续空间且有序执行(后进先出)因此可以知道其生命周期。
  • 则的存储则不需要连续的空间,因此可以有效利用碎片化和不规则的空间,但也因此很难确定当前堆的数据是否已经使用完毕(这就引入了之后会提到的JVM不同的内存回收机制)。

1.12 并发编程

书中提到:

有时中断对于处理时间性强的任务是必需的,但是对于大量的其他问题,我们只是想把问题切分成多个可独立运行的部分(任务),从而提高程序的响应能力

容易混淆的一点是,多线程提高的是程序的“响应能力”,而不是提高程序的“处理能力”

因为线程间切换时需要进行现场保护消耗资源和时间,所以盲目使用多线程反而会造成性能降低的情况,也就是说我们在选择是否使用多线程时需要注意应用场景是否合适。

如,在进行I/O操作时有BIO、NIO和AIO三种选择,其中:

  • BIO(Blocked Input/Output,阻塞I/O)可以理解成在单线程情况下,控制器(CPU)等待I/O完成后才进行下一步操作;
  • NIO(Not blocked Input/Output,非阻塞I/O)也是使用单线程,但控制器(CPU)无需等待I/O完成,通过将I/O控制权交给DMA控制器来解放控制器(可以去做其他事情,如:开启新的I/O);
  • AIO(Asynchroniezd Input/Output,异步I/O)则是使用了异步的思想,例如将生产者(Producer)和消费者(Consumer)分离的异步消息机制,在这种情况下则通常需要多线程来实现,目的是充分利用现代计算机分布式、多处理器的架构;

 

1.13 Java与Internet

 书中提到:

客户/服务器系统的核心思想是:系统具有一个中央信息存储池(Central Repository of Information),用来存储某种数据,它通常存在于数据库中,你可以根据需要将它分发给某些人员或机器集群。

...

总之,信息存储池、用于分发信息的软件以及信息与软件所驻留的机器或机群被总称为服务器。驻留在用户机器上的软件与服务器进行通信,以获取信息、处理信息,然后将它们显示在被称为客户机的用户机器上。

从C/S到B/S,由Client到Browse,我们终于可以不用针对不同平台进行客户端编程,转而直接在网页中提供服务(虽然需要懂得html,但已经方便得多)。

而在现代项目中也还脱离不了中央信息存储池的模式,集中式的数据使用权基本上都是Server端说了算,造成将Server和User的阶级地位完全隔离——导致User不得不信任Server会“守规矩”的现状,但Server信用破产的实例却时有发生。

直到区块链(BC,Block Chain)的出现,打破了这一现状,提供了一种新的思路(但目前来看,并非完美的解决方案)。

 


 

图片引用于:

http://www.jb51.net/article/84821.htm

以上是关于《Java编程思想》(Thinking in Java)读书笔记——01对象导论的主要内容,如果未能解决你的问题,请参考以下文章

《Java编程思想》(Thinking in Java)读书笔记——01对象导论

Thinking in Java 4th(Java编程思想第四版)文档源码习题答案(偶尔回顾)

《Thinking In Java》作者:不要使用并发!

Thinking In Java

Hacker Rank: Two Strings - thinking in C# 15+ ways

Thinking In Web [原创作品]