Java 是一个面向对象编程语言
类与对象
对象: 具有一组属性和方法的实体。
类:具有相同属性和方法的对象的集合。
关系 : 类是对象的抽象,对象是类的具体存在。
Java 的 反射机制 :
在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
动态获取信息以及动态调用对象的方法的功能成为JAVA语言的反射机制。
Collection、Collections,区别
Collection:java.util.Collection 是最基本的集合接口,一个Collection代表一组Object
Collections: java.util.Collections是一个包装类。是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。
此类不能实例化,就像一个工具类,服务于Java的Collection框架。
构造方法何时被调用:
构造方法在使用new关键字创建类的实例的时候被调用
构造方法特点:
(1) 构造方法名与类名相同.
(2) 构造方法不返回任何值,也没有返回类型.
(3) 每个类可以有零个或多个构造方法.
(4) 构造方法在创建对象时自动执行,一般不能显式地直接调用.
构造方法的作用:
通过构造函数,可以初始化类中属性值
Collection接口的实现类有哪些及它们的区别
Collection接口
├List接口
│├LinkedList实现类
│├ArrayList实现类
│└Vector
│ └Stack
└Set接口
Map接口
├Hashtable
├HashMap
└WeakHashMap
Collection接口:
1) 继承结构介绍:collection接口;List接口和Set接口继承Collection接口;List接口下包含
2) List,Set,Map是否继承自Collection接口?由collection接口派生的两个接口是List接口和Set接口,List接口有序,Set接口无序。Map是单独的接口,不继承自collection接口。
3) 所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
4) 如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator();// 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next();// 得到下一个元素
}
5) 各子接口、子类特性比较
List特点:元素有放入顺序,元素可重复
Set特点:元素无放入顺序,元素不可重复(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的);最多可以有一个null值
************
List接口有三个实现类:LinkedList,ArrayList,Vector
LinkedList:底层基于链表实现,链表内存是散乱的,每一个元素存储本身内存地址的同时还存储下一个元素的地址。链表增删快,查找慢
允许null元素
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: List list = Collections.synchronizedList(new LinkedList(...)); |
ArrayList和Vector的区别:
1) ArrayList是非线程安全的,效率高;Vector是基于线程安全的,效率低
2) ArrayList也是非同步的(unsynchronized);Vector是同步的
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
**************
Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
SortedSet接口有一个实现类:TreeSet(底层由平衡二叉树实现)
Query接口有一个实现类:LinkList
**************
Map特点:1)元素按键值对存储,无放入顺序
2)一个Map中不能包含相同的key
3)每个key只能映射一个value。
*************
Map接口有三个实现类:HashMap,HashTable,LinkeHashMap
HashMap非线程安全,高效,支持null;非同步的
HashTable线程安全,低效,不支持null ;同步的
HashTable: key-value映射的哈希表;不允许null
SortedMap有一个实现类:TreeMap
其实最主要的是,list是用来处理序列的,而set是用来处理集的。Map是知道的,存储的是键值对
set 一般无序不重复.map kv 结构 list 有序
Collection总结: 如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。 同步性 Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。 数据增长 从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。 使用模式 在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢? 这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。 最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
|