java-容器

集合分类:
Set : 无序,并且放进集合中的对象不能重复。
List: 有序(放入的先后的次序), 放进集合中的对象可以重复。
Map : 集合中的每一个元素包含一对键对象和值对象,集合中没有重复的键对象,
值对象可以重复。(Key - Value)
一.Collection接口
List接口
List接口、Set接口继承于Collection接口
ArrayList 底层数据结构是数组,查询快,增删慢;线程不安全,效率高
Vector 底层数据结构是数组,查询块,增删慢;线程安全,效率低(几乎已经淘汰)
LinkedList 底层数据结构是链表,查询慢,增删快;线程不安全,效率高
记录插入顺序、可以重复、可以null值的集合
Set接口
HashSet 1.不能保证元素的添加顺序;底层采用哈希表算法,查询效率高,
即要求存入HashSet中的元素要重写equals()方法和hashCode()
方法,不可重复,如果不重写hashCode()和equals()方法则会允许
语义上的重复;
2.不能重复、无序、不是线程安全的、集合元素可以为NULL;
LinkedHashSet
1.底层采用链表和哈希表的算法,链表保证元素的添加顺序,哈希
表保证元素的唯一性
2.不可以重复、记录插入顺序、不是线程安全的、集合元素可以为
NULL;
TreeSet
原理:实现了SortedSet接口,采用的是红黑树算法决定它的存储
位置
特点:不可重复、有序、不能放入null值,不是线程安全的;
排序:
**自然排序:**要求放入其中的类必须实现Comparable接口,所以不
能放入null元素,TreeSet中不能存放基本数据类型的数据,只能
加入相同类型对象或者是父类型的对象,否则会抛出ClassCastEx
ception
treeSet总是把compareTo()比较得出较小的放到集合前端。
JDK类库中实现了Comparable接口的一些类的排序方式:
Byte, Short, Integer, Long, Double, Float : 按数字大小排序;
Character : 按字符的Unicode值的数字大小排序;
String : 按字符串中字符的Unicode值排序;
**客户端排序:**构建TreeSet对象的时候直接就声明排序规则,使用
Comparator接口,实现了compare方法(与CompareTo方法类似)
treeSet 将compare()返回较小的放到前面。
优点: 这样就算没有实现Comparable接口的类的对象也能加入到TreeSet
集合中
Collection接口 声明了 Set接口 和List接口 的通用方法.
boolean add(Object o) 向集合中添加数据
Iterator iterator(); 获取集合的迭代器(迭代器用来遍历集合);
int size(); 返回集合中元素的数目;
void clear() 删除集合中的所有对象引用,即不再持有这些对象的引用;
contains(Obj) 判断在集合中是否持有特定对象的引用;
isEmpty() 判断集合是否为空;
remove(Obj) 从集合中删除一个对象的引用;
Object[] toArray() 返回一个数组,该数组包含集合中的所有元素;
forEach 遍历 Collection集合–> 加强for循环
for(String s : set){
syso(s);
}
遍历集合的三种方式:
1.使用iterator()方法遍历集合,使用while循环,再使用iter.hasNext()、iter.next()
Iterator it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
2.直接使用加强for循环遍历集合
for(String s:list) {
System.out.println(s);
}
3.只适用于List,因为List集合比Set集合多了一个下标的概念,使用for循环进
行遍历,适用于知道初始条件,根据集合的size()确定终止条件,使用for循环
再用get(i)进行获取值
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
list可以使用collection中的sort方法进行排序,而set不可以使用。
1.因为hashSet本身采用的是哈希表存储数据,方便查询,如果对hashSet集合
中的数据进行排序的话,那么哈希就没有起任何作用了;
2.而TreeSet实现了SortedSet接口,能够对集合中的对象进行排序;

Map接口
key不允许重复,value可以
HashMap:采用哈希表算法,此时Map中的key不会保证添加的先后顺序,
key也不允许重复,key判断重复的标准是:key1和key2是否equals
为true,并且允许存在一个为null的key,多个为null的value
LinkedHashMap:采用链表和哈希表算法,此时Map中的key会保证先后添加
的顺序,key不允许重复,key判断重复的标准与HashMap中的key
的标准相同
HashTable:采用哈希表算法,是线程安全的,也就是说是同步的,而HashMap
是线程不安全的,不是同步的,HashTable的key和value都不允许为null
TreeMap:采用红-黑树算法,此时Map中的key会按照自然顺序或指定排序
进行排序,key也不允许重复,key判断重复的标准是:CompareTo/
compare的返回值是否为0
三种遍历方式:
1.使用keySet()方法获得键值的集合Set,再用加强for循环遍历key值,使用
map.get(key)
Set keySet = map.keySet();
for(Object key: keySet){
System.out.println(key+"----"+map.get(key));
}
2.使用keySet()方法获得键值的集合Set,再用iterator去遍历键值集合
Set entrySet = map.entrySet();
for(Entry a: entrySet){
System.out.println(a.getKey()+"--------"+a.getValue());
}
3.使用entrySet()获得键值对的引用的集合Set,再使用加强for循环,使用
getKey()、getValue()方法
Set keySet = map.keySet();
Iterator itKey = keySet.iterator();
while(itKey.hasNext()){
Object key = itKey.next();
System.out.println(key + “—”+map.get(key));
}
总结:keySet()的速度比entrySet()慢了很多,也就是keySet方式遍历Map的
性能不如entrySet性能好
为了提高性能,以后多考虑用entrySet()方式来进行遍历

写MyStack类,实现栈功能。在类中使用ArrayList保存数据。

package com.briup.day11;
import java.util.*;
/*
 * 实现堆栈功能
 * 使用ArrayList保存数据
 */
public class MyStack {
	 List<Integer> list= new ArrayList<Integer>();
	 Iterator it = list.iterator();
	 int index = 0;
	 public MyStack(){
		 
	 }
	 public void push(Integer i){
		 list.add(i);
		 index++;
	 }
	 public Integer pop(){
		 if(!(list.isEmpty())){
			 index--;
			 return (Integer)list.remove(index);
		 }
		 return null;
	 }
}

写MyQueue类,实现队列功能。在类中使用ArrayList保存数据。

package com.briup.day11;
import java.util.*;
/*
 * 实现队列功能
 *使用ArrayList保存数据
 */
public class MyQueue {
	
	List<Integer> list = new ArrayList<Integer>();
	Iterator it = list.iterator();
	int index = 0;
	public MyQueue(){
		
	}
public void in(Integer i) {
	list.add(i);
	index++;
}
public Integer out(){
	if(!(list.isEmpty())){
		Integer temp = 0;
		temp = (Integer)list.get(0);
		list.remove(0);
		index--;
	return temp;
	}
	return null;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值