枚举
枚举是指由一组固定的常量组成的类型。
生活中也有很多类似的例子,比如说:性别,只有男和女,星期,周一到周日,也是不会改变的常量。
先来展示一下枚举的代码是由哪些东西构成的:
[Modifier] enum enumName{
enumContantName1
[,enumConstantName2...[;]]
//[field,method]
}
Modifier指的是权限修饰符,而enum则是修饰枚举的而关键字,enumName就是枚举类型的名字,其中的enumContantName1就是其中的常量,可以有很多个,但总归是有限的,最后通过;分号结束,枚举的成员也是由成员属性和成员方法组成的,也就是说枚举中也可以包含成员方法
枚举的具体案例
public enum Genders{//性别枚举
Male,Female
}
使用案例
public class Student{
public Genders sex;
}
大家可以看到,这里使用的时候sex的类型就不再是String了,而是用了枚举的类型名,这就是枚举的使用方法。下面演示一下怎么赋值
Student stu=new Student();
stu.sex=Genders.Male;//正确赋值操作
stu.sex="你好";//会发生异常的赋值操作
所以我们可以总结一下,枚举的特点:1.类型安全 2.易于输入 3.代码清晰
下面来做个练习题:
//为大数据岗位课程三个学习阶段定义枚举:L1、L2、L3,分别表示第一、二、三阶段
//编程输出每个单元的学习目标
//L1:大数据开发工程师
//L2:大数据挖掘工程师
//L3:大数据架构师
enum Course {
L1, L2, L3
}
class Student {
Course sex;
}
public class Dmeo1 {
public static void main(String[] args) {
Student stu = new Student();
stu.sex = Course.L1;
switch (stu.sex) {
case L1:
System.out.println("大数据开发工程师");
break;
case L2:
System.out.println("大数据挖掘工程师");
break;
case L3:
System.out.println("大数据架构师");
break;
default:
System.out.println("没有该课程");
}
}
}
这里是简单操作一下,所以不需要封装之类的操作。(还有一点,枚举由于其有限的、固定的特性所以通常会用到switch来进行判断选择,因为比较方便)
JavaAPI
什么是API?
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。——百度百科
说的很难懂,我们只需要知道API就是给我们提供了许多方法的接口就行了。
常用的API有哪些
java.lang
-----Enum、包装类、Math、String等
java.util(工具包)
java.io(输入输出流)
java.sql(数据库)
等等
包装类
包装类把基本数据类型数据转换为对象
-----每个基本类型在java.lang包中都有一个相应的包装类
包装类的作用
-----提供了一系列实用的方法
-----集合不允许存放基本数据类型数据,存放数字时,要用到包装类
上图就是八大基本类型的包装类。
所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例
-----public Type(type value)
----------如:Integer i = new Integer(1);这里就是将1这个int型常量转换为对象
-----除Character类外,其他包装类可将一个字符串作为参数构造它们的实例
-----public Type(String value)
----------如:Integer i = new Integer(“1”);
(但是字符串里的内容必须与当前包装类匹配,例如Integer中就不能输入其他的数据类型)
注意事项:
-----Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
-----当Number包装类构造方法参数为String类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译不通过,运行时会抛出NumberFormatException异常
包装类转换成基本类型
Integer integerId=new Integer(25);
int intId=integerId.intValue();
也就是通过包装类对象调用这些方法。
但是基本类型和包装类可自动互相转换,下面拆装箱有讲到。
基本数据类型转换为字符串
toString():以字符串形式返回包装对象表示的基本类型数据
String sex=Character.toString('男');
String id=Integer.toString(25);
调用包装类对象的toString()方法可以将数据转换成字符串
还可以通过基本数据类型数据+""双引号的形式
String sex='男'+"";
String id=25+"";
字符串转换为基本数据类型
parseXXX():把字符串转换为相应的基本数据类型数据(Charactor除外)
int num=Integer.parseInt("36");
boolean bool=Boolean.parseBoolean("false");
这就涉及到了上面讲的包装类对象传入的参数可以为字符串,因为parseXXX()是静态方法,可以直接通过包装类类名进行调用,并赋值给基本数据类型
基本数据类型转换为包装类
Integer intValue = Integer.valueOf(21);
通过valueOf方法进行转换,valueOf方法的格式为
public static Type valueOf(type value)
几乎不用,因为可自动转换,下面拆装箱有讲到
字符串转包装类
一样是涉及到包装类传入字符串参数
Integer intValue = Integer.valueOf("21");
这里valueOf方法进行了重载,将参数类型改为了String
装箱和拆箱
装箱:基本类型转换为包装类的对象
拆箱:包装类对象转换为基本类型的值
基本类型和包装类可自动转换
Integer intObject = 5;
int intValue = intObject;
JDK1.5后,允许基本数据额类型和包装类型进行混合数学运算
包装类并不是用来取代基本数据类型的,只是在基本数据类型需要用对象表示时使用(例如集合,集合中不能添加基本数据类型)
Math类
java.lang.Math类提供了常用的数学运算方法和两个静态常量E(自然对象的底数)和PI(圆周率)
绝对值:Math.abs(-3.5); //返回3.5
最大值:Math.max(2.5, 90.5);//返回90.5
随机数:int random = (int) (Math.random() * 10); //生成一个0-9之间的随机数
练习题(随机数):
买双色球,六个红球,一个篮球,红球范围1-33,范围1
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
/** 1个篮球 范围1-16 */
Integer blue = (int) (Math.random() * 16 + 1);
// 红球不能重复,所以将红球存入HashSet这种无序“唯一”的数组中
HashSet<Integer> hashSet = new HashSet<Integer>();
/** 6个红球 范围 1~33 */
// 若hashSet的数量小于6,开始循环添加,因为唯一,所以会出现新增失败的情况
// 所以可以通过此方式做循环条件,一旦数量为6,说明6个元素为不循环的6个数
// 因为hashSet.add()方法返回为布尔值,可由此判断是否添加成功,若成功,则添加list.add();
// 可获得6个按顺序获得的不重复元素
while (hashSet.size() < 6) {
Integer red = (int) (Math.random() * 33 + 1);
if (hashSet.add(red)) {
list.add(red);
}
}
// 添加蓝球,蓝球是可与红球产生重复的
list.add(blue);
// 遍历ArrayList集合,并打印
System.out.println("中奖号码为:(最后一个为蓝球)");
for (Integer integer : list) {
int num = integer.intValue();
System.out.print(num + "\t");
}
}
}
Random类
除了通过Math中的random方法生成随机数,还有一个Random类有这个功能,使用前需要导包
java.util.Random;
Random rand=new Random(); //创建一个Random对象
for(int i=0;i<20;i++){//随机生成20个随机整数,并显示
int num=rand.nextInt(10);//返回下一个伪随机数,整型的 System.out.println("第"+(i+1)+"个随机数是:"+num);
}
用同一个种子值来初始化两个Random对象,然后用每个对象调用相同的方法,得到的随机数也是相同的
String类
String s = "Hello World";
String类位于java.lang包中(java.lang包不需要导包语句,自动导入),具有丰富的方法。
-----计算字符串的长度、比较字符串、链接字符串、提取字符串
length()方法
String类提供了length()方法,确定字符串的长度(返回的是字符串中的字符数)
String str = "aaaaa";
int i = str.length();
练习题:判断注册的用户名和密码
import java.util.Scanner;
public class Demo1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("*****欢迎进入注册系统*****");
while (true) {
System.out.print("请输入用户名:");
String userName = input.next();
System.out.print("请输入密码:");
String password = input.next();
System.out.print("请再次输入密码:");
String password1 = input.next();
if (userName == null || userName.trim().length() == 0) {
System.out.println("用户名不能为空!!请重新输入");
continue;
}
if (password == null || password.trim().length() == 0) {
System.out.println("密码不能为空!!请重新输入");
continue;
}
userName = userName.trim();
password = password.trim();
password1 = password1.trim();
if (userName.length() < 3 || password.length() < 6) {
System.out.println("用户名不能小于3位,密码不能小于6位!");
continue;
}
if (!password.equals(password1)) {
System.out.println("两次输入的密码不相同!");
continue;
}
System.out.println("注册成功,请牢记用户名和密码!");
break;
}
}
}
equals()方法
String类提供了equals()方法,比较存储在两个字符串对象的内容是否一致,String中的equals方法时重写了Object类中的equals方法,Object中的equals方法比较的是两个对象的内存地址
具体运用,上面的例子中也有使用
equals方法的比较原理:equals方法将进行比较的两个字符串都转换为字符数组,比一一对应比较其内存地址,若完全一致,则返回true,但是只要有一个false,则返回false
“==”和equals()有什么区别呢?
==:判断的两个字符串在内存中的地址,即判断是否是同一个对象,而String类中的equals()方法则是比较的两个字符串的值是否相同
字符串的其他比较方法
equalsIgnoreCase()方法:忽略大小写比较字符串的值是否相同(验证码就是忽略大小写对比)
toLowerCase()方法:将字符串全部字符都转换为小写
toUpperCase()方法:将字符串全部字符都转换为大写
字符串的连接
方法1 :使用“+”。
方法2 :使用String类的concat()方法
String str = "abc";
str=str+"123";
str=str.concat("123");
字符串常用的方法
练习题:
判断.java文件名是否正确,判断邮箱格式是否正确
/**
* 判断文件名为hello.txt文件,是否是一个java文件。
* 判断帐号123@qq.com 帐号是否一个邮箱帐号
* (邮箱的规则是 必须有@ . 符号,@符号在.符号的前面)
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
String email = "123@qq.com";
//先判断是否有@和.
int index1 = email.indexOf("@");
int index2 = email.indexOf(".");
if(index1==-1||index2==-1){
System.out.println("该账号不是一个邮箱账号!");
return;
}
if(index1>index2){//说明@在.后面
System.out.println("该账号不是一个邮箱账号!");
return;
}
System.out.println("该账号是一个邮箱账号!");
}
private static void method1() {
String str = "hello.txt";
//先获得"."的下标,因为可能出现6.18作业.java的情况,所以要从后面开始查找.
int index = str.lastIndexOf(".");
//如果没有“.”将会返回-1
if(index==-1){
System.out.println("该文件不是Java文件");
return;
}
//截取str"."之后的字符串,与.java进行对比
String str1 = str.substring(index);
System.out.println("截取的字符串为:"+str1);
if(!".java".equals(str1)){
System.out.println("该文件不是Java文件");
return;
}
System.out.println("该文件是Java文件!");
}
}
字符串拆分
通过spilt()方法,方法传入的参数为分隔符,返回值为数组
/**
* 现有一段字符串歌词,由空格分开
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
String str = "长亭外 古道边 芳草碧连天 晚风拂 柳笛声残 夕阳山外山 ";
System.out.println("分隔前:");
System.out.println(str);
System.out.println("---------------------");
//通过spilt()方法,传入的参数为分隔符,返回值为数组
String [] s = str.split(" ");
//遍历数组打印结果
System.out.println("分隔后:");
for (String string : s) {
System.out.println(string);
}
}
}
查找特定字符出现的次数
/**
* 输入一个字符串,在输入查找的字符
* 判断该字符出现的次数
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("请输入一个字符串:");
String str = input.next();
System.out.print("请输入一个字符:");
String inputstr = input.next();
//因为只能接收字符串,所以要将字符串转换为字符,因为输入的是一个字符
//所以可以通过获得字符串的第一个字符来获得输入的字符(若输入的不是字符可以抛出异常)
char c1 = inputstr.charAt(0);
//需要一个计数器来计算出现次数
int count = 0;
//开循环遍历str中的字符,与输入的字符进行比较
for (int i = 0; i < str.length(); i++) {
//将字符串转换为字符,获得每一个字符可以通过i来实现
char c2 = str.charAt(i);
//若相等,则计数器加1
if(c2==c1){
count++;
}
}
System.out.println("“"+str+"”中包含了"+count+"个“"+inputstr+"”");
}
}
StringBuffer类
对字符串频繁修改(如字符串连接)时,使用StringBuffer类可以大大提高程序执行效率。
StringBuffer声明
StringBuffer strb = new StringBuffer();
StringBuffer strb = new StringBuffer("aaa");
StringBuffer的使用
例:通过StringBuffer类将数字字符串转换成逗号分隔的数字串
Scanner input = new Scanner(System.in);
// 接收数字串,存放于StringBuffer类对象中
System.out.println("请输入一串数字:");
String nums = input.next();
StringBuffer str = new StringBuffer(nums);
// 从后往前每隔3位添加逗号
//将i变成插入的下标,有利于插入字符
for (int i = str.length() - 3; i > 0; i = i - 3) {
str.insert(i, ',');
}
System.out.println(str);
String类和StringBuffer、StringBuilder类区别
1.StringBuffer与StringBuilder的值都是可以改变的,而String的值不可修改(但可以重新赋值)
2.StringBuffer与StringBuilder的区别是,StringBuffer类中的方法使用了synchronized进行修饰,所以StringBuffer类是线程安全的,但是因为线程安全,所以运行速度很慢,StringBuilder相反,运行速度很快,但是是非线程安全的
(另外提一句,StringBuilder是JDK5.0后提供的,等价StringBuilder)
实用类补充——操作日期时间
获取当前时间
-----java.util.Date类:表示日期和时间
----------提供操作日期和时间各组成部分的方法
-----java.text.SimpleDateFormat类
//创建日期对象
Date date = new Date();
//定制日期格式
SimpleDateFormat formater = new SimpleDateFormat("yyyy- MM-dd HH:mm:ss");
String now = formater.format(date);
System.out.println(now);
Calendar类(日期时间操作)
抽象类,java.util.Calendar
用于设置和获取日期/时间数据的特定部分
//因为Calendar是抽象类不能实例化,所以通过getInstance方法获得一个Calendar对象
//可以通过获得的对象来调用实例方法
Calendar calendar = Calendar.getInstance();
//通过set()方法先设置该日期,之后可以通过calendar之中的存储好的计算方法来计算
//就是调用calendar的getter、setter方法(封装后的方法)
calendar.set(calendar.YEAR, 2015);
calendar.set(calendar.MONTH, 3);// 0-11
calendar.set(calendar.DAY_OF_MONTH, 6);
//将设置好的日期存储在Date上,并通过SimpleDateFormat修改格式
Date date = calendar.getTime();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
String times = sdf.format(date);
//获得计算后的数据get()
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);
System.out.println(times + "是一年中的第" + weekOfYear + "周");