首页 > 代码库 > 鸡和框架

鸡和框架

技术分享

技术分享

集合框架

在Java语言中,Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和操作(算法)统称为Java集合框架(JavaCollectionFramework)。

Collection接口

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些 Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。

Set和List:

Set子接口:无序,不允许重复。

List子接口:有序,可以有重复元素。

具体区别是

List:

和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

<相应类有 ArrayList,LinkedList,Vector>
ArrayList类

ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。 size,isEmpty,get,set方法运行时间为常数。

public class Arraylist {
public static void main(String[] args) {
	List lst = new ArrayList();
	lst.add(121);// 增
	// lst.remove(1);//删
	lst.add("哈喽");
	lst.add("hello");
	lst.set(2, "opp");// 改
	System.out.println(lst.get(2));// 查
	// System.out.println(lst.isEmpty());
	// System.out.println(lst.size());
    }
}
LinkedList类

实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。

public class Linkedlist {
public static void main(String[] args) {
	LinkedList lkl = new LinkedList();
	lkl.add("MLW");
	lkl.add("TYZ");
	lkl.add(‘A‘);
	System.out.println(lkl);
	lkl.add(2, 250);// 插入
	System.out.println(lkl);
	lkl.addFirst("哈哈");// 插到开头
	lkl.addLast(4396);// 插到尾部
	System.out.println(lkl);
	System.out.println(lkl.contains("QGJ"));// 如果此列表包含指定元素,则返回 true。
	System.out.println(lkl.element());// 获取但不移除此列表的头(第一个元素)。
	System.out.println(lkl.get(2));// 返回此列表中指定位置处的元素。
	System.out.println(lkl.indexOf("TYZ"));//返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 -1。
	lkl.offer("MLW");//将指定元素添加到此列表的末尾(最后一个元素)。
	lkl.set(2, "么么哒");//将此列表中指定位置的元素替换为指定的元素。 
	System.out.println(lkl); 
}

}

Set:

检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

Set具有与Collection完全一样的接口,因此没有任何额外的功能,不像前面有两个不同的List。实际上Set就是Collection,只是行为不同。(这是继承与多态思想的典型应用:表现不同的行为。)Set不保存重复的元素(至于如何判断元素相同则较为负责)

Set : 存入Set的每个元素都必须是唯一的,因为Set不保存重复元素。加入Set的元素必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。

<对应类有 HashSet,TreeSet>
HashSet类

它不允许出现重复元素;不保证和政集合中元素的顺序,可以自己做个例子可以看出加入的字段顺序跟遍历出的不一样,允许包含值为null的元素,但最多只能有一个null元素

public class hashset {
public static void main(String[] args) {
	HashSet she = new HashSet();
	she.add("zhangsna");
	she.add("lisi");
	she.add("wangwu");
	she.add("lisi");
	Iterator it = she.iterator();
	while (it.hasNext()) {
		System.out.println(it.next());
    	}
    }
}
TreeSet类

可以实现排序等功能的集合,它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成按照“升序”排列。

ByTheWay

a)(在对大量信息进行检索的时候,TreeSet比AraayList更有效率,能保证在log(n)的时间内完成)。
b)TreeSet是实用树形结构来存储信息的,每个节点都会保存一下指针对象,分别指向父节点,左分支,右分支,相比较而言,ArrayList就是一个含有元素的简单数组了,正因为如此,它占的内存也要比ArrayList多一些。
c)想TreeSet插入元素也比ArrayList要快一些,因为当元素插入到ArrayList的任意位置时,平均每次要移动一半的列表,需要O(n)的时间, 而TreeSet深度遍历查询花费的实施只需要O(log(n))

Map的功能方法

Map主要用于存储健值对,根据键得到值,因此不允许键重复,但允许值重复。

Hashmap

是一个 最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。

public class hashmap {
public static void main(String[] args) {
	Map<String, String> map = new HashMap<String, String>();
	map.put("mlw", "孟良伟");
	map.put("tyz", "唐艺倬");
	map.put("qgj", "乔冠杰");
        //System.out.println(map.containsKey("mlw"));//如果此映射包含对于指定键的映射关系,则返回  
        //System.out.println(map.size());// 返回此映射中的键-值映射关系数。
	// map.remove("mlw");//从此映射中移除指定键的映射关系(如果存在)。
	System.out.println(map);
	System.out.println(map.get("mlw"));
	Set set = map.keySet();//返回此映射中所包含的键的 Set 视图
	System.out.println(set);// 打印所有key
	Iterator<String> it = set.iterator();
	while (it.hasNext()) {
	System.out.println(map.get(it.next()));
	}
}

}

注意:

1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。
2、Set和Collection拥有一模一样的接口。
3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get)
4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。
5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。
6、HashMap会利用对象的hashCode来快速找到key。
7、哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。 发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。
8、Map中元素,可以将key序列、value序列单独抽取出来。
9、使用keySet()抽取key序列,将map中的所有keys生成一个Set。
10、使用values()抽取value序列,将map中的所有values生成一个Collection。
11、为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。

鸡和框架