一.Deque(双端队列)
1.peek和poll方法
//peek:检索头部元素但不会删除
//peekFist:头部不删除
//peekLst:尾部不删除
//poll:检索头部元素并且删除
//pollFist:头部并且删除
//pollLast:尾部并且删除
2.push和pop方法
//push:压栈(添加到头部)
//pop:出栈(得到头部元素并且弹出)
二.Queue(单向队列)
例: GMS系统
要求
- 1.构建数据结构Deque
- 2.大小不能超过10
- 3.构建物流对象Goods:
- 3.1 主键id
- 3.2 产品名称name
- 3.1 产品价格price
- 3.2 产品入库时间
- 4.根据当前入库时间的毫秒数进行添加,当超过10以后,删除掉首项,并且提示仓库已满
class Goods{
private Integer id;
private String name;
private double price;
private Date date;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public class GoodsManagerSystem {
public static void main(String[] args) throws InterruptedException {
Deque<Goods> deque=new LinkedList<>();
System.out.println(deque.size());
int i=0;
while(deque.size()<10){
i++;
Goods good=new Goods();
good.setId(i);
good.setName("物品"+i);
good.setPrice(i*10);
//获得当前时间
Date date=new Date();
//获得时间毫秒
Long l=date.getTime();//后期针对毫秒数可以进行排序
good.setDate(date);
//添加到队列中
deque.offer(good);
Thread.sleep(1000);//作用:每1000毫秒执行一次
System.out.println("商品"+good.getName()+"正在入库...");
}
Goods g=deque.poll();
System.out.println("仓库已接近临界点+"+
g.getName()+"还未被取走");
}
}
三.比较
ArrayList----有序可重复,有下标,可以在中间进行删除,修改添加,查询.删除和修改的效率低,查询遍历效果好,
主要原因它的结构是数组的底层
LinkedList---删除和修改的效率高,但是查询效率低,需要逐个遍历,主要是因为链表的结构
Deque--------双端队列,可以前后进行,添加,首尾查询,删除,
add() addLast addFirst offer.....element
poll:移除首项元素并且删除,返回当前元素对象
peek:得到首项元素但不删除
包含可以使用栈结构的方法push,pop
Queue--------单向队列,可以进行,添加单方向添加,查询,删除
区别于Deque,无push和pop方法
并且只有六个方法:add() element() offer() peek() poll() remove()
四.比较器Collections
1.重写对象的comparable接口后
//大于0:一般和默认的自然排序一致,升序
//小于0:相反,降序
//等于0:当两个对象需要比较的数据一致,以插入顺序为准
2.当我们需要临时修改排序规则时,直接在比较方法中使用匿名内部类的方式来规定排序规则,一般在排序规则多变的时候建议使用
五.Map<K,V>
//定义map时,K的hashcode一定要重写!
//K的hashcode值决定了存放位置,以及去重等,,,
//建议equals也重写
- 迭代::两种
1.keySet 键值Set集合—>使用迭代器或者增强for循环迭代即可然后根据key得到vale–>get
2.entrySet 键值对集合,一组一组值的集合
例. 判定当前字符串中有多少个字符是一样的,并且将字符放到key保存 数量放到value保存
public class ContainsKeyTest {
public static void main(String[] args) {
String s="dfafdjkhalfkhdk,l";
//去空格,或者其他符号,比如逗号之类的
s=s.replaceAll("[^a-zA-Z]+", "");
//Map<字符,字符的个数>
Map<Character,Integer> map=new HashMap<>();
char[] ch=s.toCharArray();
for(int i=0;i<ch.length;i++){
//判定,如果存在,重新添加覆盖以前的数据,并且value+1
if(map.containsKey(ch[i])){
map.put(ch[i], map.get(ch[i])+1);
}else{//如果没有,将该字符添加到map中,数量初始置位1
map.put(ch[i], 1);
}
}
System.out.println(map);
}
}
Hashtable和HashMap的区别
- Hashtable:线程安全的 k和v不能为空的
- HashMap:线程不安全的 map可以都为空