<<java编程思想>>读书笔记

类型:基元类型,类类型
实体:
类:字段,方法,修饰符(默认修饰符),static

why foreach
1)简化代码编写
2)阅读方便
3)避免出错

值比较和引用比较(例:Interger):== !=关系运算法,eqauls方法
访问级别类成员:友好(默认,friendly,又称为包访问级别),public,private,protected
访问级别类:友好(默认)public
why 类级别public(用来表明库内的哪些类由库的客户使用)
没有显式声明,同目录下文件会自动归为默认包

库(包)(import java.util.*,即加入一个库,或者说导入一个包),类

包。从程序员编辑角度来说,用来分隔命名空间,包和程序集都是逻辑上的概念;从实体来说,同一个包即为一个dll或exe
java中的“包”是和.net程序集同级别的概念。java中没有像c#一样专门定义了一个关键字internal

基元类型存在与“堆栈”中(一般)
new的对象置于“堆”中
java决定了每种基元类型的大小,这些大小并不随着结构的变化而变化,所以java具有很强的可移植性。

基元类型有自己的“封装器”(wrapper)类。以使能在堆中存在
Character c = newCharacter  ('c');

一旦将将变量作为类成员使用,就会自动分配一个java的默认值,这样保证初始化,能预防很多编程错误。

p125
一个java源代码文件,通常叫做“编译单元”。每个编译单元都必须有一个.java结尾的名字。而且在编译单元内部,最多可以有一个public类(通常都有一个),它必须拥有与文件相同的名字
p131
一个编译单元(一个文件)只能从属于一个包

迭代器
why迭代器:统一了对容器的访问方式
Iterator对象 p259
Iterator<Pet> it = pets.iterator();

ListIterator是Iterator的子类,只能用于各种List类的访问
Iterator只能向前移动,但ListIterator可以双向移动,具体见p260


what容器:保存对象
why容器:是为了能在任意时刻,任意位置,创建任意数量的对象。由于数组要在编译时确定数组大小,所以引进了容器
对于容器,java中没有直接的关键字支持。而python,perl,ruby都有容器的本地支持
容器分属两大类:
Collection:一个独立元素的序列。
List必须按照插入顺序保存元素,而Set不能有重复,Queue按照“排队规则”来确定对象产生的顺序(通常与它被插入的顺序相同)
Map:一组成对的“键值对”对象,允许你使用键来查找值。
ArrayList允许你使用数字查找值。因此在某种意义上讲,它将数字与对象关联在了一起。映射表(又称为“关联数组”,或“字典”)允许我们使用另一个对象来查找某个对象

所有Collection都可以用foreach语法遍历 p253

必须用Arrays.toString()来产生数组的可打印表示,但是打印容器无需任何帮助。 p254
print(Collection c)

泛型:
why泛型p219
1)更加安全。编译时预防(例如,在ArrayList<Apple>中加入Apple和Orange是不允许的,因为Orange不能转型为Apple)
2)书写更加简单,因为编译器会自动帮你转型。

Set对于每个值都只保存一个对象


使用散列的目的在于:想要使用一个对象来查找另一个对象
p521
how 使用散列的数据结构(HashSet,HashMap,LinkedHashSet,LinkedHashMap),编写key类需注意的几个问题,
1)重写hashCode(默认使用的是object的hashCode()方法生成散列码,它使用对象的地址计算散列码)
2)重写equals(默认使用的是object的equals()比较对象的地址)

p528
how 如何编写hashCode()
1)对同一个对象调用hashCode()都应生成相同的值
2)不应该让hashCode()依赖于具有唯一性的对象信息,尤其是使用this的值

hashCode()原则
1)速度快
2)均匀
3)必须基于对象的内容生成散列码

p532
实际上只有4种容器:Map、List、Set、Queue。但是每种接口都有不止一个实现版本。
每种不同的实现有各自的特征、优点和缺点。

p264
Set不保存重复的元素。如果试图将相同对象的多个实例添加到Set中,那么它就只会添加一个。

p510
Set(interface)
1)存入Set的每个元素都必须是唯一的,因为Set不保存重复元素
2)存入Set的元素必须定义equals()方法确保对象的唯一性
3)Set接口不保证维护元素的次序
4)Set和Collection有完全一样的接口

几个Set的子类:HashSet、TreeSet、LinkedHashSet
HashSet:底部实现为哈希。存入HashSet的元素必须定义hashCode()。(优先选择,因为查询速度较快)
TreeSet:底部实现为红黑树。元素必须实现Comparable接口。使用它可以从Set中提取有序的序列
LinkedHashSet:元素必须定义hashCode()。


必须为实现Set的子类(包括散列存储和树型存储)都创建一个equals()方法,但是hashCode()只有在这个类将会被置于HashSet或LinkedHashSet才是必须的。但是,对于良好的编程风格而言,你应该在覆盖equals()方法时,总是同时覆盖hashCode()方法

when HashSet或TreeSet
1)元素数目很多时,内存不够用,可以考虑使用TreeSet
2)哈希函数没设计好,或产生很多冲突时,可以考虑使用TreeSet


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值