Java集合——Map、栈、队列

Map

k-v

public class Demo {

	public static void main(String[] args) {
		Map<String,Object> map=new HashMap<>();
		map.put("a", 11);
		map.put("b","zy");
		//key同,是修改value值
		map.put("b","aa");
		map.put("c","t");
		map.remove("c");
		//获取一个不存在的键值对,返回null
		System.out.println(map.get("c"));
		map.put("name", new Emp("zhang"));
		System.out.println(map.containsKey("name"));
		System.out.println(map.containsValue(18));
		 
		//遍历
		//set无序
		//获取所有key
		Set<String> keys=map.keySet();
		for(String key:keys) {
			System.out.println(key+":"+map.get(key));
		}
		System.out.println("=======================");
		//第二种
		Set<Entry<String,Object>> s=map.entrySet();
		for(Entry<String,Object> entry:s) {
			System.out.println(entry.getKey()+"="+entry.getValue());
		}
		System.out.println("=======================");
		//第三种
		map.forEach((k,v)->{System.out.println(k+":"+v);});
		
		//只获取value
		Collection<Object> v=map.values();
		for(Object obj:v) {
			System.out.println(obj);
		}
		
		//可为空
		map.put(null,null);
	}

}

HashMap和HashTable区别
线程是否安全:HashTable安全, HashMap不安全的
key/value:HashTable不可以为null, HashMap可以为null

练习:
接收键盘输入一个字符串,统计字符的个数

Scanner sc=new Scanner(System.in);
		System.out.println("输入一个字符串:");
		String str=sc.next();
		Map<Character,Integer> map=new HashMap<>();
		for(int i=0;i<str.length();i++) {
			char key=str.charAt(i);
			if(!map.containsKey(key)) {
				map.put(key, 1);
			}else {
				map.put(key, map.get(key)+1);
			}
		}
		map.forEach((k,v)->{System.out.println(k+":"+v);});

结果:

输入一个字符串:
abcdddd
a:1
b:1
c:1
d:4

先进后出
可以由数组实现 Stack,由链表实现LinkList
push,pop peek

  //栈:先进后出
				Stack<String> stack=new Stack();
				//如果没有元素,不管哪个方法(peek()或pop()),都抛异常 java.util.EmptyStackException 
				System.out.println(stack.peek());
				System.out.println(stack.pop());

在这里插入图片描述

        Stack<String> stack=new Stack();
        //Push表示压栈
        stack.push("hello");
        stack.push("a");
		stack.push("b");
		System.out.println(stack);
		//pop()返回栈顶元素,并且元素从栈顶弹出
		System.out.println(stack.pop());
		//peek()返回栈顶元素,但元素并没有从栈顶弹出
		System.out.println(stack.peek());
		System.out.println(stack);
	

结果(栈底到栈顶显示):

[hello, a, b]
b
a
[hello, a]
//从栈顶到栈底显示
		LinkedList<String> list=new LinkedList<>();
		list.push("hello");
		list.push("a");
		list.push("b");
		System.out.println(list);
		System.out.println(list.pop());
		System.out.println(list.peek());
		System.out.println(list);

结果(从栈顶到栈底显示):

[b, a, hello]
b
a
[a, hello]

队列

队列:先进先出
offer,poll,peek

        LinkedList<String> list=new LinkedList<>();
		//队列没元素时,返回null
		System.out.println(list);
		list.offer("a");//入列
		list.offer("b");
		list.offer("c");
		//出列
		System.out.println(list.poll());//真出
		System.out.println(list.peek());//假出
		System.out.println(list);

结果:

[]
a
b
[b, c]

练习:
1.使用数组完成栈

class ArrStack {

	private String[] data = new String[10];
	private int size = 0;

	public String peek() {
	    if(size==0){
                try {
					throw new Exception("????");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
             }
            //返回最后添加的字符串
            return data[size-1];
	}
	public String pop() {
	     String str = this.peek();
	     size--;
         return str;
	}
        //数组扩容2倍的长度
	public void push(String str) {
          //数组扩容
		data=Arrays.copyOf(data,2*data.length);
          //数据添加到数组
		data[size]=str;
          //size++
		size++;
	}
}
public class ArrStackDemo {

	public static void main(String[] args) {
		ArrStack arrStack=new ArrStack();
		arrStack.push("a");
		arrStack.push("b");
		System.out.println(arrStack.pop());   //b
		System.out.println(arrStack.peek());    //a

	}
}

2.使用链表完成栈

class LinkStack {
	private int size = 0;
	private Node first;
    public void push(String str) {
		Node node=new Node(null,str);
		if(size==0) {
			this.first=node;
		}else {
			//注意先后顺序
			this.first=node;
			node.next=this.first;
		}
		size++;
	}
	public String peek() {
		if(size==0){
            try {
				throw new Exception("????");
			} catch (Exception e) {
				e.printStackTrace();
			}
         }
        //返回最后添加的字符串
		return this.getNode(size-1).data;
	}
    // 获取指定位置的节点
	 Node getNode(int index) {
		Node node=this.first;
		for(int i=0;i<index;i++) {
			node=node.next;
		}
		return node;
	}
	public String pop() {
		
	}
	private class Node {
		Node next;
		String data;
		public Node(Node next, String data) {
			super();
			this.next = next;
			this.data = data;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值