您的位置:首页 > 编程语言 > Java开发

Java--常用类及内存分析

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


一、Java中内存的分析

内存分析图如下

同样的,我先在word上画了个图



二、常用类

数组

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

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 /article/3667493.html)

a). StringBuffer:对象在改变内容时是对对象本身进行操作,而不是“生成新的对象,改变对象的引用”。

c). 由于StringBuffer较StringBuilder的做了线程控制,速度较慢。大多数情况下的速度比较:StringBuilder>StringBuffer>String

C. 使用情形上分析:

综上所述,经常改变内容的字符串最好不要用 String,

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



在标准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));
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: