(用JAVA实现)请使用日期相关的api,控制台输入出生日期,计算出一个人出生了多少年?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了(用JAVA实现)请使用日期相关的api,控制台输入出生日期,计算出一个人出生了多少年?相关的知识,希望对你有一定的参考价值。

这个问题主要涉及日期的解析及时间分量的计算。

思路:使用SimpleDateFormat将输入的字符串表示的日期解析为Date,再将Data转为Calendar,获取日期分类年份,然后与当前年份做差运算即可。

代码如下:

代码实现

参考技术A import java.util.Scanner;
import java.util.*;
class Test
public static void main(String[] args)
Scanner user=new Scanner(System.in);
System.out.println("输入你的出生年份");
int useryear=user.nextInt();
Calendar time=Calendar.getInstance();
int curyear=time.get(Calendar.YEAR);
int res=curyear-useryear;
System.out.println("你一共出生了"+res+"年");

参考技术B 这是日期加减计算,将输入的出生日期转换为date类型,用calendar类获取当前日期,并与出生日期计算,获取相差几年

java常用类详细介绍及总结:字符串相关类日期时间API比较器接口SystemMathBigInteger与BigDecimal

一.字符串相关的类

1.String及常用方法

1.1 String的特性

技术图片
String:字符串,使用一对""引起来表示。

  1. String声明为final的,不可被继承
  2. String实现了Serializable接口:表示字符串是支持序列化的。
    实现了Comparable接口:表示String可以比较大小
  3. String内部定义了final char[] value用于存储字符串数据
  4. String:代表不可变的字符序列。简称:不可变性
    体现:
    • 当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。
    • 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
    • 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。
  5. 通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
  6. 字符串常量池中是不会存储相同内容的字符串的。
    String s1 = "abc";//字面量的定义方式
    String s2 = "abc";
    s1 = "hello";
    System.out.println(s1 == s2);   // false 比较s1和s2的地址值    
    System.out.println(s1); // hello
    System.out.println(s2); // abc  
    System.out.println("*****************");
    
    String s3 = "abc";
    s3 += "def";
    System.out.println(s3); // abcdef
    System.out.println(s2); // abc  
    System.out.println("*****************");
    
    String s4 = "abc";
    String s5 = s4.replace('a', 'm');
    System.out.println(s4); // abc
    System.out.println(s5); // mbc

技术图片

1.2 String对象的创建

String的实例化方式:

  • 通过字面量定义的方式
  • 通过new + 构造器的方式
    //通过字面量定义的方式:此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
    String s1 = "javaEE";
    String s2 = "javaEE";
    //通过new + 构造器的方式:此时的s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
    String s3 = new String("javaEE");
    String s4 = new String("javaEE");
    
    System.out.println(s1 == s2);//true
    System.out.println(s1 == s3);//false
    System.out.println(s1 == s4);//false
    System.out.println(s3 == s4);//false
    System.out.println("***********************");
    
    Person p1 = new Person("Tom",12);
    Person p2 = new Person("Tom",12);
    
    System.out.println(p1.name.equals(p2.name));//true
    System.out.println(p1.name == p2.name);//true
    
    p1.name = "Jerry";
    System.out.println(p2.name);//Tom

技术图片
技术图片

面试题:String s = new String("abc");方式创建对象,在内存中创建了几个对象?
两个: 一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:"abc"

1.3 String使用陷阱

关于拼接字符串后两个遍历地址是否相等。

  • 常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中
  • 如果拼接的结果调用intern()方法,返回值就在常量池中
    String s1 = "javaEE";
    String s2 = "hadoop";
    
    String s3 = "javaEEhadoop";
    String s4 = "javaEE" + "hadoop";
    String s5 = s1 + "hadoop";
    String s6 = "javaEE" + s2;
    String s7 = s1 + s2;
    
    final String s8 = "javaEE";//s8:常量
    String s9 = s8 + "hadoop";
    String s11 = s8 + s2;
    System.out.println(s3 == s9);   // true
    System.out.println(s3 == s11);   // false
    
    System.out.println(s3 == s4);//true
    System.out.println(s3 == s5);//false
    System.out.println(s3 == s6);//false
    System.out.println(s3 == s7);//false
    System.out.println(s5 == s6);//false
    System.out.println(s5 == s7);//false
    System.out.println(s6 == s7);//false
    
    String s10 = s6.intern();//返回值得到的s8使用的常量值中已经存在的“javaEEhadoop”
    System.out.println(s3 == s10);//true

技术图片
面试题:

    String str = new String("good");
    char[] ch = { 't', 'e', 's', 't' };
    
    public void change(String str, char ch[]) { // 传递的是引用
        str = "test ok";    // 给传递过来的地址重新赋值,而不是改变引用重新指向
        ch[0] = 'b';
    }
    public static void main(String[] args) {
        StringTest ex = new StringTest();
        ex.change(ex.str, ex.ch);
        System.out.println(ex.str); // good string是不可变的,不能重新赋值
        System.out.println(ex.ch);  // best 数组是可变的
    }
1.4 String常用方法

基本方法:

方法 描述
int length() 返回字符串的长度: return value.length
char charAt(int index) 返回某索引处的字符return value[index]
boolean isEmpty() 判断是否是空字符串:return value.length == 0
String toLowerCase() 使用默认语言环境,将 String 中的所有字符转换为小写
String toUpperCase() 使用默认语言环境,将 String 中的所有字符转换为大写
String trim() 返回字符串的副本,忽略前导空白和尾部空白
boolean equals(Object obj) 比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString) 与equals方法类似,忽略大小写
String concat(String str) 将指定字符串连接到此字符串的结尾。 等价于用“+”
int compareTo(String anotherString) 比较两个字符串的大小
String substring(int beginIndex) 返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。
String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

包含:

方法 描述
boolean endsWith(String suffix) 测试此字符串是否以指定的后缀结束
boolean startsWith(String prefix) 测试此字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset) 测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s) 当且仅当此字符串包含指定的 char 值序列时,返回 true
int indexOf(String str) 返回指定子字符串在此字符串中第一次出现处的索引
int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
int lastIndexOf(String str) 返回指定子字符串在此字符串中最右边出现处的索引
int lastIndexOf(String str, int fromIndex) 返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索

注:indexOf和lastIndexOf方法如果未找到都是返回-1

    String str1 = "hellowworld";
    boolean b1 = str1.endsWith("rld");
    System.out.println(b1);     // true
    
    boolean b2 = str1.startsWith("He");
    System.out.println(b2);     // false
    
    boolean b3 = str1.startsWith("ll",2);
    System.out.println(b3);     // true
    
    String str2 = "wor";
    System.out.println(str1.contains(str2));    // true
    
    System.out.println(str1.indexOf("lol"));    // -1
    
    System.out.println(str1.indexOf("lo",5));   // -1   (3+2)
    
    String str3 = "hellorworld";
    
    System.out.println(str3.lastIndexOf("or")); // 7
    System.out.println(str3.lastIndexOf("or",6));   // 4    (7-1)
    
    //什么情况下,indexOf(str)和lastIndexOf(str)返回值相同?
    //情况一:存在唯一的一个str。情况二:不存在str

替换:

方法 描述
String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。

匹配:

方法 描述
boolean matches(String regex) 告知此字符串是否匹配给定的正则表达式。

切片:

方法 描述
String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

2.StringBuffer

3.StringBuilder

二.日期时间API

1.JDK8之前

1.1 System静态方法
1.2 Date类
1.3 Calendar类
1.4 SimpleDataFormat类

2.JDK8

2.1 LocalDate、LocalTime、LocalDateTime
2.2 Instant
2.3 DateTimeFormatter
2.4 其它类

三.java比较器

1.Comparable接口

2.Comparator接口

四.System类

五.Math类

六.BigInteger与BigDecimal

以上是关于(用JAVA实现)请使用日期相关的api,控制台输入出生日期,计算出一个人出生了多少年?的主要内容,如果未能解决你的问题,请参考以下文章

用单片机C语言控制6位密码锁。要求有一个清除键和确认键,密码输错了会有报警音。请高手帮助了

用java写用户在控制台按照“yyyy/mm/dd”的格式输入出生日期,请计算用户的年龄

java常用类详细介绍及总结:字符串相关类日期时间API比较器接口SystemMathBigInteger与BigDecimal

#yyds干货盘点#☕Java深层系列「技术盲区」让我们一起完全吃透针对于时间和日期相关的API指南

Java基础--常用API--日期相关API

java用循环方式实现和计算机玩猜拳的程序