String常量池:

JVM在使用字符串类型时,为了提高内存使用效率,当使用字面量(常量)给变量赋值时,在方法区内提供了用于存储字面量对象的一个常量池.

原理:

当使用字面量赋值时,先去方法区内的常量池中查询是否有相同字面量的对象.如果有则返回常量池中对象的地址,若没有则在常量池中创建此字面量的对象再返回.

可以看看下面的实例:

public class Tests {

public static void main(String[] args) {

//使用构造器创建两个helloworld字符串对象

String s1 = new String("helloworld");

String s2 = new String("helloworld");

//查看s1与s2是不是同一个对象

System.out.println("s1与s2:"+(s1==s2));

System.out.println("s1与s2内容对比:"+s1.equals(s2));

String s3 = "helloworld";

String s4 = "helloworld";

System.out.println("s2与s3:"+(s2==s3));//false;说明s2与s3不是同一个对象

System.out.println("s3与s4:"+(s3==s4));//true;是同一个对象

String s5 = "hello";

String s6 = "world";

/*编译器在编译期间会进行一些简单的运算

*

*将两个字面量"hello"与"world"拼接成了

* "helloworld"

* */

String s7 = "hello"+"world";

System.out.println("s4与s7:"+(s4==s7));

String s8 = s5+"world";

System.out.println("s4与s8:"+(s4==s8));

String s9 = s5+s6;

System.out.println("s4与s9:"+(s4==s9));

System.out.println("s8与s9:"+(s8==s9));

}

}

运行结果:

s1与s2:false

s1与s2内容对比:true

s2与s3:false

s3与s4:true

s4与s7:true

s4与s8:false

s4与s9:false

s8与s9:false

包装类的常量池:

首先看看包装类与基本数据类型的对应关系:

基本数据类型

包装类

byte

Byte

short

Short

int

Integer

long

Long

float

Float

double

Double

char

Character

boolean

Boolean

除int和char有所不同之外,其余的都是首字母变大写.

Boolean与Character直接继承自Object类,其余的则继承自Numbers类,而Numbers则继承自Object类.

当将基本数据类型进行自动装箱时,装箱后的对象的字面值,如果是在-128~127之间,会先检查常量池中是否有相同字面值的对象,如果有,则将常量池的对象的地址给引用变量,若没有则创建一个.

下面给出Integer包装类的各种情况

示例代码:

public class Tests {

public static void main(String[] args) {

/*首先定义一个基本数据类型的数据*/

int i=1;

/*包装类的常量池实验*/

Integer i1=1;

Integer i2=1;

Integer i3=new Integer(i);

Integer i4=new Integer(1);

System.out.println("i1与i2是不是同一个对象:"+(i1==i2));

System.out.println("i1与i2的equals方法:"+(i1.equals(i2)));

System.out.println("i2与i3是不是同一个对象:"+(i2==i3));

System.out.println("i2与i3的equals方法:"+(i2.equals(i3)));

System.out.println("i2与i4是不是同一个对象:"+(i2==i4));

System.out.println("i2与i4的equals方法:"+(i2.equals(i4)));

System.out.println("i3与i4是不是同一个对象:"+(i3==i4));

System.out.println("i3与i4的equals方法:"+(i3.equals(i4)));

/*小于-128大于127范围的情况,应该与i1与i2的情况进行对比:*/

Integer i5=128;

Integer i6=128;

System.out.println("i5与i6是不是同一个对象:"+(i5==i6));

System.out.println("i5与i6的equals方法:"+(i5.equals(i6)));

}

}

运行结果:

i1与i2是不是同一个对象:true

i1与i2的equals方法:true

i2与i3是不是同一个对象:false

i2与i3的equals方法:true

i2与i4是不是同一个对象:false

i2与i4的equals方法:true

i3与i4是不是同一个对象:false

i3与i4的equals方法:true

i5与i6是不是同一个对象:false

i5与i6的equals方法:true

总结:

八种包装类都是final修饰

一经创建,对象内容不可变

Character和Boolean的父类是Object其他六种的父类是Number类型,是抽象类.

Date

java.util.Date

封装了日期与时间的信息.之后里面的很多功能都弃用,渐渐的使用Calender类型来替代

构造器

Date():

创建一个封装当前系统时间的Date对象

Date(long time):

创建一个距离纪元time毫秒的Date对象

常用方法

long getTime();

返回距离纪元的毫秒数

void  setTime(long time);

修改时间对象的毫秒数

示例代码:

import java.util.Date;

public class TestDate {

public static void main(String[] args) {

/*创建一个Date对象*/

Date time = new Date();

System.out.println(time);

/*调用有参构造器,创建一个距离纪元 10亿毫秒的时间对象*/

Date time1 = new Date(1520000000000L);

System.out.println(time1);

System.out.println(time.getTime());

System.out.println(time1.getTime());

time.setTime(time.getTime()-3600000*24);

System.out.println(time.getTime());

System.out.println(time);

}

}

运行结果:

Sun Aug 19 10:44:05 CST 2018

Fri Mar 02 22:13:20 CST 2018

1534646645478

1520000000000

1534560245478

Sat Aug 18 10:44:05 CST 2018

SimpleDateFormat

作用

此类型可以对Date进行格式化,将字符串转成Date类型。

常用构造器

SimpleDateFormat(String format):

创建一个指定格式的SimpleDateFromat对象。

常用方法:

String format(Date date)

作用是将参数date按照构造器里的格式进行格式化成字符串

Date parse(String str)

作用是将指定字符串str转变成Date类型

常用格式:

yy/yyyy: 年

MM:月

dd:日

HH:时(24制)

hh:时(12制)

mm:分

ss:秒

a:上下午

E:星期

示例代码:

import java.text.ParseException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class Tests {

public static void main(String[] args) {

/*转换成Date类型 Date parse(String str)*/

String birth="1996/08/28";

SimpleDateFormat sdf1=new SimpleDateFormat("yyyy/MM/dd");

Date d= null;

/*需要用try...catch...进行处理.*/

try {

d = sdf1.parse(birth);

} catch (ParseException e) {

e.printStackTrace();

}

System.out.println(d);

/*格式化方法 String format(Date d)*/

Date now = new Date();

SimpleDateFormat sdf =

new SimpleDateFormat("MM-dd-yyyy HH:mm:ss E a");

String info = sdf.format(now);

System.out.println("时间:"+info);

}

}

运行结果:

Wed Aug 28 00:00:00 CST 1996

时间:08-19-2018 11:22:11 星期日 上午

Calendar

1.是日历类型,此类型封装了有关日历的所有信息,主要用于计算时间分量(日期和时间的一部分有效值).

2.是一个抽象类,提供了一个方法叫getInstance(),来获取一个通用的子类型对象.一般都是GregorianCalendar(格里高利历法,阳        历),获取的时间是执行到此行代码的系统时间值.

3.时间分量常量

static int YEAR/MONTH/DATE;

关于MONTH:日历里的月份是0-11.

static int DAY_OF_WEEK/MONTH/YEAR;

关于DAY_OF_WEEK:默认一周第一天为周日,计数为1-7.

.........

常用方法

提供了get(int field),通过指定时间分量常量来获取相应的时间分量的值.

提供了set(int field,int value),进行设置时间分量值..提供了add(int field,int value),用于增加对当前日历信息通过时间分量计算value后的日历信息.若value为负值,则表示向前推算.

int getActualMaximum(int field):获取当前时间分量所在的最大值.如指定Calendar.MONTH,表示月的最大值(11).Calendar.DATE,表示当前日历对象所在月份的最大值(8月,31).

示例代码:

import java.util.Calendar;

public class Tests {

public static void main(String[] args) {

/*时间分量*/

/*首先获取当前时间*/

Calendar c=Calendar.getInstance();

/*输出当前时间*/

System.out.println(c.getTime());

/*分别输出时间分量的值*/

System.out.println("当前时间的YEAR的值:"+c.get(Calendar.YEAR));

System.out.println("当前时间的MONTH的值:"+c.get(Calendar.MONTH));

System.out.println("当前时间的星期的值:"+c.get(Calendar.DAY_OF_WEEK));

/*可以看到星期的计数从1开始,第一天是星期日*/

/*月的计数0开始,第一个月是一月.*/

System.out.println("当前时间的HOUR的值:"+c.get(Calendar.HOUR_OF_DAY));

/*设置时间分量*/

c.set(Calendar.YEAR,2019);

c.set(Calendar.MONTH,1);

c.set(Calendar.DAY_OF_MONTH,19);

System.out.println("设置后的时间为:"+c.getTime());

/*对传入的参数进行加减,传入正数为加,传入负数为减*/

c.add(Calendar.MONTH,2);

c.add(Calendar.DAY_OF_MONTH,-2);

System.out.println("加减后的时间为:"+c.getTime());

/*获取当前时间分量的最大值*/

/*注意当前时间为刚刚设置的四月*/

System.out.println("当前月的最大值为:"+c.getActualMaximum(Calendar.DAY_OF_MONTH));

}

}

运行结果:

Sun Aug 19 11:55:14 CST 2018

当前时间的YEAR的值:2018

当前时间的MONTH的值:7

当前时间的星期的值:1

当前时间的HOUR的值:11

设置后的时间为:Tue Feb 19 11:55:14 CST 2019

加减后的时间为:Wed Apr 17 11:55:14 CST 2019

当前月的最大值为:30

java dateformat类_JAVA--常量池,Date类,SimpleDateFormat类与Calendar类相关推荐

  1. java 日历工具_java中强大的时间处理工具:Calendar类(日历类)

    java中的Calendar类为什么起个名字就叫做日历呢?因为这个类可以让我们像看日历一样得到这个时间的所有属性,你还在为不知道2014年5月7日是周几而苦恼吗?你还在为2005年8月14日是8月的第 ...

  2. java的知识点15——String基础、String类和常量池、String类常用的方法、字符串相等的判断、组合模式

    String基础 1. String类又称作不可变字符序列. 2. String位于java.lang包中,Java程序默认导入java.lang包下的所有类. 3. Java字符串就是Unicode ...

  3. java讲对象放在常量池的方法_java的常量池里面都放了些神马东西

    展开全部 理解Java常量池 JVM运行时数据区的内e69da5e6ba9062616964757a686964616f31333264656233存模型由五部分组成: [1]方法区 [2]堆 [3] ...

  4. java 常量池是什么_Java常量池理解与总结

    一.相关概念 什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Class文件中的常量池 在C ...

  5. Java中几种常量池的区分

    转载自  Java中几种常量池的区分 在java的内存分配中,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上 ...

  6. Java String类和常量池

    String 部分源码 学习笔记 package cn.jason.oop; /*** 测试字符串类的基本语法* 不可变字符串* @author Jason**/ public class TestS ...

  7. 常量池在堆还是方法区_详解Java 虚拟机(第③篇)——String 类和常量池

    一.String 对象的两种创建方式 String str1 = "abcd"; String str2 = new String("abcd"); Syste ...

  8. java常量池与地址_Java常量池

    一.相关知识 1.何为常量 第一种常量:是一个值,我们将这个值本身称为常量.比如: 整型常量:1024 实型常量:1.024 字符常量:'g' 'c' 'w' 字符串常量:"gcw" ...

  9. java常量池的理解_Java常量池的大概理解

    转载自:http://www.cnblogs.com/iyangyuan/p/4631696.html 理论 小菜先拙劣的表达一下jvm虚拟内存分布: 程序计数器是jvm执行程序的流水线,存放一些跳转 ...

最新文章

  1. Nginx—核心配置location匹配规则说明
  2. docker中部署redis主从模式
  3. 删除链表的倒数第n个节点 python_19.leetcode题目讲解(Python):删除链表的倒数第N个节点...
  4. 围观窗体与组件02 - 零基础入门学习Delphi24
  5. mysql 自动停止_MySQL数据库之mysql自动停止的完美解决方法
  6. Python编程基础:第十六节 元组Tuple
  7. openfalcon 组件监控_open-falcon监控业务URL探测
  8. 在Ubuntu上创建并测试GRE tunnel
  9. python idle是什么_下载下来的IDLE是个什么鬼
  10. Java线程池ExecutorService中重要的方法
  11. 未捕获异常string was not recognized_给你代码:PHP7中的异常与错误处理
  12. Eclipse与SQL Server 2005 连接
  13. css插件载进去ps里面,CSS3Ps(ps图层插件)官方版
  14. 解决fidder一直报“The sever(XXX) presented a certificate that did not validate,....”
  15. 入选全球灯塔工厂 西部数据践行可持续发展承诺
  16. P3545 [POI2012]HUR-Warehouse Store
  17. 【操作系统】进程间的通信——管道
  18. 4.6有一个函数。 写程序,输入x的值,输出相应的y值
  19. Java项目:SSM汽车租车管理系统
  20. 华中师范大学计算机学院校友,院部动态丨计算机学院:酸甜苦辣咸——你最pick谁...

热门文章

  1. JDBC 2.0中的高级数据类型
  2. JavaI/O:使用InputStreamReader和BufferedReade实现控制器输入输出
  3. springboot整合vue小试牛刀
  4. 电商企业纷纷结缘信息化 管理系统如何给力?
  5. 网络化楼宇对讲的前景
  6. golang 简单tls协议 使用实例
  7. easyui datagrid 表头 sort 排序
  8. linux c 宏 LONG_MAX LLONG_MAX
  9. bitcoin cash的地址格式 cash addr 简介
  10. mysql order by 多字段排序