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+"\t"+d+"\t"+b+"\t"+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+"\t"+d2+"\t"+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+"\t"+b4+"\t"+b5); //当包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,运行时NumberFormatException异常
//Integer i3=new Integer(null);
//Double d4=new Double("包装类");
//System.out.println(i3+"\t"+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+"\t"+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.注意:包装类和基本数据类型的相互转换会增加系统的额外负担,所以包装类只有在基本数据类型需要用对象表示时才用,包装类并不是用来取代基本数据类型的;
Java高级特性 第2节 java中常用的实用类(1)的更多相关文章
- Java高级特性 第3节 java中常用的实用类(2)
§String类 一.创建字符串对象 采用字面值的方式赋值:String s = "abc"; 用new关键字:String s = new String("vfggkf ...
- Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架
一.软件测试 1.软件测试的概念及分类 软件测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别.它是帮助识别开发完成(中间或最终 ...
- Java高级特性 第6节 注解初识
一.注解概述 Java注解也就是Annotation,是Java代码里的特殊标记,它为Java程序代码提供了一种形式化的方法,用来表达额外的某些信息,这些信息是代码本身无法表示的. 注解以标签的形式存 ...
- Java高级特性 第1节 集合框架和泛型
Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储 ...
- Java高级特性 第15节 解析XML文档(3) - JDOM和DOM4J技术
一.JDOM解析 特征: 1.仅使用具体类,而不使用接口. 2.API大量使用了Collections类. Jdom由6个包构成: Element类表示XML文档的元素 org.jdom: 解析xml ...
- Java高级特性 第13节 解析XML文档(1) - DOM和XPath技术
一.使用DOM解析XML文档 DOM的全称是Document Object Model,也即文档对象模型.在应用程序中,基于DOM的XML分析器将一个XML文档转换成一个对象模型的集合(通常称DOM树 ...
- Java高级特性 第9节 Socket机制
一.Socket简介 1.Socket概述 Java最初是作为网络编程语言出现的,它对网络的高度支持,使得客户端和服务器流畅的沟通变成现实.而在网络编程中,使用最多的就是Socket,每一个实用的网络 ...
- Java高级特性 第14节 解析XML文档(2) - SAX 技术
一.SAX解析XML文档 SAX的全称是Simple APIs for XML,也即XML简单应用程序接口.与DOM不同,SAX提供的访问模式是一种顺序模式,这是一种快速读写XML数据的方式.当使用S ...
- Java高级特性 第8节 网络编程技术
一.网络概述 1.网络的概念和分类 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设 ...
随机推荐
- js 可以表示的最大值
, ); ; ; for (var i = START; i <= END; i++) { count++; } console.log(count); // A. 0 // B. 100 // ...
- TeXstudio+TexLive交叉引用
LaTeX 交叉引用系统简介 https://www.cnblogs.com/wenbosheng/p/9537774.html 一般来说需要两次运行排版命令才能生成引用编号.背后的原理是这样的,第一 ...
- 8个让DevOps转型取得成功的关键步骤
关注嘉为科技,获取运维新知 在数字化时代,企业需要更快更灵活的交付来支持业务运营,这种迫切的需求促成了DevOps的高速发展,成为了企业获得竞争优势的关键.尽管大家都知道DevOps给业务带来的好 ...
- Python进程、线程、协成
什么是线程?程序执行的最小单位线程是进程中的一个实体,是被系统独立调度和分派的基本单位 线程的创建threading.Thread(target = 变量名) 线程的资源竞争问题线程是可以资源共享的同 ...
- MVC实战之排球计分软件(深入了解面向对象编程)
在此篇博客之前,我已经写了一个实战系列的博客,虽然不太成熟但是相对比较实用,在这篇博客我将继续使用mvc编程此软件. 此篇博客会在一定的时间内完成,此次完成的软件的一个需求是提供给运动员的使用.我将在 ...
- zabbix3.4.7Web页面监控
1. 新增Web monitoring 2. 新增一个触发器Trigger 点击“Insert”以后,完成后点击页面下的Add之后,可以看见如下 3. 测试-检测告警效果 接下来,我在Nginx上将i ...
- 跟随我在oracle学习php(4)
制作html表单 客户端(每个用户的计算机)在浏览网页时,都会向服务器(后台)端索要数据,然后将得 到的数据呈现在浏览器当中.除了索要数据之外,有时客户端也希望能够向服务器端发送 一些数据. 这时我们 ...
- encodeURIComponent编码与解码
问题:JavaScript用encodeURIComponentt编码后无法再后台解码的问题. 目前写法: window.self.location="list.jsp?searchtext ...
- php 安装redis
https://www.cnblogs.com/yuuje/p/8243234.html
- Centos7配置TiDB集群
一:各模块属性 模块名称 状态 建议实例数 功能 负载均衡组件 TiDB 无状态 2 接收SQL请求,处理SQL相关逻辑,并通过PB找到存储数据的TiKV地址 LVS.HAProxy.F5 PB 集群 ...