java 小代码

Author Avatar ZTFtrue 发表于 • 2018年02月05日 15:17 • 共 • 278 • 次浏览
list.contains("abc");  // 判断list是否包含abc字符串 包括ab

finalize 回收非java资源内存 不必掌握(防止某些面试官)
垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。

protected void finalize( )
{
// finalization code here
}
  • Arraylist 与 LinkedList 区别 LinkedList 与 ArrayList 一样实现 List 接口,只是 ArrayList 是 List 接口的大小可变数组的实现,LinkedList 是 List 接口链表的实现。基于链表实现的方式使得 LinkedList 在插入和删除时更优于 ArrayList,而随机访问则比 ArrayList 逊色些。

  • ArrayList 与 Vector 区别

    • Vector是线程安全的, 也就是线程同步的, 而ArrayList是线程序不安全的
    • ArrayList与Vector都有一个初始的容量大小, 当存储进它们里面的元素的个数超过了容量时, 就需要增加ArrayList与Vector的存储空间, Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍).ArrayList与Vector都可以设置初始的空间大小, Vector还可以设置增长的空间大小, 而ArrayList没有提供设置增长空间的方法.
  • http://wiki.jikexueyuan.com/project/java-collection/hashtable.html

  • ConcurrentHashMap 重要

LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。

和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。

StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。

http://www.runoob.com/servlet/servlet-life-cycle.html

ArrayList,LinkedList,Vector,Stack之间的区别 http://blog.csdn.net/a19881029/article/details/45533733

https://docs.oracle.com/javase/9/docs/api/java/util/Queue.html

 
http://blog.csdn.net/kerryfish/article/details/24309617


import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Stack;

class Node{
    public int value;
    public Node left;
    public Node right;
    public Node(int v){
        this.value=v;
        this.left=null;
        this.right=null;
    }

}
class BinaryTreeTraversal {
    /**
     * @param root 树根节点
     * 递归先序遍历
     */
    public static void preOrderRec(Node root){
        if(root!=null){
            System.out.println(root.value);
            preOrderRec(root.left);
            preOrderRec(root.right);
        }
    }
    /**
     * @param root 树根节点
     * 递归中序遍历
     */
    public static void inOrderRec(Node root){
        if(root!=null){
            preOrderRec(root.left);
            System.out.println(root.value);
            preOrderRec(root.right);
        }
    }
    /**
     * @param root 树根节点
     * 递归后序遍历
     */
    public static void postOrderRec(Node root){
        if(root!=null){
            preOrderRec(root.left);
            preOrderRec(root.right);
            System.out.println(root.value);
        }
    }
    /**
     *
     * @param root 树根节点
     * 利用栈实现循环先序遍历二叉树
     * 这种实现类似于图的深度优先遍历(DFS)
     * 维护一个栈,将根节点入栈,然后只要栈不为空,出栈并访问,接着依次将访问节点的右节点、左节点入栈。
     * 这种方式应该是对先序遍历的一种特殊实现(看上去简单明了),但是不具备很好的扩展性,在中序和后序方式中不适用
     */
    public static void preOrderStack_1(Node root){
        if(root==null)return;
        Stack<Node> s=new Stack<Node>();
        s.push(root);
        while(!s.isEmpty()){
            Node temp=s.pop();
            System.out.println(temp.value);
            if(temp.right!=null) s.push(temp.right);
            if(temp.left!=null) s.push(temp.left);
        }
    }
    /**
     *
     * @param root 树的根节点
     * 利用栈模拟递归过程实现循环先序遍历二叉树
     * 这种方式具备扩展性,它模拟递归的过程,将左子树点不断的压入栈,直到null,然后处理栈顶节点的右子树
     */
    public static void preOrderStack_2(Node root){
        if(root==null)return;
        Stack<Node> s=new Stack<Node>();
        while(root!=null||!s.isEmpty()){
            while(root!=null){
                System.out.println(root.value);
                s.push(root);//先访问再入栈
                root=root.left;
            }
            root=s.pop();
            root=root.right;//如果是null,出栈并处理右子树
        }
    }
    /**
     *
     * @param root 树根节点
     * 利用栈模拟递归过程实现循环中序遍历二叉树
     * 思想和上面的preOrderStack_2相同,只是访问的时间是在左子树都处理完直到null的时候出栈并访问。
     */
    public static void inOrderStack(Node root){
        if(root==null)return;
        Stack<Node> s=new Stack<Node>();
        while(root!=null||!s.isEmpty()){
            while(root!=null){
                s.push(root);//先访问再入栈
                root=root.left;
            }
            root=s.pop();
            System.out.println(root.value);
            root=root.right;//如果是null,出栈并处理右子树
        }
    }
    /**
     *
     * @param root 树根节点
     * 后序遍历不同于先序和中序,它是要先处理完左右子树,然后再处理根(回溯),所以需要一个记录哪些节点已经被访问的结构(可以在树结构里面加一个标记),这里可以用map实现
     */
    public static void postOrderStack(Node root){
        if(root==null)return;
        Stack<Node> s=new Stack<Node>();
        Map<Node,Boolean> map=new HashMap<Node,Boolean>();
        s.push(root);
        while(!s.isEmpty()){
            Node temp=s.peek();
            if(temp.left!=null&&!map.containsKey(temp.left)){
                temp=temp.left;
                while(temp!=null){
                    if(map.containsKey(temp))break;
                    else s.push(temp);
                    temp=temp.left;
                }
                continue;
            }
            if(temp.right!=null&&!map.containsKey(temp.right)){
                s.push(temp.right);
                continue;
            }
            Node t=s.pop();
            map.put(t,true);
            System.out.println(t.value);
        }
    }
    /**
     *
     * @param root 树根节点
     * 层序遍历二叉树,用队列实现,先将根节点入队列,只要队列不为空,然后出队列,并访问,接着讲访问节点的左右子树依次入队列
     */
    public static void levelTravel(Node root){
        if(root==null)return;
        Queue<Node> q=new LinkedList<Node>();
        q.add(root);
        while(!q.isEmpty()){
            Node temp =  q.poll();
            System.out.println(temp.value);
            if(temp.left!=null)q.add(temp.left);
            if(temp.right!=null)q.add(temp.right);
        }
    }
}
  • Java 中共有 53 个标识符或称为保留字,其中 50 个为关键字(goto, const 目前尚未使用);另外 3 个是值,这 3 个值为 true, false 和 null

  • i+++j如何计算?(这个问题在 C/C++ 中不讨论) 答:根据贪心规则,前置++优于后置++,结果是(i++)+j、

  • i++和++i其实都是先+1,再赋值。++i,没什么好说的;i++,以j=i++;为例在底层的实现是:temp = i;i = i + 1; j = temp; 所以,i=15;i=i++;这个表达式的结果是15.(因为加一之后又执行了一次赋值,从16变回15)

  • +0与-0在浮点类型变量存储中,符号位是不同的。当-0和+0参与浮点类型的相关运算(例如相除与求余运算)时,可以产生不同的结果。

最后编辑于 • 2018年03月19日 14:44 •  
1 回复
avatar
0
发放红包 2018年02月05日 23:47   # 1 楼

😂

其实这个网站本身就有打算要做成技术微博。

看到你将这个网站当成技术微博了。

😄

你尚未登录,无法进行回复。