zoukankan      html  css  js  c++  java
  • Java高级特性 第2节 java中常用的实用类(1)

    一、Java API

      Java API即Java应用程序编程接口,他是运行库的集合,预先定义了一些接口和类,程序员可以直接调用;此外也特指API的说明文档,也称帮助文档。

      Java中常用的包:

    • java.lang:使用最广泛,自动导入到所有的程序中,包含Jav程序的基础类和接口。如包装类、Math类、String类等,此包还提供用于管理类的动态加载、外部进程创建、主机环境查询和安全侧率实施等“系统操作”的类;
    • java.util:包含了系统辅助类,特别是Collections、List和Map等集合类;
    • java.io:包含了与输入/输出有关的类,如文件操作类;
    • java.net:包含了与网络有关的类,如Socket、ServerSocket等;
    • java.sql:包含了与数据库相关的类,如Connection、Statement等类

    二、枚举

      1.枚举概述

      从Java SE 5.0开始,Java程序设计语言引入了一种新的类型---枚举(Enum)。

      枚举是指由一组固定的常量组成的类型,使用关键字enum来定义。

      定义语法:
        [访问修饰符]  enum  enumName{

          enumContantName1 , enumContantName2 ,... , [ ;] ]     //枚举常量列表,若除了枚举常量还定义了其他成员,则枚举常量列表需要以“;”结尾
          //[field, method]    //其他的成员,包括构造方法,置于枚举常量之后

        }

      例如:定义表示性别的枚举,两个枚举常量分别代表男和女
        public enum Genders{

          Male,Female

        }

      注意:枚举其实是一种类型,是java.lang.Enum的子类,继承了Enum类的许多有用的方法(可以查看API)。

      2.使用枚举实现每周日程信息

      在java中,通常使用枚举表示一组个数有限的值,用于实现对输入的值进行约束和检查。

    package cn.UtilTest;
    //一周日程信息类
    public class WeekThings {
        //定义枚举
        public enum Week{
            MON,TUE,WED,THU,FRI,SAT,SUN
        }
        /*
         * 查看日程安排
         * @param day 星期几
         */
        public void doWhat(Week day){
            switch (day){
                case MON:
                case TUE:
                case WED:
                case THU:
                case FRI:
                    System.out.println("工作日,努力写代码!");
                    break;
                case SAT:
                    System.out.println("星期六,吃饭休息、看电影");
                    break;
                case SUN:
                    System.out.println("星期日,休息、打篮球!");
                    break;
                default:
                    System.out.println("地球上一周就7天!");
            }
        }
    
        public static void main(String[] args) {
            WeekThings weekThings = new WeekThings();
            weekThings.doWhat(Week.SAT);
            Week week = Week.WED;
            weekThings.doWhat(week);
        }
    }
    

      

      3.使用枚举的优点:

    • 使戴安更易于维护,有助于确保为变量指定合法的、期望的值;
    • 更易于编程时输入,使用枚举 赋值,只需要输入枚举名,冉虎输入一个点(.),就能将所有的值显示出来;
    • 使代码更清晰,允许用描述性的名称表示数据,使用时直观方便;

    三、包装类

      1.包装类概述

      Java是面向对象的,但是Java中的基本数据类型却不是面向对象的,未解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类,成为包装类。

      包装类均位于java.lang包中,包装类和基本数据类型的对应关系如下:

      

      包装类的作用主要有2个:

    • 包装类作为和基本数据类型对应的类存在,方便对象的操作;
    • 包装类包含每种基本数据类型的相关属性和操作方法;

      2.包装类和基本数据类型的转换

      由于八个包装类的使用比较类似,下面以最常用的Integer类为例子介绍包装类的实际使用。Integer类继承Number父类。

       1)基于基本数据类型创建包装类对象通常有2种方式:

    • public Type(type value)
    • public Type(Stirng value)

       如:Integer  intValue = new Integer(21);    Integer  intValue = new Integer("21");    

       注意:不能使用第二种形式的构造方法创建Character类型的包装类对象,只能是:Character charValue = new Character('x');这种形式

    ackage cn.com.yu;
    public class Demo {
    	public static void main(String[] args) {
    		//所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例
    		Integer i=new Integer(34);
    		Double d=new Double(98.7);
    		Boolean b=new Boolean(true);
    		Character c=new Character('a');
    		System.out.println(i+"	"+d+"	"+b+"	"+c);
    		
    		//除Character类外,其他包装类可以一个字符串为参数构造它们的实例
    		//编译错误
    		//Character c2=new Character("a");
    		Integer i2=new Integer("34");
    		Double d2=new Double("98.7");
    		Boolean b2=new Boolean("true");
    		System.out.println(i2+"	"+d2+"	"+b2);
    		
    		//Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
    		Boolean b3=new Boolean("TRue");
    		Boolean b4=new Boolean("false");
    		Boolean b5=new Boolean("love");
    		System.out.println(b3+"	"+b4+"	"+b5);
    		
    		//当包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,运行时NumberFormatException异常
    		//Integer i3=new Integer(null);
    		//Double d4=new Double("包装类");
    		//System.out.println(i3+"	"+d4);
    	}
    }
    

       

       3.包装类常用方法

      包装类一般包含静态的重载的valueOf()方法,可以接受基本数据类型数据和字符串作为参数并返回包装类的对象;

      注意:Character的valueOf()方法只有一种定义,valueOf(char  c),返回一个指定char值的Character对象

    package cn.com.yu;
    /**
     * 包装类常用方法
     * */
    public class Demo {
    	public static  void main(String[] args){
    		//XXXValue():包装类转换成基本类型
    		Integer integerId=new Integer(25);
    		int intId=integerId.intValue();
    		System.out.println(intId);
    		
    		Boolean booleanVal=new Boolean(true);
    		boolean bool2=booleanVal.booleanValue();
    		System.out.println(bool2);
    		System.out.println("*************************");
    		
    		//toString():以字符串形式返回包装对象表示的基本类型数据
    		String sex=Character.toString('男');
    		String id=Integer.toString(89);
    		System.out.println(sex);
    		System.out.println(id);
    		String sex2='男'+"";
    		String id2=89+"";
    		System.out.println(sex2);
    		System.out.println(id2);
    		System.out.println("*************************");
    		
    		//所有包装类valueOf(type value)
    		Integer intValue=Integer.valueOf(21);
    		System.out.println(intValue);
    		Boolean bool=Boolean.valueOf(false);
    		System.out.println(bool);
    		System.out.println("*************************");
    		
    		//除Character类外,其他包装类valueOf(String s)
    		intValue=Integer.valueOf("32");
    		//bool=Boolean.valueOf("true");
    		bool=Boolean.valueOf("love");
    		//编译错误,应该是valueOf('a')
    		//Character c=Character.valueOf("a");
    		System.out.println(intValue);
    		System.out.println(bool);
    		System.out.println("*************************");
    
    		//parseXXX():把字符串转换为相应的基本数据类型数据(Character除外)
    		int i=Integer.parseInt("89");
    		System.out.println(i);
    		//boolean flag=Boolean.parseBoolean("true");
    		//boolean flag=Boolean.parseBoolean("TRue");
    		//boolean flag=Boolean.parseBoolean("love");
    		boolean flag=Boolean.parseBoolean("false");
    		System.out.println(flag);
    		System.out.println("*************************");
    		
    		//基本类型和包装类的自动转换:装箱和拆箱
    		//装箱
    		Integer intObject=5;
    		//拆箱
    		int intValue2=intObject;
    		System.out.println(intObject+"	"+intValue2);
    
    	}
    }
    

        

      

      4.自动装箱和自动拆箱(auto-boxing & auto-unboxing)

      JDK5.0的一个新特性是自动装箱和自动拆箱。

    • 自动装箱:基本类型自动转为包装类(int >> Integer)

      如:Integer i = 100;

      ★本质上是编译器编译时自动添加:Integer i = new Integer(100);

    • 自动拆箱:包装类自动转为基本类型(Integer >> int)

      如:int a = new Integer(100);

      ★本质是上是编译器编译时自动添加:int a = new Integer(100).intValue();

    package cn.UtilTest;
    import java.util.*;
    public class BoxTest {
        public static void main(String[] args) {
            Collection<Integer> c = new ArrayList<Integer>();
            c.add(3);//将int类型的3转换为Integer类型并放到集合当中
        }
    }

      在Integer类中自动装箱和自动拆箱中遇到的问题:

    复制代码
    package cn.UtilTest;
    import java.util.*;
    public class BoxTest {
    public static void main(String[] args) {
    Integer d = 1234;
    Integer d2 = 1234;
    //此时d和d2是分别new的2个对象
    System.out.println(d==d2);
    System.out.println(d.equals(d2));

    System.out.println("------------------");
    Integer d3 = -100; // [-128,127]之间的数,仍然当做基本数据类型来处理。
    Integer d4 = -100;
    System.out.println(d3==d4);
    System.out.println(d3.equals(d4));
    }
    }
    复制代码

    结果:

      

      Integer包装类的equals()方法源码:

    public boolean equals(Object obj) {
       if (obj instanceof Integer) {
          return value == ((Integer)obj).intValue();  //比较的是其对应的基本数据类型
      }   
      return false;
    }

      所以用equals()方法返回的是true。

      但是用"=="判断时却出现了不同情况。

      原因:查看内部实现代码可知,Integer类有一个缓存问题,它会缓存-128~127之间的整数。也就是说如果将-128~127之间的数值赋值给Integer类对象,在比较两个对象(d3==d4)时比较的是两个对象的数值。超过这个范围比较的是对象的内存地址。

       

      5.注意:包装类和基本数据类型的相互转换会增加系统的额外负担,所以包装类只有在基本数据类型需要用对象表示时才用,包装类并不是用来取代基本数据类型的;

  • 相关阅读:
    MySQL 可重复读,差点就让我背上了一个 P0 事故
    Thread.sleep(0) 有什么用
    你不会还在用这8个错误的SQL写法吧?
    Spring事务失效的 8 大原因
    我说 SELECT COUNT(*) 会造成全表扫描,面试官让我回去等通知
    这么写参数校验(Validator)就不会被劝退了
    HyperLedger Fabric 1.4 基础环境搭建(7)
    HyperLedger Fabric 1.4 简介(6.1)
    HyperLedger Fabric 1.4 关键技术(6.4)
    HyperLedger Fabric 1.4 交易流程(6.3)
  • 原文地址:https://www.cnblogs.com/yutianbao/p/10604824.html
Copyright © 2011-2022 走看看