1. int最大值: 2^31- 1 = 24..... 共十位   long 20位,       更大的用:BigInteger: 任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的
  2. Stack.empty()或者Stack.isEmpyt()都行,queue、ArrayList.isEmpyt()  判断空可以用*.size()==0
  3. int[][] a1= {{},{}};  数组长度,内层为0,外层为2    a1.length ,   字符串a="afdfa"   a.length()
  4. A ={{1,2,3,4,5,6,7,8},

        {8,7,6,5,4,3,2,1}}        A[0][3/2] =A[0][1]=2

      5. long new Date().getTime()  :    1493909710698

    long System.currentTimeMillis()  :1493909710698

    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(System.currentTimeMillis())   :2017-05-04 22:55:10

  6. int范围 :0x80000000  — 0x7fffffff  求负数的值,按位取反+1后再填一个负号。

        7.  比较器升序降序:

   8.

方法区:
  1.又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
  2.方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
栈内存(堆栈): 每个线程包含一个栈区,分为3个部分:基本类型变量区(放基本数据类型及对象引用,当程序运行到超过变量作用域时,java自动释放掉此空间。)、执行环境上下文、操作指令区(存放操作指令)。
  |-- 静态存储分配: 编译时确定的每个数据的存储空间大小,并在编译时分配(要求代码中不许有可变数据结构或嵌套递归的存在)。
  |-- 栈式分配,在开始运行时需要知道占用多大的空间。
堆内存: new创建的对象和数组,由jvm自动垃圾回收器管理,堆内存的速度比栈内存要慢。

 effective java中的一些设计原则( 通用程序设计原则):

  RAM: 断电无

    堆区: new 对象的位置

    栈区:引用和基本数据类型

    静态存储区: static final (数据区) String, BigInteger

  ROM:断电任有数据

  寄存器: cpu内部由编译器自动分配

 

  一. 避免创建不必要的对象(少用new):

      1.  例如单例设计思想中,通过调用函数返回对象的实例,getInstance()而不是new Object()

      2.  少用装箱对象类型(对象,初始为null),多用基本数据类型,多int,少Integer

      3.  及时清除过期引用,比如用数组实现栈时,栈pop()操作,应该把对应位置的引用置为null,而不仅仅是修改索引位置

      4. 覆盖Object的equals(当且仅当引用指向同一个对象时,才相等,引用里存放着相同的地址信息。 ==比较的就是是否是同一个对象。)方法时,

        也要覆盖hashcode(java原则,equals相同的对象,hashcode应该也相同)。 覆盖了hashcode时,一般也要重写toString方法,让此方法的返回结果显得有意义点。

        

         Integer i; if(i == 1)  空指针异常,i会自动拆箱,然而拆的过程中,由于是null,所以异常。

      5. 选择返回0长度数组或者集合而不是null,因为0长度的对象可以实现被共享。

      6. List.remove()参数有两种,一个是Object,一个是index,优先会使用的是index方法,如果要使用Object,要手动装箱转换成对象

        list.remove(1)  list.remove((Integer)1)

      7. Arrays.asList(T... a)、Arrays.toString()

        

 

 二.  使用Override注解,这样编译器可以帮助你检查方法是否实现了重写:

      1. 父类引用指向子类对象时,调用方法,编译看左边,运行看右边,先找子类的此方法,没有才从父类找;

        但是如果是方法的重载,不存在继承关系时,编译看左边,同时也就选择了运行时要调用的那个重载方法。

      2. 使用接口引用指向实现类,扩展性强一点。

   三. 一些小原则:

    1. 将局部变量作用域最小化(在第一次使用它的位置将它声明) : for(int i = 0; i< 3;i++) 而不是 int i= 0; while(i++ < 3)

              2. for Each循环优先于for索引循环,所以当你自定义表示一组元素时,可以让他实现iterable接口,这样它就可以用for each循环了,很方便。

      但是当需要对元素进行删除,修改操作是,还是要用iterator

      

    3. 多使用现成类库,少写轮子。毕竟关注类库的人会很多,大家为了优化而投入的精力怎么也比你一个人在实现某个功能上花费的时间多。

      熟悉常用的包,lang,utils,io包。 

    4. 如果要精确表达,需要用int,long,bigInteger(用的较少),BigDecimal,不能用float,double。即使需要小数,也可以先把小数换成整数处理,

      浮点数是会损失精度的。

      BigDecimal的实现利用到了BigInteger, 所不同的是BigDecimal加入了小数位的概念,比如BigDecimal d = new BigDecimal(new BigInteger(ib),5);

      5表示的是5个小数位。BigDecimal可以用来做超大的浮点数的运算

       5. 少用反射,性能损失。(获取构造函数,方法和字段)动态代理就是利用发射实现。

     6. 谨慎优化,先实现功能再优化,盲目优化反而可能会弄出更多问题。

    7.  定义类时,做好信息隐藏,私有化做好。默认的权限为包内私有,即包内不同类之间可以相互访问

    8.   serializable 不要随便实现,序列化一旦实现,其子类也必须使用这种序列化,要考虑好通用性,拓展性。如果用默认的序列化,那默认反序列化就可以读取信息,

        会造成私有字段的暴露,不安全。所以要自定义序列化方式。

      serialVersionUID的用图,就是唯一标识,用来标记,对应着它自己的序列化方式。

          9. 函数定义时,增强可读性,见词知意,别人也好读懂。  字段私有化,添加set 和get方法,恰好让其他人通过get就可以知道自己的类里有哪些字段了,知道此类有什么

        属性了,对类的功能也更好了解点。

        包:  com.bupt

        类,接口: GoodPerson

        函数:  eatFood()

        final static : MAX_VALUE