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)); } }
相关文章推荐
- JSON复杂数据处理之Json树形结构数据转Java对象并存储到数据库的实现
- 【集合框架】JDK1.8源码分析之LinkedHashMap(二)
- java中不能用小数点(.)来做分隔符
- 安卓开发环境(eclipse)搭建-(win7,32位)
- 使用Java构造和解析Json数据的两种方法(详解二)
- 使用Java构造和解析Json数据的两种方法(详解一)
- java.util.Properties类的使用详解
- Myeclipse10中 如果出现不小心删掉了某些类和包,进行数据回复
- cannot be cast to javassist.util.proxy.Proxy
- 归并排序 java
- JAVA使用Gson解析json数据实例解析
- Java 基础知识
- myeclipse10 中的UTF-8 设置
- java中的移位操作
- Java的作业调度类库Quartz基本使用指南
- Java .作业1
- Java堆内存
- maven大型互联网企业架构 SpringMVC Mybatis Shiro
- Spring 实践 -AOP
- Spring 实践 -AOP