CPU缓存对数组友好而对链表不友好
原因:CPU读取内存的时候,会把一片连续的内存块读取出来,然后放到缓存中。数组简单易用,在实现上使用的是连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,所以访问效率越高。而链表在内存中并不是连续存储,所以对CPU缓存不友好,没有办法预读。
栈应用
检查符号是否成对出现
/*** 1、括号间的对应规则存放在 Map 中;* 2、创建一个栈。遍历字符串,如果字符是左括号就将对应的右括号直接加入stack中,否则将stack 的栈顶元素与这个括号做比较,如果不相等就直接返回 false。遍历结束,如果stack为空,返回 true。*/public static boolean stackdemo(String s){//创建栈Stack<String> stack = new Stack<>();//括号直接的对应规则Map<Character,Character> map = new HashMap<>();map.put('(',')');map.put('{','}');map.put('[',']');//假设修正法,假设是匹配的boolean flag = true;//遍历字符串,拆解字符串获取字符for (int i =0;i<s.length();i++){//获取当前字符char c = s.charAt(i);//如果是左括号,把对应的右括号放入栈中if (map.containsKey(c)){stack.push((map.get(c).toString()));}//如果是有括号,与栈顶元素进行匹配//c==')'|c==']'|c=='}'if (map.containsValue(c)){//字符串开头为右括号,则不对称if (stack.empty()){flag=false;break;}//弹出栈顶元素,看是否对称String pop = stack.pop();if (pop.charAt(0)!=c){flag=false;}}}//如果字符串最后为左括号,则不对称if (!stack.empty()){flag=false;}//返回flagreturn flag;}
