java基础-第7章-常用类(一)

简介: Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。

一、包装类

概述

Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:

byte—>Byte

short—>Short

int—>Integer

long–>Long

char–>Character

float–>Float

double–>Double

boolean—>Boolean


装箱与拆箱

基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:

装箱:从基本类型转换为对应的包装类对象。

拆箱:从包装类对象转换为对应的基本类型。

用Integer与 int为例:

基本数值---->包装对象

Integer i = new Integer(4);//使用构造函数函数
Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法

包装对象---->基本数值

int num = i.intValue();

自动装箱与自动拆箱

由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作可以自动完成。例如:

Integer i = 4;//自动装箱。相当于Integer i = Integer.valueOf(4);
i = i + 5;//等号右边:将i对象转成基本数值(自动拆箱) i.intValue() + 5;
//加法运算完成后,再次装箱,把基本数值转成对象

基本类型与字符串之间的转换

基本类型直接与””相连接即可;如:34+“”

String转换成对应的基本类型

除了Character类之外,其他所有包装类都具有parseXxx静态方法可以将字符串参数转换为对应的基本类型:

public static byte parseByte(String s):将字符串参数转换为对应的byte基本类型。

public static short parseShort(String s):将字符串参数转换为对应的short基本类型。

public static int parseInt(String s):将字符串参数转换为对应的int基本类型。

public static long parseLong(String s):将字符串参数转换为对应的long基本类型。

public static float parseFloat(String s):将字符串参数转换为对应的float基本类型。

public static double parseDouble(String s):将字符串参数转换为对应的double基本类型。

public static boolean parseBoolean(String s):将字符串参数转换为对应的boolean基本类型。


以Integer类的静态方法parseXxx为例

public class Demo18WrapperParse {
    public static void main(String[] args) {
        int num = Integer.parseInt("100");
    }
}


注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出java.lang.NumberFormatException异常。

示例:

System.out.println("int 的最大值:"+Integer.MAX_VALUE);
        System.out.println("int 的最小值:"+Integer.MIN_VALUE);
        int i = 100;//基本数据类型
        System.out.println(i);
        Integer i1 = new Integer(10);//包装数据类型
        Integer i2 = new Integer("100");
        Integer i3 = new Integer("10a");//报错
        System.out.println(i1.toString());
        System.out.println("i2:"+i2);
        //自动化完成
        //装箱
        Integer i4 = 5;
        //拆箱
        int i5 = i4;
        int i6 = Integer.parseInt("12");
        System.out.println("i6:"+i6);
        Integer.valueOf(1);//转为包装类型
    Double d1 = 3.14;
        System.out.println(d1.isNaN());//is not a number;

二、字符串String类

String构造函数


   

//构造函数
        String str = new String();
        System.out.println(str);
        /*
        字符数组构建字符串
         */
        char data[] = {'a', 'b', 'c'};
        String str2 = new String(data);
        System.out.println("str2"+str2);
        /*
        字节数组构建字符创
         */
        byte[] bs = {97,98,99,100,101,102,103};
        String str3 = new String(bs);
        System.out.println("str3:"+str3);
        //从1开始,长度为3
        String str4 = new String(bs,1,3);
        System.out.println("str4--->"+str4);
        String str5 = new String("abc");
        System.out.println("str5:"+str5);
        String str6 = "abc";//创建字符串
        System.out.println("str6:"+str6);

String常用方法

public char charAt(int index) 根据下标获取字符

public boolean contains(String str) 判断当前字符串中是否包含str

public char[] toCharArray() 将字符串转换成数组。

public int indexOf(String str) 查找str首次出现的下标,存在,则返回该下标;不存在,则返回-1

public int length() 返回字符串的长度

public String trim() 去掉字符串前后的空格

public String toUpperCase() 将小写转成大写

public boolean endsWith(String str) 判断字符串是否以str结尾

public String replace(char oldChar,char newChar) 将旧字符串替换成新字符串

public String[] split(String str) 根据str做拆分

public String subString(int beginIndex,int endIndex) 在字符串中截取出一个子字符串

示例:

/*
        charAt(int index)
        返回 char指定索引处的值。注意越界问题:java.lang.StringIndexOutOfBoundsException: String index out of range: 100
        index:0---->length()-1
         */
        String str = "helloworld";
        System.out.println(str.charAt(3));
        //System.out.println(str.charAt(100));
        /*
        concat(String str)
        将指定的字符串连接到该字符串的末尾。
        同+连接符一样
         */
        String str2 = str.concat("***");
        System.out.println();
        /*
        boolean contains(CharSequence s)
        当且仅当此字符串包含指定的char值序列时才返回true。
         */
        boolean flag = str.contains("hello");
        System.out.println("flag:"+flag);
        /*
        boolean endsWith(String suffix)
        测试此字符串是否以指定的后缀结尾。
         */
        String s3 = "aa.jpg";
        System.out.println(s3.endsWith(".jpg"));
        /*
        boolean startsWith(String prefix)
        测试此字符串是否以指定的前缀开头。
         */
        String s4 = "20190831.txt";
        System.out.println(s4.startsWith("201908"));
        /*
        boolean equals(Object anObject)
        将此字符串与指定对象进行比较。
        boolean equalsIgnoreCase(String anotherString)
        将此 String与其他 String比较,忽略大小写
         */
        System.out.println("abc".equals("abc"));
        System.out.println("Abc".equals("abc"));
        /*
          byte[] ---->String
          String ---->byte[]
          getBytes()
        使用平台的默认字符集将此 String编码为字节序列,将结果存储到新的字节数组中。
        char[] toCharArray()
        将此字符串转换为新的字符数组。
         */
        byte[] bs = str.getBytes();
        System.out.println(Arrays.toString(bs));
        char[] cs = str.toCharArray();
        System.out.println(Arrays.toString(cs));
        /*
        搜索
        int indexOf(int ch)
        返回指定字符第一次出现的字符串内的索引。
        int indexOf(int ch, int fromIndex)
        返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
        int lastIndexOf(String str)
        返回指定子字符串最后一次出现的字符串中的索引。
        int lastIndexOf(String str, int fromIndex)
        返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索
         */
        System.out.println(str.indexOf('c'));//helloworld
        System.out.println(str.indexOf('e',0));
        System.out.println(str.indexOf("w"));
        System.out.println(str.lastIndexOf("o"));
        /*
        boolean isEmpty()
        返回 true如果,且仅当 length()为 0 。
         */
        System.out.println(str.isEmpty());
        /*
        String replace(char oldChar, char newChar)
        返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。
         */
        String s7 = str.replace("o","uu");
        System.out.println("s7:---->"+s7);
        /*
        String[] split(String regex)
        按照切符,将此字符串分割为数组
        注意点:分隔符放在首位,中间起作用。放在末尾不起作用
         */
        String s8 = "abc,123,wowo,33,";
        String[] strArr  = s8.split(",");
        System.out.println("strArr.length---->"+strArr.length);
        for(int i=0;i<strArr.length;i++){
            System.out.println("---->"+strArr[i]);
        }
        /*
        String substring(int beginIndex)
        返回一个字符串,该字符串是此字符串的子字符串。
        String substring(int beginIndex, int endIndex)
        返回一个字符串,该字符串是此字符串的子字符串。  包含前面的下标,不包含后面的下标
         */
        System.out.println("str.substring(5)"+str.substring(5));//helloworld
        System.out.println("str.substring(5,7)"+str.substring(5,7));
        /*
        String toLowerCase()
        将所有在此字符 String使用默认语言环境的规则,以小写。
        String toUpperCase()
        将所有在此字符 String使用默认语言环境的规则大写。
         */
        String s9 = "abcDDaaADCD123**";
        System.out.println("s9--->"+s9);
        System.out.println("---->"+s9.toLowerCase());
        System.out.println("---->"+s9.toUpperCase());
        /*
        String trim()
        返回一个字符串,其值为此字符串,并删除任何前导和尾随空格。不会删除中间的空格
         */
        String s10 = " he llo ";
        System.out.println("s10:"+s10.length());
        System.out.println("s10.trim()-->:"+s10.trim());
        System.out.println("s10.trim().length()--->"+s10.trim().length());
        /*
        static String valueOf(int i)
         返回 int参数的字符串 int形式。
         */
        int i =10;
        String iStr = i+"";
        String iStr2 = String.valueOf(i);
        System.out.println(iStr);
        System.out.println(iStr2)

String类的内存分析

示例:

String s1 = "abc";
        String s2 = "abc";
        String s3 = new String("abc");
        String s4 = new String ("abc");
        System.out.println(s1==s2);//true
        System.out.println("s1==s3:"+s1==s3);//false
        System.out.println("s3==s4:"+s3==s4);//false
//使用字符串常量池,每当我们使用字面量(String s=”1”;)创建字符串常量时,JVM会首先检查字符串常量池,
//如果该字符串已经存在常量池中,那么就将此字符串对象的地址赋值给引用s(引用s在Java栈中)。
//如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中,并将此字符串对象的地址赋值给引用s(引用s在Java栈中)。
//         String str2 = "ab";  //1个对象  
//         String str3 = "cd";  //1个对象                                         
//         String str4 = str2+str3;   //new StringBuilder().append(str).append(str3).toString()                                     
//         String str5 = "abcd";    
//         System.out.println("str4 = str5 : " + (str4==str5)); // false  
    /*
      String str6 = "b";  
          String str7 = "a" + str6;  
          String str67 = "ab";  
          System.out.println("str7 = str67 : "+ (str7 == str67));  
          //↑str6为变量,在运行期才会被解析。  
          final String str8 = "b";  
          String str9 = "a" + str8;  
          String str89 = "ab";  
          System.out.println("str9 = str89 : "+ (str9 == str89));  
          //↑str8为常量变量,编译期会被优化  
    */


三、可变字符串

概念:可在内存中创建可变的缓冲空间,存储频繁改变的字符串。

Java中提供了两个可变字符串类:

StringBuilder:可变长字符串,JDK5.0提供,运行效率快、线程不安全。

StringBuffer:可变长字符串,JDK1.0提供,运行效率慢、线程安全。

这两个类中方法和属性完全一致

验证StringBuilder效率高于String。


public class TestStringBuilder {
  public static void main(String[] args) {
  //开始时间
  long start=System.currentTimeMillis();
  String string="";
  for(int i=0;i<99999;i++) {
    string+=i;
  }
  System.out.println(string);
//  StringBuilder sb=new StringBuilder();
//  for(int i=0;i<99999;i++) {
//    sb.append(i);
//  }
//  System.out.println(sb.toString());
  long end=System.currentTimeMillis();
  System.out.println("用时:"+(end-start));  
  }
}

常用的方法:


方法名 属性

public StringBuilder append(String str) 追加内容。

public StringBuilder insert(int dstOffset, CharSequence s) 将指定 字符串插入此序列中。

public StringBuilder delete(int start, int end) 移除此序列的子字符串中的字符。

public StringBuilder replace(int start, int end, String str) 使用给定字符串替换此序列的子字符串中的字符。start开始位置、end结束位置。

public int length() 返回长度(字符数)。

示例:

//step1:创建StringBuffer
        StringBuffer sb = new StringBuffer();
        //step2:
        sb.append("abc");
        sb.append(true);
        sb.append(1);
        sb.append("3.14").append("wowo");//方法的链式调用
        System.out.println(sb);
       // System.out.println(sb.capacity());
        //在指定的位置添加了新的字符串
        sb.insert(3,"hello");
        System.out.println(sb);
        sb.insert(0,"**");
        System.out.println(sb);
        sb.insert(sb.length(),"@@");
        System.out.println("删除前:"+sb);
        sb.deleteCharAt(0);
        System.out.println("删除后:"+sb);
        sb.delete(0,4);
        System.out.println("删除后2:"+sb);
        sb.setCharAt(1,'u');//设置指定位置的字符为'u'
        System.out.println(sb);
//        sb.setLength(6);
//        System.out.println(sb);
        sb.reverse();
        System.out.println(sb);

四、日期

Date

Date表示特定的瞬间,精确到毫秒。

Date类中的大部分方法都已经被Calendar类中的方法所取代。

时间单位

1秒=1000毫秒

1毫秒=1000微秒

1微秒=1000纳秒

Calendar

Calendar提供了获取或设置各种日历字段的方法。

protected Calendar() 构造方法为protected修饰,无法直接创建该对象。

常用方法:

方法名 说明

static Calendar getInstance() 使用默认时区和区域获取日历

void set(int year,int month,int date,int hourofday,int minute,int second) 设置日历的年、月、日、时、分、秒。

int get(int field) 返回给定日历字段的值。字段比如年、月、日等

void setTime(Date date) 用给定的Date设置此日历的时间。Date-Calendar

Date getTime() 返回一个Date表示此日历的时间。Calendar-Date

void add(int field,int amount) 按照日历的规则,给指定字段添加或减少时间量

long getTimeInMillis() 毫秒为单位返回该日历的时间值

SimpleDateFormat

SimpleDateFormat是以与语言环境有关的方式来格式化和解析日期的类。

进行格式化(日期 -> 文本)、解析(文本 -> 日期)。


yyyy:年

MM:月

dd:日

hh:1~12小时制(1-12)

HH:24小时制(0-23)

mm:分

ss:秒

S:毫秒

E:星期几

D:一年中的第几天

F:一月中的第几个星期(会把这个月总共过的天数除以7)

w:一年中的第几个星期

W:一月中的第几星期(会根据实际情况来算)

a:上下午标识

k:和HH差不多,表示一天24小时制(1-24)。

K:和hh差不多,表示一天12小时制(0-11)。

z:表示时区


示例:

Calendar cal  = Calendar.getInstance();
        System.out.println(cal);
        System.out.println(cal.getTime());
        SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        /*
        SimpleDateFormat:   格式化
        Date---->String
        String ------->Date
         */
//        Date date = cal.getTime();
//        //SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
//        String str = sdf.format(date);
//        System.out.println("str:"+str);
//
//        System.out.println(sdf.format(date));
//
//        String dateStr = "2019-12-02";
//        try {
//            Date dateFromStr = sdf.parse(dateStr);
//            System.out.println("dateFromStr:"+dateFromStr);
//        } catch (ParseException e) {
//            e.printStackTrace();
//        }
        /*
        获取日期时间常用的6个值:
         */
        System.out.println("年:"+cal.get(Calendar.YEAR));
        System.out.println("月:"+cal.get(Calendar.MONTH));
        //System.out.println("日:"+cal.get(Calendar.DATE));
        System.out.println("日:"+cal.get(Calendar.DAY_OF_MONTH));
        System.out.println("时:"+cal.get(Calendar.HOUR_OF_DAY));
        System.out.println("时:"+cal.get(Calendar.HOUR));//12小时制的
        System.out.println("分:"+cal.get(Calendar.MINUTE));
        System.out.println("秒:"+cal.get(Calendar.SECOND));
        /*
        设置日期
         */
        cal.set(2019,12,2,12,12,10);
        System.out.println(cal.getTime());
        //单独每个字段设置
         或者6个字段分别进行设置,由于月份下标从0开始赋值月份要-1
        cal.set(Calendar.YEAR,2018);//年
        cal.set(Calendar.MONTH,Calendar.NOVEMBER);//月
        cal.set(Calendar.DAY_OF_MONTH,12);//日
        cal.set(Calendar.HOUR_OF_DAY,23);//时,24小时
        cal.set(Calendar.MINUTE,23);//分
        cal.set(Calendar.SECOND,23);//秒
        System.out.println("设置日期后输出:"+sdf.format(cal.getTime()));
        //把月份+1;,或者-1
        cal.add(Calendar.MONTH,-1);
        System.out.println("设置日期后输出:"+sdf.format(cal.getTime()));


相关文章
|
2天前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
11 2
|
2天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
21 3
|
2天前
|
安全 Java 数据安全/隐私保护
Java一分钟之-Java反射机制:动态操作类与对象
【5月更文挑战第12天】本文介绍了Java反射机制的基本用法,包括获取Class对象、创建对象、访问字段和调用方法。同时,讨论了常见的问题和易错点,如忽略访问权限检查、未捕获异常以及性能损耗,并提供了相应的避免策略。理解反射的工作原理和合理使用有助于提升代码灵活性,但需注意其带来的安全风险和性能影响。
23 4
|
2天前
|
安全 Java 调度
Java一分钟:多线程编程初步:Thread类与Runnable接口
【5月更文挑战第11天】本文介绍了Java中创建线程的两种方式:继承Thread类和实现Runnable接口,并讨论了多线程编程中的常见问题,如资源浪费、线程安全、死锁和优先级问题,提出了解决策略。示例展示了线程通信的生产者-消费者模型,强调理解和掌握线程操作对编写高效并发程序的重要性。
45 3
|
2天前
|
Java
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
【JAVA基础篇教学】第五篇:Java面向对象编程:类、对象、继承、多态
|
2天前
|
存储 安全 Java
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
Java容器类List、ArrayList、Vector及map、HashTable、HashMap
|
2天前
|
Java 编译器 开发者
Java一分钟之-继承:复用与扩展类的特性
【5月更文挑战第9天】本文探讨了Java中的继承机制,通过实例展示了如何使用`extends`创建子类继承父类的属性和方法。文章列举了常见问题和易错点,如构造器调用、方法覆盖、访问权限和类型转换,并提供了解决方案。建议深入理解继承原理,谨慎设计类结构,利用抽象类和接口以提高代码复用和扩展性。正确应用继承能构建更清晰、灵活的代码结构,提升面向对象设计能力。
16 0
|
2天前
|
Java
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
【Java多线程】面试常考 —— JUC(java.util.concurrent) 的常见类
24 0
|
2天前
|
Java API 调度
【Java多线程】Thread类的基本用法
【Java多线程】Thread类的基本用法
10 0
|
2天前
|
SQL Java 数据库连接
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
JDBC Java标准库提供的一些api(类+方法) 统一各种数据库提供的api
11 0