Java在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
1.基本数据类型对应的包装类
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| boolean | Boolean |
| short | Short |
| char | Character |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
-
包装类基本用法
package com.zry.test2; public class WrapperClass { public static void main(String[] args) { //基本数据类型转化为包装类对象 Integer a=new Integer(3); Integer b=Integer.valueOf(30); //把包装类转化为基本数据类型 int c=a.intValue(); double d=b.doubleValue(); //把字符串转化为包装类对象 Integer e=new Integer("66666"); Integer f=Integer.parseInt("6666666"); //把包装类转化为字符串对象 String str=f.toString(); //常见的常量 System.out.println("int类型最大值:"+Integer.MAX_VALUE); } } -
自动装箱和拆箱
package com.zry.test2; public class TestAutiBox { public static void main(String[] args) { Integer a=234;//自动装箱==>Integer a=new Integer(123); int b=a;//自动拆箱===>int b=a.intValue(); Integer c=null; if(c!=null) { int d=c;//如果不增加判断会报空指针异常 } } } -
缓存
package com.zry.test2; public class TestCache { public static void main(String[] args) { //-128~127是直接取 Integer a=Integer.valueOf(-128); Integer b=-128; System.out.println(a==b); System.out.println(a.equals(b)); System.out.println("不在范围的:"); Integer a1=1234; Integer b1=1234; System.out.println(a1==b1); System.out.println(a1.equals(b1)); } }
String 类对象代表不可变的Unicode字符序列,因此我们可以将String对象称为“不可变对象”。
1.String类测试
package com.zry.test2;
public class TestString {
public static void main(String[] args) {
String str="abcdef";
String str2=str.substring(2, 5);
System.out.println(str);
System.out.println(str2);
String s="hello"+" word";
String ss="hello word";
//字符串比较
System.out.println(s==ss);
String s1="hello";
String s2=" word";
//字符串拼接
String s12=s1+s2;
System.out.println(s==s12);
System.out.println(s.equals(s12));
}
}
- StringBuilder类测试
package com.zry.test2;
public class TestStringBuilder {
public static void main(String[] args) {
//StringBuilder线程不安全,效率高(一般使用);StringBuffer线程安全,效率低。
StringBuilder sb=new StringBuilder("abcdefg");
System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb);
sb.setCharAt(2, 'M');
System.out.println(Integer.toHexString(sb.hashCode()));
System.out.println(sb);
}
}
- String Builder常用方法
package com.zry.test2;
public class TestStringBuilder {
public static void main(String[] args) {
StringBuilder sb=new StringBuilder();
System.out.println(sb);
for(int i=0;i<7;i++) {
sb.append((char)('a'+i));
}
System.out.println(sb);
sb.reverse();//倒序
System.out.println(sb);
sb.insert(3, "我").insert(0, "爱");//链式调用,该方法调用了return this;
System.out.println(sb);
sb.delete(0, 2).deleteCharAt(5);//删除
System.out.println(sb);
}
}
-
不可变字符和可变字符序列使用的陷阱
package com.zry.test2; public class Test { public static void main(String[] args) { String str8 = ""; //本质上使用StringBuilder拼接, 但是每次循环都会生成一个StringBuilder对象 long num1 = Runtime.getRuntime().freeMemory();//获取系统剩余内存空间 long time1 = System.currentTimeMillis();//获取系统的当前时间 for (int i = 0; i < 5000; i++) { str8 = str8 + i;//相当于产生了10000个对象 } long num2 = Runtime.getRuntime().freeMemory(); long time2 = System.currentTimeMillis(); System.out.println("String占用内存 : " + (num1 - num2)); System.out.println("String占用时间 : " + (time2 - time1)); StringBuilder sb1 = new StringBuilder(""); long num3 = Runtime.getRuntime().freeMemory(); long time3 = System.currentTimeMillis(); for (int i = 0; i < 5000; i++) { sb1.append(i); } long num4 = Runtime.getRuntime().freeMemory(); long time4 = System.currentTimeMillis(); System.out.println("StringBuilder占用内存 : " + (num3 - num4)); System.out.println("StringBuilder占用时间 : " + (time4 - time3)); } }
- 时间处理相关类
-
Date类
-
Date() 分配一个Date对象,并初始化此对象为系统当前的日期和时间,可以精确到毫秒)。
-
Date(long date) 分配 Date 对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即 1970 年 1 月 1 日 00:00:00 GMT)以来的指定毫秒数。
-
boolean after(Date when) 测试此日期是否在指定日期之后。
-
booleanbefore(Date when) 测试此日期是否在指定日期之前。
-
-
boolean equals(Object obj) 比较两个日期的相等性。
-
long getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
-
String toString() 把此 Date 对象转换为以下形式的 String:
package com.zry.test2; import java.util.Date; public class TestDate { public static void main(String[] args) { Date d=new Date();//当前时间 Date d1=new Date(2000); System.out.println(d1); System.out.println(d.getTime()); System.out.println(d.after(d1));//d1在d之后?true System.out.println(d.before(d1));//d1在d之前?false } } -
-
DateFormat类和SimpleDateFormat类
DateFormat是一个抽象类,一般使用它的的子类SimpleDateFormat类来实现。
- 格式化字符含义
package com.zry.test2; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class TestDateFormat { public static void main(String[] args) throws ParseException { //把时间按照指定格式转化为时间字符串 DateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String str=df.format(new Date()); System.out.println(str); //把字符串按照指定格式转化为时间对象 DateFormat df1=new SimpleDateFormat("yyyy年MM月dd日 hh时mm分ss秒"); Date date=df1.parse("2019年03月25日 10时29分55秒"); System.out.println(date); //测试其他的格式字符 DateFormat df3=new SimpleDateFormat("D"); String str3=df3.format(new Date()); System.out.println(str3); } } -
Calendar日历类
GregorianCalendar 是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标准日历系统。
package com.zry.test2; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class TestCalender { public static void main(String[] args) { Calendar cld=new GregorianCalendar(2022,10,20,10,20,50); int year=cld.get(cld.YEAR);//获取年份 System.out.println(year); int month=cld.get(cld.MONTH);//获取月份:0-11月 System.out.println(month); //设置日期的相关元素 Calendar c2=new GregorianCalendar(); System.out.println(c2); c2.set(Calendar.YEAR, 8012); System.out.println(c2); //日期计算 Calendar c3=new GregorianCalendar(); c3.add(Calendar.YEAR, -100); System.out.println(c3); //日期对象和时间对象的转化 Date d=c3.getTime(); Calendar c4=new GregorianCalendar(); c4.setTime(new Date()); System.out.println(d); System.out.println(c4); } } -
可视化日历的编写
package com.zry.test2; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; import java.util.Scanner; public class CalenderTest { public static void main(String[] args) throws ParseException { System.out.println("请输入日期(格式为:2010-03-03):"); Scanner sc=new Scanner(System.in); String src=sc.next(); // String src="2022-04-11"; DateFormat df=new SimpleDateFormat("yyyy-MM-dd"); Date date=df.parse(src); Calendar c=new GregorianCalendar(); c.setTime(date); int day=c.get(Calendar.DAY_OF_MONTH); System.out.println("日t一t二t三t四t五t六"); c.set(Calendar.DAY_OF_MONTH, 1);//设置日期为目标月1号 for(int i=0;iSystem.out.print("t"); } int days=c.getActualMaximum(Calendar.DATE); for(int i=1;i<=days;i++) { if(day==c.get(Calendar.DAY_OF_MONTH)) { System.out.print(c.get(Calendar.DAY_OF_MONTH)+"*t");//打印当前日期 }else { System.out.print(c.get(Calendar.DAY_OF_MONTH)+"t");//打印本月其他日期 } if(c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) { System.out.println(); } c.add(Calendar.DAY_OF_MONTH,1); } } }
-
abs 绝对值
-
acos,asin,atan,cos,sin,tan 三角函数
-
sqrt 平方根
-
pow(double a, double b) a的b次幂
-
-
max(double a, double b) 取大值
-
min(double a, double b) 取小值
- ceil(double a) 大于a的最小整数
-
floor(double a) 小于a的最大整数
-
random() 返回 0.0 到 1.0 的随机数
-
long round(double a) double型的数据a转换为long型(四舍五入)
-
toDegrees(double angrad) 弧度->角度
-
toRadians(double angdeg) 角度->弧度
Random类
import java.util.Random;
public class TestRandom {
public static void main(String[] args) {
Random rand = new Random();
//随机生成[0,1)之间的double类型的数据
System.out.println(rand.nextDouble());
//随机生成int类型允许范围之内的整型数据
System.out.println(rand.nextInt());
//随机生成[0,1)之间的float类型的数据
System.out.println(rand.nextFloat());
//随机生成false或者true
System.out.println(rand.nextBoolean());
//随机生成[0,10)之间的int类型的数据
System.out.print(rand.nextInt(10));
//随机生成[20,30)之间的int类型的数据
System.out.print(20 + rand.nextInt(10));
//随机生成[20,30)之间的int类型的数据(此种方法计算较为复杂)
System.out.print(20 + (int) (rand.nextDouble() * 10));
}
}
5、File类
java.io.File类:代表文件和目录。 在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。
-
File类的常见构造方法:public File(String pathname)
import java.io.File; public class TestFile1 { public static void main(String[] args) throws Exception { System.out.println(System.getProperty("user.dir")); File f = new File("a.txt"); //相对路径:默认放到user.dir目录下面 f.createNewFile();//创建文件 File f2 = new File("d:/b.txt");//绝对路径 f2.createNewFile(); } } -
通过File对象可以访问文件的属性:
-
通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)
-
使用递归算法,以树状结构展示目录树
package com.zry.test2;
import java.io.File;
public class FileListTest {
public static void main(String[] args) {
File f=new File("Z:\Desktop\java学习笔记");
printFile(f,0);
}
public static void printFile(File file,int level) {
//输出
for (int i = 0; i < level; i++) {
System.out.print("-");
}
System.out.println(file.getName());
if(file.isDirectory()) {
File[] files=file.listFiles();
for(File temp:files) {
printFile(temp,level+1);
}
}
}
}
6、枚举
enum 枚举名 {
枚举体(常量列表)
}
package com.zry.test2;
public class TestEnum {
public static void main(String[] args) {
Season a=Season.AUTUMN;
switch (a) {
case SPRING:
System.out.println("春天来了");
break;
case SUMMER:
System.out.println("夏天来了");
break;
case AUTUMN:
System.out.println("秋天来了");
break;
case WINTER:
System.out.println("冬天来了");
break;
}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}
enum Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期日
}
}
7、练习题
一、选择题
- 以下选项中关于int和Integer的说法错误的是(BD )。(选择二项)
A.int是基本数据类型,Integer是int的包装类,是引用数据类型
B.int的默认值是0,Integer的默认值也是0
C.Integer可以封装了属性和方法提供更多的功能
D.Integer i=5;该语句在JDK1.5之后可以正确执行,使用了自动拆箱功能
- 分析如下Java代码,该程序编译后的运行结果是(A )。(选择一项)
public static void main(String[ ] args) {
String str=””;
str.concat("abc");
str.concat("def");
System.out.println(str);
}
A.null
B.abcdef
C.编译错误
D.运行时出现NullPointerException异常
- 以下关于String类的代码的执行结果是(B )。(选择一项)
public class Test2 {
public static void main(String args[]) {
String s1 = new String("bjsxt");
String s2 = new String("bjsxt");
if (s1 == s2)
System.out.println("s1 == s2");
if (s1.equals(s2))
System.out.println("s1.equals(s2)");
}
}
A.s1 == s2
B.s1.equals(s2)
C.s1 == s2
s1.equals(s2)
D.以上都不对
- 在Java中,以下File类的方法中( C)用来判断是否是目录。(选择一项)
A.isFile( )
B.getFile( )
C.isDirectory( )
D.getPath( )
- 分析下面代码的结果( A)。(选择一项)
public static void main(String args[]) {
String s = "abc";
String ss = "abc";
String s3 = "abc" + "def";
String s4 = "abcdef";
String s5 = ss + "def";
String s2 = new String("abc");
System.out.println(s == ss);TRUE
System.out.println(s3 == s4);TRUE
System.out.println(s4 == s5);TRUE
System.out.println(s4.equals(s5));FALSE
}
A.true true false true
B.true true true false
C.true false true true
D.false true false true
二、简答题
-
什么是自动装箱和自动拆箱?
自动装箱和拆箱就是将基本数据类型和包装类之间进行自动的互相转换。例如,在jdk1.5之后,Integer i =5;会自动封装成包装类。而Integer i = 5;int j = i;中i也可以自动拆箱成为int类型。
-
String、StringBuffer、StringBuilder区别与联系。
StringBuffer和StringBuilder非常类似,均代表可变的字符序列。 这两个类都是抽象类AbstractStringBuilder的子类,方法几乎一模一样。
区别:
StringBuffer JDK1.0版本提供的类,线程安全,做线程同步检查, 效率较低。
StringBuilder JDK1.5版本提供的类,线程不安全,不做线程同步检查,因此效率较高。 建议采用该类。 -
String str=”bjsxt”; 和String str= new String(“bjsxt”); 的区别。
String str=”bjsxt”; 这条语句在常量池中生成“bjsxt”的引用值并赋给str。String str= new String(“bjsxt”); 这条语句既在常量池中生成了了“bjsxt”,同时也创建了一个string对象,把对象的引用赋值给str。
-
File类的方法mkdir跟mkdirs,有什么区别?
mkdir创建目录,如果中间目录名缺失则创建失败,mkdirs创建目录,如果中间目录名缺失会自动创建。
-
简述枚举的使用。
三、编码题
- 验证键盘输入的用户名不能为空,长度大于6,不能有数字。
提示:使用字符串String类的相关方法完成
可以使用Scanner的nextLine()方法,该方法可以接口空的字符串。
package com.zry.day07.lx;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
boolean flag=false;
while(!flag) {
flag=testName();
}
}
public static boolean testName() {
System.out.print("请输入6位以上用户名:");
Scanner sc=new Scanner(System.in);
String name=sc.nextLine();
boolean flag = false;
if(name.isEmpty()) {
System.out.println("用户名为空,请重新输入。。。");
}else if(name.length()<6) {
System.out.println("用户名称小于6位,请重新输入。。。");
}else if(isNumber(name)) {
System.out.println("用户名不能包含数字,请重新输入。。。");
}else {
System.out.println("验证通过!");
flag=true;
}
return flag;
}
public static boolean isNumber(String name) {
for(int i=0;i
if(Character.isDigit(name.charAt(i))) {
return true;
}
}
return false;
}
}
- 接收从键盘输入的字符串格式的年龄,分数和入学时间,转换为整数、浮点数、日期类型,并在控制台输出。
提示:使用包装类Integer、Double和日期转换类DateFormat实现
package com.zry.day07.lx;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) throws ParseException {
String age,grade,date;
Scanner sc=new Scanner(System.in);
System.out.println("年龄:");
age=sc.nextLine();
Integer age1=Integer.parseInt(age);
System.out.println("分数:");
grade=sc.next();
Double grade1=Double.valueOf(grade);
System.out.println("入学时间(格式:2022-02-11):");
date=sc.next();
DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
Date date1=df.parse(date);
System.out.println("年龄age="+age1+",成绩grade="+grade1+",入学时间date="+date1);
}
}
- 根据交通信号灯颜色决定汽车停车、行驶和慢行
提示:使用枚举实现
package com.zry.day07.lx;
public class Test3 {
public static void main(String[] args) {
Light l=Light.RED;
switch (l) {
case RED:
System.out.println("汽车停车");
break;
case YELLOW:
System.out.println("汽车慢行");
break;
case GREEN:
System.out.println("汽车行驶");
break;
default:
System.out.println("没有该颜色信号灯");
break;
}
}
enum Light{
RED,YELLOW,GREEN
}
}



