java基础-容器

</pre><pre name="code" class="java">

Lits接口年三种常用实现类:

Vector ArrayList LinkedListList

接口中的元素可以重复,而且有顺序Vector和ArrayList几乎使用了相同的算法,它们唯一的区别可以认为是对多线程的支持,ArrayList中没有对任何一个方法做线程同步,ArrayList不是线程安全的,Vector中大部分方法都做了线程同步,是一种线程安全的实现。因此,ArrayList和Vector几乎性能特性相差无几。从理论上来说,没有实现线程同步的ArrayList集合稍好于Vector,但是实际表现并不是非常明显。

LinkedList:使用了双向循环链表的数据结构。不不是线程安全的,对于ArrayList这些基于数组的实现来说,随机访问的速度是很快的,在遍历这些List对象时,可以优先访问随机访问,但对于等基于链表的实现,随机访问的性能是非常差的,应该避免使用。

RandomAccess接口:

1.是一个标志接口,本省没有提供任何方法,任何实现RandomAccess接口的对象都可以认为是支持快速访问的对象。

2.在jdk中,任何基于数组的List实现都实现了RandomAccess接口,而基于链表的实现则没有。

使用:list instanceof RandomAccess 若是,则进行随机访问get(),否则,迭代器访问iterator。对未实现RandomAccess得到List而言其随机访问速度特别慢

 
 
/*
 * 关于实现List接口的类的使用
 * */
public class ListClass {
	public static void main(String [] args){
//		List<String> arrayList =new ArrayList<String>();
//		List<String> arrayList =new Vector<String>();
		List<String> arrayList =new LinkedList<String>();
		arrayList.add("王");
		arrayList.add("李");
		arrayList.add("张");
		arrayList.add("宫");
		arrayList.add("王");
		arrayList.addAll(arrayList);
		
		//list的遍历
		//foreach遍历
		for(String i:arrayList){
			System.out.print(i+"\t");
		}
		System.out.println();
		
		//迭代器遍历
		Iterator i = arrayList.iterator();
		while(i.hasNext()){
			System.out.print(i.next()+"\t");
		}
		System.out.println();
		
		//for循环遍历
		for(int j = 0;j<arrayList.size();j++){
			System.out.print(arrayList.get(j) + "\t");
		}
//三次均按顺序输出		
//		王	李	张	宫	王	王	李	张	宫	王	
//		王	李	张	宫	王	王	李	张	宫	王	
//		王	李	张	宫	王	王	李	张	宫	王
		
		
		//List可以存储null
		//Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。
		//null本身虽然能代表一个不确定的对象,但就null本身来说,它不是对象,也不知道什么类型,也不是java.lang.Object的实例。
		List<Object> listObject = new Vector<Object>();
		//List<Object> listObject = new ArrayList<Object>();
		//List<Object> listObject = new LinkedList<Object>();
		listObject.add(null);
		listObject.add("说话");
		System.out.println(listObject);//[null, 说话]
		
	}
	
}


Map接口

HashTable HashMap(LinkedHashMap)  TreeMap

HashTable和HashMap的区别:
1.HashTable中对大部分的方法做了同步,而 HashMap没有,因此,HashMap不是线程安全的。
2.HashTable中不允许key值或者Value值为空,而HashMap可以。
3.在年内不算法中,它们对key值hash算法和hash值到内存索引的映射方法不同。
但是,hashmap和hashtable这两套实现的性能相差不大

HashTable:数组

HashMap:一个链表的数组
1.简单的说,HashMap就是将key做hash算法,然后将hash值映射到地址内存,直接取得key值所对应的数据,在hashmap中,底层数据结构使用的是数组,所谓的内存映射即是数组的下标索引。数组内的元素并不是一个简单的值,而是一个entry对象。
3.hashmap的性能在一定程度上取决于hashCode()的实现,一个好的hashCode()算法可以尽可能减少冲突,从而提高hashmap访问速度。

LinkedHashMap:
1.克服hashmap的无序性的缺点,保留元素的输入顺序。
2.提供两种类型的顺序:插入顺序,最近访问顺序

TreeMap:红黑树
1.从功能上讲,TreeMap拥有比HashMap更强大的功能,它实现了SortedMap接口,可以对元素进行排序。
2.根据元素的key进行排序,在构造函数中注入Comparator接口,或者使用一个实现了comparator接口的key。
3.基于红黑树,红黑树是一种平衡查找树,其统计性能优于平衡二叉树。
 

private static void aboutTraverse() {
		Map<String,String> map = new HashMap<String,String>();
		//输出:0:111	1:131	2:111	3:111	4:111	5:111
		//Map<String,String> map = new LinkedHashMap<String,String>();
		//输出:1:131	2:111	3:111	4:111	5:111	0:111(先进先出)
		//Map<String,String> map = new Hashtable<String,String>();
		//输出:5:111	4:111	3:111	2:111	1:131	0:111(随机)
		//Map<String,String> map = new TreeMap<String,String>();
		//输出:0:111	1:131	2:111	3:111	4:111	5:111(键值排序)
		
		//注意键值不能重复
		map.put("1", "111");
		map.put("2", "111");
		map.put("1", "121");
		map.put("3", "111");
		map.put("4", "111");
		map.put("5", "111");
		map.put("1", "131");
		map.put("0", "111");
		
		//遍历
		/*
		Iterator iterator = map.entrySet().iterator();
		while(iterator.hasNext()){
			Map.Entry<String, String> entry = (Map.Entry<String, String>)iterator.next();
			System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
		}*/
		
		 for (Entry<String, String> entry : map.entrySet()) {
			 System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
		 }
	}
	
	public static void aboutNull(){
		Map<String,String> map = new HashMap<String,String>();
		//输出:{null=a, a=a, b=a}
		
		//Map<String,String> map = new LinkedHashMap<String,String>();
		//输出:{null=a, a=a, b=a}
		
		//Map<String,String> map = new Hashtable<String,String>();
		//报错 其键和值均不能为null
		
		//Map<String,String> map = new TreeMap<String,String>();
		//报错 其键和值均不能为null
		
		map.put(null, null);
		map.put("a", null);
		map.put(null, "a");
		map.put("a", "a");
		map.put("b", "a");
		System.out.println(map);
		
	}


Set接口:

Set接口中元素是不能重复的
HashSet LinkedHashSet TreeSet 分别是对应的 HashMap LinkedHashMap TreeMap的封装
HashSet:基于hash的快速元素插入,元素间无顺序
LinkedHashSet:基于hash的快速元素插入,同时,维护着元素插入集合时的先后顺序,遍历集合时,总是按照先进先出的顺序进行
TreeSet:基于红黑树实现,有着基于元素key的排序算法

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值