一 包装类
1.1什么是包装类
Java是面向对象的语言,但并不是“纯面向对象”的,因为我们经常用到的基本数据类型就不是对象。但我们在实际应用中经常需要将基本数据转化成对象,以便于操作。
为了解决这个不足,Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。8种基本数据类型,分别对应一个包装类。包装类均位于java.lang包
基本数据类型 | 包装类 |
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
为什么需要包装类(优点)
- 某些方法的参数必须是对象,为了让基本数据类型的数据能作为参数,提供包装类。
- 包装类还可以提供更多的功能
- 其他特别重要的功能:比如可以实现字符串和基本数据类型之间的转换
public class TestWrapper1 {
int num;
Integer in ;
public static void main(String[] args) {
//1.某些方法参数是对象,为了让基本数据类型能作为参数
List list = new ArrayList();
list.add(new Integer(56)); //int 56
list.add(new Integer(100));
list.add(new Double(67.5));
list.add(99);
System.out.println(list);
//2.包装类还可以提供更多的功能
System.out.println(Integer.SIZE); //
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.toBinaryString(123));
System.out.println(Integer.toOctalString(123));
System.out.println(Integer.toHexString(123));
//3.特别重要的功能:可以实现字符串和基本数据类型之间的转换
String str = "123"; //----123
int num2 = Integer.parseInt(str);
System.out.println(num2);
String str2 = "123.45";
double d = Double.parseDouble(str2);
System.out.println(d);
}
注意
|
二 String类
String类、StringBuilder类、StringBuffer类是三个字符串相关类。String类是的对象代表不可变的字符序列,StringBuilder类和StringBuffer类代表可变字符序列。
public class TestString1 {
public static void main(String[] args) {
//1.创建一个String对象
String str = "java是最好的语言"; //字符的个数
//str = null;
//str = "";
//String str2 = new String("好好学习,java是最好的语言");
//2.操作该String对象
//2.1最简单的方法
System.out.println(str.length());//10
System.out.println(str.isEmpty());//length==0
System.out.println(str.startsWith("bj"));
System.out.println(str.endsWith("sxt"));
System.out.println(str.toUpperCase());
System.out.println(str.toLowerCase());
//str = str.toLowerCase();
System.out.println(str);
//2.2根据索引确定子串
System.out.println(str.charAt(3));
//从beginIndex,到endIndex-1结束,共计输出字符个
//endIndex-beginIndex
System.out.println(str.substring(5,7));
System.out.println(str.substring(7));
//2.3根据子串确定索引
System.out.println(str.indexOf("习"));
System.out.println(str.indexOf("好好学"));
//从第一个字符开始查找,返回找到的第一个匹配的子串的索引
System.out.println(str.indexOf("java"));
//如果不存在,就返回-1
System.out.println(str.indexOf("jav"));
System.out.println(str.lastIndexOf("java"));
System.out.println(str.indexOf("java",8));
//2.4其他
//str.compareTo()
byte [] bytes = str.getBytes();//字符串----byte[]
System.out.println(bytes.length); // 5*3+5*1=20
System.out.println(Arrays.toString(bytes));
//String str2 = new String(bytes); //byte[] ---String
String str2 = new String(bytes,9,6);
System.out.println(str2);
System.out.println(str);
boolean flag = str.contains("beijing");
System.out.println(flag);
// str = str.concat("北京");
// str = str.concat("昌平区");
// str = str.concat("朝阳区");
str = str.concat("xx加油").concat("加油")
.concat("xx科技园");
System.out.println(str);
str = str.replace("bj","北京北京");
System.out.println(str);
String str3 = " bj study ";
System.out.println(str3.length());
System.out.println(str3.trim());
}
方法摘要 | |
| charAt |
| compareTo |
String | concat |
| contains |
| endsWith |
| equals |
| equalsIgnoreCase |
| hashCode |
| indexOf |
| indexOf |
| indexOf |
| indexOf |
| isEmpty |
| lastIndexOf |
| lastIndexOf |
| lastIndexOf |
| lastIndexOf |
| length |
String | replace |
String | replace |
String | replaceAll |
String | split |
| startsWith |
| startsWith |
String | substring |
String | substring |
String | toLowerCase |
String | toString |
String | toUpperCase |
String | trim |
String类源码
- String类是一个final类,意味着该类不能再有子类。
- String类底层是一个字符数组value。各种方法的操作其实都是对该数组的操作。
public final class String
implements java.io.Serializable, Comparable, CharSequence {
private final char value[];
public String() {
this.value = "".value;
}
public String(java.lang.String original) {
this.value = original.value;
//this.hash = original.hash;
}
public boolean isEmpty() {
return value.length == 0;
}
public int length() {
return value.length;
}
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
public java.lang.String toString() {
return this;
}
}
- String类的equals()方法其实就是比较底层的字符数组的各个元素是否相同,只要发现一个字符不相同,就返回false。如果所有字符都相同,返回true。但是如果两个变量指向了同一个字符数组,直接返回true。
public final class String
implements java.io.Serializable, Comparable, CharSequence {
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof java.lang.String) {
java.lang.String anotherString =
(java.lang.String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
}
- String类的concat()是创建一个新的字符数组,存放原来字符数组和新加入的字符数组内容,然后以该新数组创建一个新的字符串。
public final class String
implements java.io.Serializable, Comparable<java.lang.String>, CharSequence {
public java.lang.String concat(java.lang.String str) {
int otherLen = str.length();
if (otherLen == 0) {
return this;
}
int len = value.length;
char buf[] = Arrays.copyOf(value, len + otherLen);
str.getChars(buf, len);
return new java.lang.String(buf, true);
}
}
StringBuffer和StringBuilder非常类似,均代表可变的字符序列。这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
两个类的区别主要是:
StringBuffer JDK1.0提供的类,线程安全,做线程同步检查,效率较低。
StringBuilder JDK1.5提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。
方法摘要 | |
StringBuilder | append |
| capacity |
| charAt |
StringBuilder | delete |
StringBuilder | deleteCharAt |
| ensureCapacity |
| indexOf |
| indexOf |
StringBuilder | insert |
| lastIndexOf |
| lastIndexOf |
| length |
StringBuilder | replace |
StringBuilder | reverse |
String | substring |
String | substring |
String | toString |
三 日期类
在计算机中,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一),如图所示。
3.1Date类
在标准Java类库中包含一个Date类。它的对象表示一个特定的瞬间,精确到毫秒。在网上商城下单时,在对报销单进行审核时,都需要获取当前的时间,通过Date类就可以完成。
public class TestDate {
public static void main(String[] args) {
//获取当前的时间
Date now = new Date();
//输出当前的时间
System.out.println(now.toString());
System.out.println(now.toLocaleString());
System.out.println(now.getYear()); // 1900+119=2019
System.out.println(now.getMonth());// 0---11
System.out.println(now.getDate());//日
//星期几 星期日是0,一周是从星期日开始
System.out.println(now.getDay());
System.out.println(now.getHours());
System.out.println(now.getMinutes());
System.out.println(now.getSeconds());
//其他的方法
long l = now.getTime();
// 1970年1月1日 00:00:00 GMT以来的毫秒数。
System.out.println(l);
System.out.println(System.currentTimeMillis());
System.out.println(System.nanoTime());
Date date1 = new Date(-(long)(1000*60*60*24)*31);
System.out.println(date1.toLocaleString());
//util.Date yyyyMMdd hh:mm:ss
// 一共有三个子类 Date Time Timestamp
//sql.Date yyyyMMdd
//sql.Time hh:mm:ss
//sql/Timestamp 时间戳 yyyyMMdd hh:mm:ss
//java.sql.Date sDate = new java.sql.Date(l);
java.sql.Date sDate =
new java.sql.Date(System.currentTimeMillis());
System.out.println(sDate);
java.sql.Date sDate2 =
java.sql.Date.valueOf("2019-8-06");//对格式有要求
System.out.println(sDate2);
}
}
Date类中的很多方法都已经过时了。JDK1.1之前的Date包含了:日期操作、字符串转化成时间对象等操作。JDK1.1之后,日期操作一般使用Calendar类,而字符串的转化使用DateFormat类。
3.2 DateFormat类
DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。主要作用就是把时间对象转化成指定格式的字符串。反之,把指定格式的字符串转化成时间对象。
需求1:网页注册,需要输入日期,在网页上输入的所有内容,xiaoming,23, 1999-12-23,1999/12/23,但是传送到后台接收到都是字符串 "xiaoming", "23", "1999-12-23","1999/12/23",需要把字符串----->日期
需求2:注册成功后,在网页上显示日期,可以不同格式来显示"1999-12-23", "1999/12/23","1999年12月23日",需要把日期----->字符串。
public class TestDateFormat {
public static void main(String[] args) {
// int age = Integer.parseInt("23abc");
// System.out.println(age);
//有缺陷:对日期格式有限制,不能表示时分秒
// String str = "1999-12-23 ";
// //String ----Date
// java.sql.Date date = java.sql.Date.valueOf(str);
// //Date ---String
// System.out.println(date.toString());
DateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = "1999-12-23 09:23:45";
//String ---Date
Date date =null;
try {
date = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
// System.out.println(date.toString());
// System.out.println(date.toLocaleString());
//Date--String
DateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒");
String str2 = sdf2.format(date);
System.out.println(str2);
}
}
关于日期和时间模式
字母 | 日期或时间元素 | 表示 | 示例 |
| Era 标志符 | Text |
|
| 年 | Year |
|
| 年中的月份 | Month |
|
| 年中的周数 | Number |
|
| 月份中的周数 | Number |
|
| 年中的天数 | Number |
|
| 月份中的天数 | Number |
|
| 月份中的星期 | Number |
|
| 星期中的天数 | Text |
|
| Am/pm 标记 | Text |
|
| 一天中的小时数(0-23) | Number |
|
| 一天中的小时数(1-24) | Number |
|
| am/pm 中的小时数(0-11) | Number |
|
| am/pm 中的小时数(1-12) | Number |
|
| 小时中的分钟数 | Number |
|
| 分钟中的秒数 | Number |
|
| 毫秒数 | Number |
|
| 时区 | General time zone |
|
| 时区 | RFC 822 time zone |
|
3.3 Calendar类
Calendar 类是一个抽象类,为我们提供了关于日期计算的相关功能,比如:年、月、日、时、分、秒的展示和计算。GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
public class TestCalendar {
public static void main(String[] args) {
//创建Calendar对象
Calendar cal = new GregorianCalendar();
//输出日期中的各个部分
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.HOUR));
System.out.println(cal.get(Calendar.MINUTE));
System.out.println(cal.get(Calendar.SECOND));
System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
//修改日期中各个部分
cal.set(Calendar.YEAR,2000);
cal.set(Calendar.MONTH,1);
cal.set(Calendar.DATE,1); //2019-08-01
int max =cal.getActualMaximum(Calendar.DATE);
for(int i=1;i<=max;i++){
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
cal.add(Calendar.DATE,1);
}
System.out.println(cal.get(Calendar.DAY_OF_WEEK));
System.out.println(cal.getActualMinimum(Calendar.DATE));
System.out.println(cal.getActualMaximum(Calendar.DATE));
//输出Calendar对象
System.out.println(cal);
//Date--Calendar之间的转换
//Date ---->Calendar
Date now = new Date();
cal.setTime(now);
//Calendar---->Date
Date now2 = cal.getTime();
}
}
3.4 JDK8的新的日期类
针对JDK8以前的时间日期类设计的不足,比如不支持时区,线程不安全等,JDK8引入了java.time包来作为新的日期时间处理类。
属性 | 含义 |
Instant | 代表的是时间,相当于Date |
LocalDate | 代表日期,比如2020-01-14 |
LocalTime | 代表时刻,比如12:59:59 |
LocalDateTime | 代表具体时间 2020-01-12 12:22:26 |
ZonedDateTime | 代表一个包含时区的完整的日期时间,偏移量是以UTC/ 格林威治时间为基准的 |
Period | 代表时间段 |
ZoneOffset | 代表时区偏移量,比如:+8:00 |
Clock | 代表时钟,比如获取目前美国纽约的时间 |
DateTimeFormatter | 日期和字符串格式转换 |
四 其他常用类
Math类
java.lang.Math提供了一系列静态方法用于科学计算;其方法的参数和返回值类型一般为double型。如果需要更加强大的数学运算能力,计算高等数学中的相关内容,可以使用apache commons下面的Math类库。
public class TestMath {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.round(3.14));
System.out.println(Math.ceil(3.14));
System.out.println(Math.floor(3.14));
System.out.println(Math.sqrt(64));//开平方
System.out.println(Math.pow(2,5));//幂
System.out.println(Math.abs(-5));
System.out.println(Math.max(30,40));
System.out.println(Math.min(30,40));
System.out.println(Math.random());//[0.0,1.0)
}
}
Random类
Math类中虽然为我们提供了产生随机数的方法Math.random(),但是通常我们需要的随机数范围并不是[0, 1)之间的double类型的数据,这就需要对其进行一些复杂的运算。如果使用Math.random()计算过于复杂的话,我们可以使用例外一种方式得到随机数,即Random类,这个类是专门用来生成随机数的,并且Math.random()底层调用的就是Random的nextDouble()方法。
public class TestRandom {
public static void main(String[] args) {
//Random rand = new Random(10000);
Random rand = new Random();
System.out.println(rand.nextInt());
System.out.println(rand.nextInt(10));
System.out.println(rand.nextDouble());
System.out.println(rand.nextFloat());
for (int i = 0; i < 10; i++) {
System.out.print(rand.nextInt(10)+" ");
}
}
}
构造方法摘要 | |
Random |
|
Random |
|
枚举
JDK1.5引入枚举类型。枚举类型的定义包括枚举声明和枚举体。枚举体就是放置一些常量。
定义枚举要使用enum关键字。对于性别、季节、星期几等内容,如果定义为字符串类型,是很难限制其取值的。采用枚举可以轻松解决该问题。
//定义和使用性别枚举类
public enum Gender {
男,女
}
public class Person {
String name;
//String sex;//gender
Gender sex;
int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Gender getSex() {
return sex;
}
public void setSex(Gender sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static void main(String[] args) {
Person person = new Person();
//person.sex = "adfadfad";
person.sex = Gender.男;
System.out.println(person.getSex());
}
}
//【示例】定义和使用季节枚举类
public enum Season {
春,夏,秋,冬
}
public class TestSeason {
public static void main(String[] args) {
Season season = Season.夏;
switch(season){
case 春 :
System.out.println("春暖花开 踏青 春游 ");
break;
case 夏 :
System.out.println("夏日炎炎 吃雪糕 游泳");
break;
case 秋 :
System.out.println("秋高气爽 收庄稼 赏月");
break;
case 冬 :
System.out.println("冬雪皑皑 泡温泉 打雪仗");
break;
}
}
}
所有的枚举类型隐性地继承自 java.lang.Enum。枚举实质上还是类!而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final修饰的。可以直接通过枚举类型名使用它们。
注意
|