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;
}
}
}