Java--常用类及内存分析

   不晓得怎么回事,之前写的这篇blog被删了,我觉得这是JAVA里理解内存的入门,必不可少,因此再调重点重写了一遍。

一、Java中内存的分析

  1. 内存分析图如下
    同样的,我先在word上画了个图
    Java--常用类及内存分析_第1张图片

二、常用类

  1. 数组
    1). 数组:数组里的数据类型可以是任意的,包括自定义的
    2). 一维数组:

    • 声明:数组声明不能创建对象本身,而是创建一个引用
      int a[];// 不能指定长度
      另:int[ ] s1, s2; // s1,s2都是整型数组
      int s1[], s2; // s1是整型数组,s2是整型变量
      s1 = new int[10];
    • 初始化:默认方式;动态初始化;静态初始化

    3). 二维数组:

    • 声明:
      a). int[ ][ ] a = new int [3][3];
      b). 二维数组的第二维大小可不相等
      int[ ][ ] a = new int [3][ ]; //先指定第一维
      a[0] = new int[3]; //再第二维分配
      a[1] = new int[3];
      a[2] = new int[4];
      • 二维数组的初始化:int a[][] = new int[3][];
        a). 一个个初始化:a[0] = new int[1];
        a[0][1] = 0;
        b) .一行行初始化: a[0] = new int[]{1, 2, 3};
  2. String|StringBuilder|StringBuffer
    1). String类里的常用方法,我这里就不做说明了,自己常看API。

    String的几个注意点请读懂如下代码,我已经做了详细的注释说明。

/** * 1. equals()只要内容相同即可为true * == 必须地址相同 * 2. 两种创建String对象的方式:构造方法、常量池创建 * @author Fanff * */
public class TestString {
    public static void main(String[] args) {
        // 通过构造方法创建对象
        String s1 = new String("abc");
        // 用字面量(字符串常量)创建对象,即上述内存分析中的栈中的变量直接指向方法区中的常量池
        // 这种方式不用每次开辟新的空间,属于享元设计模式
        String s2 = "abc";

        System.out.println(s1 == s2);// false
        // 直接等价于abc,并不是a、b、c分别创建了一个对象
        String s3 = "a" + "b" + "c";
        System.out.println(s2 == s3);// true
        String s4 = "a" + "b";
        /* * 这种方式等价于 new StringBuffer(s4).append("c") * 每次这样加一次都要 new StringBuffer() */
        String s5 = s4 + "c";
        String gh = "a";
        for (int i = 0; i < 3; i ++)// 新创建了3个对象
        {
            gh += i;
        }
        System.out.println(s2 == s5);// false
        System.out.println(s2.equals(s5));// true
    }
}

下面重点谈String|StringBuilder|StringBuffer的区别
A. 整体的区别:
String 字符串常量
StringBuffer 字符串变量(线程安全)
StringBuilder 字符串变量(非线程安全)
B. 速度与性能上:
a). String:不可变的对象,因此每次对String类型进行改变时其实都是等同于生成了一个新的String对象,然后将指针指向新的String对象,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM的GC就会开始工作了,此时速度一定会相当慢了。(关于JVM的内存回收问题,参见我的第一篇JAVA类blog http://blog.csdn.net/u014294166/article/details/45790007)
a). StringBuffer:对象在改变内容时是对对象本身进行操作,而不是“生成新的对象,改变对象的引用”。
c). 由于StringBuffer较StringBuilder的做了线程控制,速度较慢。大多数情况下的速度比较:StringBuilder>StringBuffer>String
C. 使用情形上分析:
综上所述,经常改变内容的字符串最好不要用 String,

三、与时间相关的类:Date与Calendar类

Java--常用类及内存分析_第2张图片
在标准Java类库中包含一个Date类,它的对象表示一个特定的瞬间,精确到毫秒,是从标准纪元1970.1.1的0点开始到某个时刻的毫秒数,类型是long

/** * 测试Date类的方法 * @author Fanff * */
public class TestDate {
    public static void main(String[] args) {
        Date d1 = new Date();// 默认的是当前的时间
        // Date中很多方法被弃用了,但是格式化日期是比较好的被保留
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss");
        System.out.println(sdf.format(d1));
    long t = System.currentTimeMillis();// 当前的时间以毫秒为单位
        System.out.println(t);
        Date d2 = new Date(1000);// 从初始的1970 00:00:00开始后的1000毫秒
        d2.setTime(2000);// 从初始的1970 00:00:00开始后的2000毫秒
        d1.before(d2);// boolean
        d1.before(d2);// boolean
        System.out.println(d1.getYear());//被弃用 以1900为基础的,即输出的是当前年份-1900
        System.out.println(d1.getMonth());//被弃用 从0为开始的到11
        // 从初始的1970 00:00:00开始到现在的毫秒数
        System.out.println(d1.getTime());
    }

   // 将日期字符串转换成对应格式的日期
   public static Date stringToDate(String dateString){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return sdf.parse(dateString);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        }
    }
}
public class CalendarDemo {
    public static void main(String[] args) {
        // test1();
        // test2();
        test3();
    }

    public static void test1() {
        // Calendar是一个抽象类是无法实例化的,这里获得是其子类的对象
        Calendar c = Calendar.getInstance();
        // get相关的常量,可以获得所有跟时间有关的信息
        System.out.println(c.get(Calendar.YEAR));// 年
        System.out.println(c.get(Calendar.MONTH) + 1);// 月
        System.out.println(c.get(Calendar.DATE));// 天
        System.out.println(c.get(Calendar.DAY_OF_MONTH));// 今天是一个月中的第几天
        System.out.println(c.get(Calendar.DAY_OF_WEEK));// 今天是一个星期中的第几天,星期日是第一天
        System.out.println(c.get(Calendar.DAY_OF_WEEK_IN_MONTH ));// 这个星期是当前月中的第几个星期
    }

    // Date与Calendar配合使用
    public static void test2(){
        Date d = new Date();
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        System.out.println(c.getTime());// Tue Apr 07 19:43:43 CST 2015
        c.setTimeInMillis(1000);// 从初始的1970 00:00:00开始后的1000毫秒
        System.out.println(c.getTime());// Thu Jan 01 08:00:01 CST 1970因为与北京时间的时差
    }

    // 日期的加减运算
    public static void test3(){
        Date d = new Date();
        Calendar c = Calendar.getInstance();
        c.setTime(d);
        c.add(Calendar.MONTH, 3);// 加3个月
        c.add(Calendar.WEDNESDAY, 5);// 加5个星期
        System.out.println("加之后的日期为" + c.get(Calendar.YEAR)
                + "-" + (c.get(Calendar.MONTH) + 1) + "-"
                + c.get(Calendar.DATE));
    }
}

你可能感兴趣的:(java,内存)