目录
一、实验目的
二、实验内容
三、实验小结
3.1 常用实用类
3.2 Java集合框架
一、实验目的
1、掌握java常用类的方法
2、掌握String类与数值类型数据的相互转化
3、掌握正则表达式的应用
4、掌握常用集合的创建和操作方法
二、实验内容
1、菜单的内容如下:“北京烤鸭:189元,西芹炒肉:12.9元,酸菜鱼:69元,铁板牛柳:32元。”编写一个JAVA应用程序,输入菜单内容,然后输出菜单中的价格数据,并计算出菜单的总价格。
源代码:
实验运行截图:
2、利用DateFormat、Date、Calendar等相关类,编程实现如下功能:(1)用户输入2个日期,第一个日期用整数形式输入,把输入的整数设置为日历对象1的年月日的值。第二个日期以字符串形式输入,形如“2022-10-25”,并设置为日历对象2的年月日的值。将2个日期以“xx年xx月xx日”的格式输出。
(2)程序判断并输出第二个日期表示的时间是该年度第几周、第几天;
(3)判断并输出2个日期的大小关系,以及2个日期之间的间隔天数。
算法描述及实验步骤:
(1)①先创建两个SimpleDateFormat格式化对象用来将用户输入的字符串日期解析为Date对象的日期形式。
②创建两个Calendar类的实例对象并通过Calendar类的setTime( )方法将解析过的两个Date对象分别封装到两个日历对象中。
③最后通过创建一个格式化的SimpleDateFormat类的对象并调用其format( )方法来将用户输入的两日期以指定日期格式字符串输出。
(2)①将日历对象调用get( )方法并传入Calendar类的相关枚举常量来获取当年日期是第几周和第多少天。
(3)①通过使用Calendar类的compareTo( )方法来比较两日期的大小关系。
②两日历对象通过调用Calendar类的getTimeInMillis()方法来分别获取各自的1970年1月1日以来到该日期的毫秒数。然后将其相减就可以获得两日期之间相差了多少毫秒。最后将两日期相差的毫秒数转化为天数并输出(一天24 小时、1小时60分钟、1分钟60秒、1秒1000毫秒即days=(tim2-time1)/(24*60*60*1000)。
源代码:
实验运行截图:
3、写一个彩票程序:随机生成9个随机数(100~999之间)模拟该期彩票号码,注意不能重复,存入集合中。然后从键盘输入3个数模拟用户购买号码。程序对集合进行遍历,对比3个数是否与集合中的数有相同的。最后显示该期彩票号码、用户号码以及“中了几个号”,如果中了3个号,显示一等奖;如果中了2个号,显示二等奖;如果中了1个号,显示三等奖。要求:选用合适的容器和算法。(说明:键盘输入可以使用Scanner类)
源代码:
实验运行截图:
三、实验小结
3.1 常用实用类
String类:
1、创建String类的对象有三种方式分别是:new String(“字符串”)、new String(字符数组名)、new String(字节数组名)。字符串对象也可以调用string.getChars(字符串开始下标,字符串结束下标,目的字符数组名,目的字符数组下标)方法,来将字符串中的部分字符赋值给指定字符数组。
2、String类对象常用方法:
string.length()-------获取字符串长度
string.equals(“字符串”)------判断两字符串是否相等。两字符串变量之间使用关系运算符比较的是各自保存的地址引用的大小而不是字符串之间的比较。
string.compareTo(“字符串”)------根据字符串的编码从左到右依次比较每个字符的大小,类似C语言的strcmp()函数。
string.startsWith(“字符串”)-------判断string字符串是否以参数所指的字符串开头。
string.endsWith(“字符串”)--------判断string字符串是否以参数所指的字符串结束。
string.contains(“字符串”)----------判断String字符串是否包含参数所指的字符串。
string.indexOf(“字符串”)---------获取参数所指字符串在String原字符串出现的下标位置。
string.substring(开始下标,结束下标)----------获取String字符串指定下标之间的字串。
String.trim(“字符串”)--------将String字符串前后的空格去掉并以新字符串的形式返回。
3、将数字字符串转化为基本数值类型需要导入java.lang包中的相应基本数据类如:Integer整数类、Double小数类等,然后调用各自的parseInt( )等方法将其转化为指定的数值类型返回。
4、数值型转化为相应字符串有两种方法:String.valueOf(数值)或通过“+”与字符串做并置运算。
5、Integer类或long类调用其类方法toBinaryString(整数)等可以将其指定整数转化为相应进制的字符串返回。
6、我们在使用println(object)等函数打印对象的内容时,其背后解释器会自动调用对象继承或重写object类的toString( )方法并将其返回值作为对象打印输出的结果。
正则表达式:
1、
.-------表示任意一个字符
\\.-----单纯表示一个.
\\d-----表示一个0-9的数字字符
\\D-----表示任意一个非数字的字符
\\s------表示一个空格或2个tab键
\\S------表示任意一个非空格字符
\\w------表示一个普通字符如数字、字母、下划线
\\W-----表示任意一个非普通字符即特殊字符如%、@、!等
\\p{Punct}-----表示一个标点符号
[^a-aA-Z0-9]----表示中括号各字符之外的任意一个字符,^表示取反。
2、
*--------前一个字符匹配任意次
?---------前一个字符至多匹配1次
+---------前一个字符至少匹配1次
{n}-------前一个字符必需匹配n次
{n,}------前一个字符至少匹配n次
{n,m}----前一个字符至少匹配n次、至多匹配m次即n~m次。
字符串---前一个字符的后缀是字符串
x|y--------要么匹配的是x要么是y
3、
String.matches(“正则表达式”)判断String字符串是否完全匹配正则表达式,返回真假。
String.replaceAll(“正则表达式”, ”替换字符串”)将String字符串匹配正则表达式的所有字串替换为参数二所指字符串。
分割字符串:
1、分割字符串有三种方法:
1.1使用字符串的string.split(“正则表达式”)方法,将string字符串以正则表达式匹配的字串作为分割符,来切割原字符串并以字符数组的形式返回切割后的字符数组的首地址。
1.2通过创建StringTokenizer类的对象如:new StringTokenizer(“字符串”,”分割字符”)来将字符串以指定分割字符进行切割并将其保存到StringTokenizer类的对象中。其对象通过调用nextToken()方法来逐个获取分割后的各字符串,调用hasMoreTokens()来判断对象中是否还有剩余的分割后的字符串,通过countTokens()来获取对象中剩余的分割字符串个数。
1.3通过创建Scanner类的对象如:new Scanner(“字符串”),来调用useDelimiter(“正则表达式”)来将对象封装的字符串进行按正则匹配的结果作为分割符进行切割字符串,并将切割后的字符串保存到对象中。对象调用next()方法可以逐个获取切割的字符串、使用hasNext()方法来判断对象中分割字符串是否读取完了。
模式匹配:
通过使用java.util.regex包中的Pattern类与Matcher类可以对指定字符串进行正则表达式检索。其步骤为:
- 创建一个需要被正则检索的文本字符串。
- 通过调用Pattern.compile(regex)方法来创建Pattern类的模式对象。
- 模式对象通过调用matcher(“文本字符串”)方法来创建一个Matcher类的对象即确定要匹配的文本字符串。
- 最后,Matcher的对象通过调用各方法来检索文本字符串。如:find()、lookingAt()从左向右检索与正则匹配模式匹配的字符串等。
StringBuffer类:
String类创建的字符串不能被修改,而使用StringBuffer类创建的对象其封装的字符串可以通过StringBuffer类的对象调用类中的各方法来对对象中的原字符串进行修改。例如:StringBuffer类的对象通过调用append(“字符串”)方法可以将参数所指字符串追加到对象中封装的原字符串后面。
日期与时间:
1、java.time包中有专门操作日期时间的三个类如:LocalDate只封装年月日、LocalDateTime封装年月日时分秒纳秒、LocalTime只封装时间。其三种类的使用基本是相似的如:
new LocalDateTime.now()-------获取本地日期时间的LocalDateTime类的对象。
new LocalDateTime.of(年,月,日,时,分,秒,纳秒)------返回指定日期时间的LocalDateTime类的对象。
2、对象常用方法:
object.getYear()------返回年
object.getMonthValue()-------返回月
object.getDayOfMonth()-------返回日
object.getHour()-------返回时
object.getMinute()------返回分
object.getSecond()-------返回秒
object.getNano()--------返回纳秒
object.getDayOfWeek()-----返回周
object.getDayOfYear()-------返回当年第几天
object.isLeapYear()-------判断是否为润年
object.plusMonths(int months)------当前日期增加months个月后的新日期对象作为返回值
object.compareTo(日期对象)-------比较日期大小,年、月、日从左到右依次比较。
3、计算时间差:
在使用日期类的对象调用until(日期对象2,ChronoUnit.DAYS)方法,来获取两日期之间的时间差之前需要导入java.time.temporal.ChronoUnit类。其中ChronoUnit.DAYS表示获取两日期相差多少天、ChronoUnit.MONTHS表示相差多少日、ChronoUnit.YEARS表示相差多少年(不足相差一个时间单位的按0计算)
4、通过String类直接调用format(“%tY-%<tm-%<td %<tA %<tH:%<tM:%<tS:%<tN”,日期类对象), 返回日期格式化后的日期字符串。
Math类与Random类
1、Match类可以直接调用如下方法:
Match.sqrt(double a)-------对a开平方根
Match.ceil(double a)--------返回大于或等于a的最小整数即向上取整
Match.floor(double a)-------返回小于或等于a的最小整数即向下取整
Match.round(double a)-----对a进行四舍五入保留整数部分(如果a为负数则小数部分小于或等于0.5舍弃、大于0.5入)。
2、使用new Random()创建的随机数对象,通过调用nextInt(int m)方法来返回[0,m)区间的随机整数。调用nextDouble()方法返回[0.0, 1)区间的随机小数。调用nextBoolean()返回随机的真假值。
Class类与反射:
1、所谓反射就是使用另个类的对象来操作获取当前类的成员变量和方法。默认情况下任何类包括用户自定义的类都会隐藏着一个类变量即Class类的class对象,里面封装着当前类的一些信息如:类名、成员变量、构造方法、和普通方法。
2、任何类的Class变量对象调用class.getName( )获取类名字符串信息、Constructor[] getDeclaredConstructors()返回类的全部构造方法声明、Field[] getDeclaredFields()返回类的全部成员变量、Method[] getDeclaredMethods( )返回类的全部方法。
3、创建一个类的对象有两种形式。一种使用new方法、另一种使用Class类的与任何类都相关的class对象。其方法如下:
3.1 先得到和要实例化的类相关的class对象如:Class.forName(类名),通过类名获取隐藏在该类下的class对象变量。
3.2 获取要实例化的类的无参构造方法如:Construct<?>=class.getDeclaredConstructor();
3.3 最后construct<?>对象调用调用newInstance()方法来将类实例化并将创建的对象返回。
Arrays数组类与System类和Console类:
1、java.util包中的数组类可以直接调用其类中的类方法来操作数组。如:Arrays.sort(数组名)对数组升序排序、Arrays.BinarySearch(数字组名,插找的元素)二分查找指定元素等。Arrays.copyOf(原素数组,拷贝元素数)拷贝原数组指定个数元素到一个新数组中并返回新数组的首地址。
2、System.nanoTime()方法返回计算机从1970年1月1日起至今的纳秒。System.out.exit(状态码)退出程序。System.gc()手动进行垃圾回收。
3、Console类可用于实现用户在命令行输入的文本肉眼不可见。即先通过System类直接调用console()方法来返回一个Console类的对象,然后通过Console类的对象调用readPassword()方法读取用户在键盘上输入的一行肉眼不可识别的文本,并将文本以char字符数组返回。
3.2 Java集合框架
泛型:
1、所谓泛型即任意数据类型。由泛型定义的变量或方法可以接收或返回任意的指定类型的数据对象。
形式:class 类名<泛型列表如:E,K >{
类体
}
2、用泛型类声明或创建对象时必须指定泛型列表中的泛型所代表的具体数据类型;类实现泛型接口时也要具体指定泛型接口中的泛型所代表的具体数据类型。
链表:
1、用LinkedList<E>泛型类创建的链表对象的各节点是由:“数据域+上节点地址,下节点地址”组合构成的双向链表。可以在链表的任意位置插入或删除数据对象。
2、链表对象常用方法有:
2.1 void add(int index,E obj)向链表的指定位置添加新节点对象obj;省略第一个参数表示在链表的后面追加节点对象并返回真假。
2.2 void clear()删除当前链表的所有节点使其成为空链表。
2.3 remove(int index | E obj)删除指定位置上的节点或指定对象在链表中首次出现的节点。
2.4 E get(int index)获取链表中指定位置的节点对象。
2.5 E set(int index ,E obj)将当前链表中指定位置上的数据替换为实参指定的对象,并返回被替换的数据对象。
2.6 int size()返回链表的节点个数即长度。
2.7 object clone()获得当前链表的克隆链表(两个链表结点数据变化互不影响)
2.8 boolean contains(object obj)判断当前链表中是否含有实参指定的节点对象。使用此方法之前必须保证当前列表的节点对象的类实现了equals(object o)判断对象是否相等的方法。
3、链表对象可以使用iterator()方法来获取当前链表的迭代器对象,然后使用迭代器对象的hasNext()方法判断链表中是否还有节点每读取完、使用next()方法获取链表下个节点对象。
堆栈:
1、使用Stack<E>泛型类可以创建一个堆栈对象。堆栈中添加的第一数据对象会被放下“桶”
的最低端,后面添加的数据对象直接摞在前一个添加的数据对象上面。堆栈中的数据对象尊循“先进后出、后进先出”。
2、堆栈对象使用push(E item)方法向栈中添加数据、pop()方法将栈中的数据对象弹出返回并删除、empty()方法判断堆栈中是否还有数据返回真假、search(object data)方法获取对象在堆栈中的位置(堆栈最顶端的位置为1,往下递增),没有返回-1。
散列映射:
1、使用HashMap<key,value>泛型类来创建散列映射对象即字典,用来存储键值对。通常用来存储经常查询的数据、可以减少检索开销。
2、散列映射中存储的值的键不能相同,否则将会发生值的替换。
3、散列映射对象使用push(K key,V value)方法向散列映射对象中添加键值对数据;使用get(Object key)方法获取键在散列对象中所对应的值;使用remove(Object key)方法删除散列映射对象中相应的键值对数据。
树集:
1、所谓树集就是以倒挂树的形式来组织存储节点数据对象的集合。树集中的节点所存储的对象的类必须是实现了Comparable接口的类,只有这样树集才能根据节点对象中的compareTo()方法对各节点进行升序排列(树集各节点从上到下层递增、同层从左到右递增)。
2、使用TreeSet(E)泛型类创建树集对象。用树集创建的对象其各节点对象依据某个属性实现了自动升序排序。
树映射:
1、树映射与树集类似,只不过树映射各节点存放的是键值对即保存的是“对象地址+关键字”;并且树映射各节点是以各节点中的键来进行升序排列的。
2、使用TreeMap()泛型类来创建树映射对象。
集合:
1、使用HashSet<E>泛型类创建集合对象来存储元素对象。集合中的元素是无序排列的、且元素对象不能重复。
2、集合对象使用add(obj)方法向其集合中添加元素对象、使用remove(Object 0)方法删除集合中指定的元素对象、使用size()方法获取集合中的元素对象个数。
3、集合对象使用addAll(HashSet set)方法对两个集合进行并运算并将结果作用于原集合对象。retainAll(HashSet set)方法将两个集合对象进行并运算,结果同样作用于原集合。removeAll(HashSet set)方法实现两个集合对象进行差运算(去掉另个集合中的元素后所剩下的元素),并将结果作用于原集合。
@声明:“山月润无声”博主知识水平有限,以上文章如有不妥之处,欢迎广大IT爱好者指正,小弟定当虚心受教!