public class BubbleTest {
public static void main(String[] args) {
int[] arr = { 24, 69, 80, 57, 13 };
System.out.println("排序前:");
printArray(arr);
bubbleSort(arr);
System.out.println("排序后:");
printArray(arr);
}
// 打印数组,遍历功能
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
System.out.print(arr[x]);
} else {
System.out.print(arr[x] + ",");
}
}
System.out.println("]");
}
public static void bubbleSort(int[] arr) {
for (int y = 0; y < arr.length - 1; y++) {
for (int x = 0; x < arr.length - 1 - y; x++) {
if (arr[x] > arr[x + 1]) {
int temp = arr[x];
arr[x] = arr[x + 1];
arr[x + 1] = temp;
}
}
}
}
}
public class ArrayDemo {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 24, 69, 80, 57, 13 };
System.out.println("排序前:");
printArray(arr);
/*
// 第一次
int x = 0;
for (int y = x + 1; y < arr.length; y++) {
if (arr[y] < arr[x]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
System.out.println("第一次比较后:");
printArray(arr);
// 第二次
x = 1;
for (int y = x + 1; y < arr.length; y++) {
if (arr[y] < arr[x]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
System.out.println("第二次比较后:");
printArray(arr);
// 第三次
x = 2;
for (int y = x + 1; y < arr.length; y++) {
if (arr[y] < arr[x]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
System.out.println("第三次比较后:");
printArray(arr);
// 第四次
x = 3;
for (int y = x + 1; y < arr.length; y++) {
if (arr[y] < arr[x]) {
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
System.out.println("第四次比较后:");
printArray(arr);
*/
/*
//通过观察发现代码的重复度太高,所以用循环改进
for(int x=0; x<arr.length-1; x++){
for(int y=x+1; y<arr.length; y++){
if(arr[y] <arr[x]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
System.out.println("排序后:");
printArray(arr);
*/
//用方法改进
selectSort(arr);
System.out.println("排序后:");
printArray(arr);
}
public static void selectSort(int[] arr){
for(int x=0; x<arr.length-1; x++){
for(int y=x+1; y<arr.length; y++){
if(arr[y] <arr[x]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
// 遍历功能
public static void printArray(int[] arr) {
System.out.print("[");
for (int x = 0; x < arr.length; x++) {
if (x == arr.length - 1) {
System.out.print(arr[x]);
} else {
System.out.print(arr[x] + ", ");
}
}
System.out.println("]");
}
}
17.二分查找
public class ArrayDemo {
public static void main(String[] args) {
//定义一个数组
int[] arr = {11,22,33,44,55,66,77};
//写功能实现
int index = getIndex(arr, 33);
System.out.println("index:"+index);
//假如这个元素不存在后有什么现象呢?
index = getIndex(arr, 333);
System.out.println("index:"+index);
}
/*
* 两个明确:
* 返回值类型:int
* 参数列表:int[] arr,int value
*/
public static int getIndex(int[] arr,int value){
//定义最大索引,最小索引
int max = arr.length -1;
int min = 0;
//计算出中间索引
int mid = (max +min)/2;
//拿中间索引的值和要查找的值进行比较
while(arr[mid] != value){
if(arr[mid]>value){
max = mid - 1;
}else if(arr[mid]<value){
min = mid + 1;
}
//加入判断
if(min > max){
return -1;
}
mid = (max +min)/2;
}
return mid;
}
}
18.Arrays类 大多为静态方法
Arrays:针对数组进行操作的工具类。比如说排序和查找。
* 1:public static String toString(int[] a) 把数组转成字符串
* 2:public static void sort(int[] a) 对数组进行排序
* 3:public static int binarySearch(int[] a,int key) 二分查找
示例
=======================================
public class ArraysDemo {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 24, 69, 80, 57, 13 };
// public static String toString(int[] a) 把数组转成字符串
System.out.println("排序前:" + Arrays.toString(arr));
// public static void sort(int[] a) 对数组进行排序
Arrays.sort(arr);
System.out.println("排序后:" + Arrays.toString(arr));
// [13, 24, 57, 69, 80]
// public static int binarySearch(int[] a,int key) 二分查找
System.out.println("binarySearch:" + Arrays.binarySearch(arr, 57));
System.out.println("binarySearch:" + Arrays.binarySearch(arr, 577));
}
}
================================================
public static String toString(int[] a)
public static void sort(int[] a) 底层是快速排序,知道就可以了。有空看,有问题再问我
public static int binarySearch(int[] a,int key)
开发原则:
只要是对象,我们就要判断该对象是否为null。
int[] arr = { 24, 69, 80, 57, 13 };
System.out.println("排序前:" + Arrays.toString(arr));
public static String toString(int[] a) {
//a -- arr -- { 24, 69, 80, 57, 13 }
if (a == null)
return "null"; //说明数组对象不存在
int iMax = a.length - 1; //iMax=4;
if (iMax == -1)
return "[]"; //说明数组存在,但是没有元素。
StringBuilder b = new StringBuilder();
b.append(‘[‘); //"["
for (int i = 0; ; i++) {
b.append(a[i]); //"[24, 69, 80, 57, 13"
if (i == iMax)
//"[24, 69, 80, 57, 13]"
return b.append(‘]‘).toString();
b.append(", "); //"[24, 69, 80, 57, "
}
}
-----------------------------------------------------
int[] arr = {13, 24, 57, 69, 80};
System.out.println("binarySearch:" + Arrays.binarySearch(arr, 577));
public static int binarySearch(int[] a, int key) {
//a -- arr -- {13, 24, 57, 69, 80}
//key -- 577
return binarySearch0(a, 0, a.length, key);
}
private static int binarySearch0(int[] a, int fromIndex, int toIndex,
int key) {
//a -- arr -- {13, 24, 57, 69, 80}
//fromIndex -- 0
//toIndex -- 5
//key -- 577(用一个不存在的数测试)
int low = fromIndex; //low=0
int high = toIndex - 1; //high=4
while (low <= high) {
int mid = (low + high) >>> 1; //>>> 无符号右移,相当于除以2 mid=2,mid=3,mid=4
int midVal = a[mid]; //midVal=57,midVal=69,midVal=80
if (midVal < key)
low = mid + 1; //low=3,low=4,low=5
else if (midVal > key)
high = mid - 1;
else
return mid; // key found
}
return -(low + 1); // key not found.
}
public class IntegerDemo {
public static void main(String[] args) {
// 不麻烦的就来了,冒号为查阅API信息
// public static String toBinaryString(int i)
System.out.println(Integer.toBinaryString(100));
// public static String toOctalString(int i)
System.out.println(Integer.toOctalString(100));
// public static String toHexString(int i)
System.out.println(Integer.toHexString(100));
// public static final int MAX_VALUE
System.out.println(Integer.MAX_VALUE);
// public static final int MIN_VALUE
System.out.println(Integer.MIN_VALUE);
}
}
20.Integer的构造方法
两种方法
* public Integer(int value)
* public Integer(String s)
* 注意:这个字符串必须是由数字字符组成
*/
public class IntegerDemo {
public static void main(String[] args) {
// 方式1
int i = 100;
Integer ii = new Integer(i);
System.out.println("ii:" + ii);//输出的不是地址,证明已重写toString方法
// 方式2
String s = "100";
// NumberFormatException
// String s = "abc"; (报错)
Integer iii = new Integer(s);
System.out.println("iii:" + iii);
}
}
21.int类型和String类型的相互转换
int -- String
* String.valueOf(number)
*
* String -- int
* Integer.parseInt(s)
public class IntegerDemo {
public static void main(String[] args) {
// int -- String
int number = 100;
// 方式1
String s1 = "" + number;
System.out.println("s1:" + s1);
// 方式2
String s2 = String.valueOf(number);
System.out.println("s2:" + s2);
// 方式3
// int -- Integer -- String
Integer i = new Integer(number);
String s3 = i.toString();
System.out.println("s3:" + s3);
// 方式4
// public static String toString(int i)
String s4 = Integer.toString(number);
System.out.println("s4:" + s4);
System.out.println("-----------------");
// String -- int
String s = "100";
// 方式1
// String -- Integer -- int
Integer ii = new Integer(s);
// public int intValue()
int x = ii.intValue();
System.out.println("x:" + x);
//方式2
//public static int parseInt(String s)
int y = Integer.parseInt(s);
System.out.println("y:"+y);
}
}
22.常用的基本进制转换
* public static String toBinaryString(int i)
* public static String toOctalString(int i)
* public static String toHexString(int i)
*
* 十进制到其他进制
* public static String toString(int i,int radix)
* 由这个我们也看到了进制的范围:2-36
* 为什么呢?0,...9,a...z(10+26)
*
* 其他进制到十进制
* public static int parseInt(String s,int radix)
//示例
// 十进制到二进制,八进制,十六进制
System.out.println(Integer.toBinaryString(100));
System.out.println(Integer.toOctalString(100));
System.out.println(Integer.toHexString(100));
System.out.println("-------------------------");
//NumberFormatException
//System.out.println(Integer.parseInt("123", 2));(报错原因:123不是合法的二进制表示)
23.JDK5的新特性自动装箱和拆箱
// 定义了一个int类型的包装类类型变量i
// Integer i = new Integer(100);
Integer ii = 100;
ii += 200;
System.out.println("ii:" + ii);
// 通过反编译后的代码
// Integer ii = Integer.valueOf(100); //自动装箱
// ii = Integer.valueOf(ii.intValue() + 200); //自动拆箱,再自动装箱
// System.out.println((new StringBuilder("ii:")).append(ii).toString());
Integer iii = null;
// NullPointerException(注意空指针异常)
if (iii != null) {
iii += 1000;
System.out.println(iii);
}
24.Integer面试题
/*
* 看程序写结果(since JDK 1.5)
*
* 注意:Integer的数据直接赋值,如果在-128到127之间,会直接从缓冲池里获取数据(不会再通过new来创建)
*/
public class IntegerDemo {
public static void main(String[] args) {
Integer i1 = new Integer(127);
Integer i2 = new Integer(127);
System.out.println(i1 == i2);
System.out.println(i1.equals(i2));
System.out.println("-----------");
Integer i3 = new Integer(128);
Integer i4 = new Integer(128);
System.out.println(i3 == i4);
System.out.println(i3.equals(i4));
System.out.println("-----------");
Integer i5 = 128;
Integer i6 = 128;
System.out.println(i5 == i6);
System.out.println(i5.equals(i6));
System.out.println("-----------");
Integer i7 = 127;
Integer i8 = 127;
System.out.println(i7 == i8);
System.out.println(i7.equals(i8));
// 通过查看源码,我们就知道了,针对-128到127之间的数据,做了一个数据缓冲池,如果数据是该范围内的,每次并不创建新的空间
// Integer ii = Integer.valueOf(127);//反编译查询
}
}
图解
equals方法被重写过,所以比较的是内容,均为true;
查源码(跟踪valueOf方法)
跟踪low
25.Character类
构造方法
、Character 类在对象中包装一个基本类型 char 的值
* 此外,该类提供了几种方法,以确定字符的类别(小写字母,数字,等等),并将字符从大写转换成小写,反之亦然
*
* 构造方法:
* Character(char value)
Character ch = new Character(‘a‘);
System.out.println("ch:" + ch); //输出ch:a toString方法重写
26.Character类的常用方法
public static boolean isUpperCase(char ch):判断给定的字符是否是大写字符
* public static boolean isLowerCase(char ch):判断给定的字符是否是小写字符
* public static boolean isDigit(char ch):判断给定的字符是否是数字字符
* public static char toUpperCase(char ch):把给定的字符转换为大写字符
* public static char toLowerCase(char ch):把给定的字符转换为小写字符
举例
System.out.println("isUpperCase:" + Character.isUpperCase(‘A‘));
System.out.println("isLowerCase:" + Character.isLowerCase(‘a‘));
System.out.println("isDigit:" + Character.isDigit(‘0‘));
day14
1.
l正则表达式:是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
l
l举例:校验qq号码.
1:要求必须是5-15位数字
2:0不能开头
=================================================================
不用正则表达式的做法
import java.util.Scanner;
/*
* 校验qq号码.
* 1:要求必须是5-15位数字
* 2:0不能开头
*
* 分析:
* A:键盘录入一个QQ号码
* B:写一个功能实现校验
* C:调用功能,输出结果。
*/
public class RegexDemo {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
System.out.println("checkQQ:"+checkQQ(qq));
}
/*
* 写一个功能实现校验 两个明确: 明确返回值类型:boolean 明确参数列表:String qq
*/
public static boolean checkQQ(String qq) {
boolean flag = true;
// 校验长度
if (qq.length() >= 5 && qq.length() <= 15) {
// 0不能开头
if (!qq.startsWith("0")) {
// 必须是数字
char[] chs = qq.toCharArray();
for (int x = 0; x < chs.length; x++) {
char ch = chs[x];
if (!Character.isDigit(ch)) {
flag = false;
break;
}
}
} else {
flag = false;
}
} else {
flag = false;
}
return flag;
}
}
用正则表达式改进
下图---String类中的API
/*
* 正则表达式:符合一定规则的字符串。
*/
public class RegexDemo2 {
public static void main(String[] args) {
// 创建键盘录入对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的QQ号码:");
String qq = sc.nextLine();
System.out.println("checkQQ:" + checkQQ(qq));
}
public static boolean checkQQ(String qq) {
// String regex ="[1-9][0-9]{4,14}";
// //public boolean matches(String regex)告知此字符串是否匹配给定的正则表达式
// boolean flag = qq.matches(regex);
// return flag;
//return qq.matches("[1-9][0-9]{4,14}");//简化版,一行代码
return qq.matches("[1-9]\\d{4,14}");
}
}
2
.正则表达式的规则
规则字符在java.util.regexPattern类中
A:字符
x 字符 x。举例:‘a‘表示字符a(任意的字符表示它本身)
\\ 反斜线字符。("\\"表示反斜线\)
\n 新行(换行)符 (‘\u000A‘)
\r 回车符 (‘\u000D‘)
B:字符类(把很多字符都放到一起)
[abc] a、b 或 c(简单类)(意为匹配三选一,但不能同时匹配两个,例如ab)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a到 z 或 A到 Z,两头的字母包括在内(范围) (这个写法就意味着包括了所有英文字母)
[0-9] 0到9的字符都包括
例如上面:[1-9][0-9]{4,14}
代表qq号码第一个数字在1~9范围之内(也就是不能为零),第二个数字开始(后面的{4,14}规定了除了第一个数字之外,还包含了4~14之间任意的数字个数,而这些数字的取值范围就在0-9之间)(总的来说就是qq号码一共是5-15个数字,其中第一个数字不能为零,剩余的4-14个数字可以为零)
C:预定义字符类(\有转义字符的意思)
. 任何字符。我的就是.字符本身,怎么表示呢? \.
\d 数字:[0-9]
例如上面:[1-9][0-9]{4,14}可以改写为[1-9]\\d{4,14}
\w 单词字符:[a-zA-Z_0-9]
在正则表达式里面组成单词的东西必须有这些东西组成
D:边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
就是不是单词字符的地方。(单词与单词之间隔开的东西,如下面单词与单词之间的空格,还有?;)
举例:hello world?haha;xixi
E:Greedy 数量词
X? X,一次或一次也没有(0次或者1次)
X* X,零次或多次(0次或者1次以上)
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
例如上面:[1-9][0-9]{4,14}代表[0-9]至少出现4次但不超过14次([1-9]不给出次数,默认为一次)
3.
* 判断功能
* String类的public boolean matches(String regex)
*
* 需求:
* 判断手机号码是否满足要求?
*
* 分析:
* A:键盘录入手机号码
* B:定义手机号码的规则
* 13436975980
* 13688886868
* 13866668888
* 13456789012
* 13123456789
* 18912345678
* 18886867878
* 18638833883
* C:调用功能,判断即可
* D:输出结果
*/
public class RegexDemo {
public static void main(String[] args) {
//键盘录入手机号码
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的手机号码:");
String phone = sc.nextLine();
//定义手机号码的规则
String regex = "1[38]\\d{9}";
//调用功能,判断即可
boolean flag = phone.matches(regex);
//输出结果
System.out.println("flag:"+flag);
}
}
4.校验邮箱案例(判断功能)
import java.util.Scanner;
/*
* 校验邮箱
*
* 分析:
* A:键盘录入邮箱
* B:定义邮箱的规则
* C:调用功能,判断即可
* D:输出结果
*/
public class RegexTest {
public static void main(String[] args) {
//键盘录入邮箱
Scanner sc = new Scanner(System.in);
System.out.println("请输入邮箱:");
String email = sc.nextLine();
//定义邮箱的规则
//String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]{2,6}(\\.[a-zA-Z_0-9]{2,3})+";
String regex = "\\w+@\\w{2,6}(\\.\\w{2,3})+";
//调用功能,判断即可
boolean flag = email.matches(regex);
//输出结果
System.out.println("flag:"+flag);
}
}
5.正则表达式 分割功能
String类的public String[] split(String regex)
根据给定正则表达式的匹配拆分此字符串。
/*举例:
百合网,世纪佳缘,珍爱网,QQ
搜索好友
性别:女
范围:"18-24"
age>=18 && age<=24
*/
public class RegexDemo {
public static void main(String[] args) {
//定义一个年龄搜索范围
String ages = "18-24";
//定义规则
String regex = "-";
//调用方法
String[] strArray = ages.split(regex);
// //遍历
// for(int x=0; x<strArray.length; x++){
// System.out.println(strArray[x]);
// }
//如何得到int类型的呢?
int startAge = Integer.parseInt(strArray[0]);
int endAge = Integer.parseInt(strArray[1]);
//键盘录入年龄
Scanner sc = new Scanner(System.in);
System.out.println("请输入你的年龄:");
int age = sc.nextInt();
if(age>=startAge && age<=endAge) {
System.out.println("你就是我想找的");
}else {
System.out.println("不符合我的要求,gun");
}
}
}
6.分隔功能练习
public class RegexDemo2 {
public static void main(String[] args) {
// 定义一个字符串
String s1 = "aa,bb,cc";
// 直接分割 split(regex)
String[] str1Array = s1.split(",");
for (int x = 0; x < str1Array.length; x++) {
System.out.println(str1Array[x]);
}
System.out.println("---------------------");
String s2 = "aa.bb.cc";
String[] str2Array = s2.split("\\.");//注意这里不能直接写点号,因为在正则表达式里面点号表示任意字符
//,应该用\\.
for (int x = 0; x < str2Array.length; x++) {
System.out.println(str2Array[x]);
}
System.out.println("---------------------");
String s3 = "aa bb cc";
String[] str3Array = s3.split(" +");//这里写的regex的意思是任意多个的空格(+前面的空格代表空格,而+表示
//空格 有 一次或者一次以上)
for (int x = 0; x < str3Array.length; x++) {
System.out.println(str3Array[x]);
}
System.out.println("---------------------");
//硬盘上的路径,我们应该用\\替代\
String s4 = "E:\\JavaSE\\day14\\avi";
String[] str4Array = s4.split("\\\\");//注意这里是4个杠!!
for (int x = 0; x < str4Array.length; x++) {
System.out.println(str4Array[x]);
}
System.out.println("---------------------");
}
}
7.分隔功能案例
我有如下一个字符串:"91 27 46 38 50"
请写代码实现最终输出结果是:"27 38 46 50 91"
import java.util.Arrays;
/*
* 分析:
* A:定义一个字符串
* B:把字符串进行分割,得到一个字符串数组
* C:把字符串数组变换成int数组
* D:对int数组排序
* E:把排序后的int数组在组装成一个字符串
* F:输出字符串
*/
public class RegexTest {
public static void main(String[] args) {
// 定义一个字符串
String s = "91 27 46 38 50";
// 把字符串进行分割,得到一个字符串数组
String[] strArray = s.split(" ");
// 把字符串数组变换成int数组
int[] arr = new int[strArray.length];
for (int x = 0; x < arr.length; x++) {
arr[x] = Integer.parseInt(strArray[x]);
}
// 对int数组排序
Arrays.sort(arr);
// 把排序后的int数组在组装成一个字符串(不能直接调用toString方法,因为数字之间由空格隔开而不是逗号隔开)
StringBuilder sb = new StringBuilder();
for (int x = 0; x < arr.length; x++) {
sb.append(arr[x]).append(" ");
}
//转化为字符串
String result = sb.toString().trim();//这里的toString方法是StringBuilder 转换成String类型的过程,
//trim()方法旨在去掉字符串最后一个空格
//输出字符串
System.out.println("result:"+result);
}
}
8.正则表达式替换功能
String类的public String replaceAll(String regex,String replacement)
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
public class RegexDemo {
public static void main(String[] args) {
// 定义一个字符串
String s = "helloqq12345worldkh622112345678java";
// 我要去除所有的数字,用*给替换掉
// String regex = "\\d+";
// String regex = "\\d";
//String ss = "*";
// 直接把数字干掉
String regex = "\\d+";
String ss = "";
String result = s.replaceAll(regex, ss);
System.out.println(result);
}
}
9.Pattern和Matcher的概述
10.正则表达式的获取功能
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
* 获取功能:
* 获取下面这个字符串中由三个字符组成的单词
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
*/
public class RegexDemo2 {
public static void main(String[] args) {
// 定义字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 规则
String regex = "\\b\\w{3}\\b";
// 把规则编译成模式对象
Pattern p = Pattern.compile(regex);
// 通过模式对象得到匹配器对象
Matcher m = p.matcher(s);
// 调用匹配器对象的功能
// 通过find方法就是查找有没有满足条件的子串
// public boolean find()
// boolean flag = m.find();
// System.out.println(flag);
// // 如何得到值呢?
// // public String group()
// String ss = m.group();
// System.out.println(ss);
while (m.find()) {
System.out.println(m.group());
}
// 注意:一定要先find(),然后才能group()
// IllegalStateException: No match found
// String ss = m.group();
// System.out.println(ss);
}
}
简化如下
public class RegexDemo2 {
public static void main(String[] args) {
// 定义一个字符串
String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";
// 定义规则
String regex = "\\b\\w{3}\\b";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(s);
// boolean b = m.find();
while (m.find()) {
System.out.println(m.group());
}
}
}
11.Math类
Math:用于数学运算的类。
成员变量:
public static final double PI
public static final double E
成员方法:
public static int abs(int a):绝对值
public static double ceil(double a):向上取整
public static double floor(double a):向下取整
public static int max(int a,int b):最大值 (min自学)
public static double pow(double a,double b):a的b次幂
public static double random():随机数 [0.0,1.0)
public static int round(float a) 四舍五入(参数为double的自学)
public static double sqrt(double a):正平方根
举例:
// public static double ceil(double a):向上取整(与四舍五入无关)
System.out.println("ceil:" + Math.ceil(12.34));//ceil:13.0
System.out.println("ceil:" + Math.ceil(12.56));//ceil:13.0
System.out.println("--------------");
// public static double floor(double a):向下取整(与四舍五入无关)
System.out.println("floor:" + Math.floor(12.34));//floor:12.0
System.out.println("floor:" + Math.floor(12.56));//floor:12.0
System.out.println("--------------");
最大值应用举例
// public static int max(int a,int b):最大值
System.out.println("max:" + Math.max(12, 23));
// 需求:我要获取三个数据中的最大值
// 方法的嵌套调用
System.out.println("max:" + Math.max(Math.max(12, 23), 18));
// 需求:我要获取四个数据中的最大值
System.out.println("max:"
+ Math.max(Math.max(12, 78), Math.max(34, 56)));
System.out.println("--------------");
随机数举例
// 获取一个1-100之间的随机数
System.out.println("random:" + ((int) (Math.random() * 100) + 1));//注意这里的优先级!!少了外层的括号
// random将与前面的字符串拼接形成类似于981的数
System.out.println("--------------");
四舍五入举例
System.out.println("round:" + Math.round(12.34f));//round:12
System.out.println("round:" + Math.round(12.56f));//round:13
round原理如下图:
12.一道面试题
需求:请设计一个方法,可以实现获取任意范围内的随机数。
分析:
A:键盘录入两个数据。
int start;
int end;
B:想办法获取在start到end之间的随机数
我写一个功能实现这个效果,得到一个随机数。(int)
C:输出这个随机数
public class MathDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入开始数:");
int start = sc.nextInt();
System.out.println("请输入结束数:");
int end = sc.nextInt();
for (int x = 0; x < 100; x++) { //这里的for循环是为了多测试几组数据,非必要。
// 调用功能
int num = getRandom(start, end);
// 输出结果
System.out.println(num);
}
}
/*
* 写一个功能 两个明确: 返回值类型:int 参数列表:int start,int end
*/
public static int getRandom(int start, int end) {
// 回想我们讲过的1-100之间的随机数
// int number = (int) (Math.random() * 100) + 1;
// int number = (int) (Math.random() * end) + start;
// 发现有问题了,怎么办呢?
int number = (int) (Math.random() * (end - start + 1)) + start;
return number;
}
}
13.Random类
构造方法:
public Random():没有给种子,用的是默认种子,是当前时间的毫秒值
public Random(long seed):给出指定的种子
给定种子后,每次得到的随机数是相同的。
成员方法:
public int nextInt():返回的是int范围内的随机数
public int nextInt(int n):返回的是[0,n)范围的内随机数
举例
public class RandomDemo {
public static void main(String[] args) {
// 创建对象
// Random r = new Random();
Random r = new Random(1111);
for (int x = 0; x < 10; x++) {
// int num = r.nextInt();
int num = r.nextInt(100) + 1;
System.out.println(num);
}
}
}
14.System类
System.gc()可用于垃圾回收。当使用System.gc()回收某个对象所占用的内存之前,通过要求程序调用适当的方法来清理资源。在没有明确指定资源清理的情况下,Java提高了默认机制来清理该对象的资源,就是调用Object类的finalize()方法。finalize()方法的作用是释放一个对象占用的内存空间时,会被JVM调用。而子类重写该方法,就可以清理对象占用的资源,该方法有没有链式调用,所以必须手动实现。
从程序的运行结果可以发现,执行System.gc()前,系统会自动调用finalize()方法清除对象占有的资源,通过super.finalize()方式可以实现从下到上的finalize()方法的调用,即先释放自己的资源,再去释放父类的资源。
但是,不要在程序中频繁的调用垃圾回收,因为每一次执行垃圾回收,jvm都会强制启动垃圾回收器运行,这会耗费更多的系统资源,会与正常的Java程序运行争抢资源,只有在执行大量的对象的释放,才调用垃圾回收最好
15.System.exit(0)
public static void exit(int status):终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非 0 的状态码表示异常终止。(0表示正常)
所以,建议用exit(0);
16.System类 currentTimeMillis()
System.out.println(System.currentTimeMillis());
单独得到这样的实际目前对我们来说意义不大
那么,它到底有什么作用呢?
要求:请大家给我统计这段程序的运行时间
long start = System.currentTimeMillis();
for (int x = 0; x < 100000; x++) {
System.out.println("hello" + x);
}
long end = System.currentTimeMillis();
System.out.println("共耗时:" + (end - start) + "毫秒");
}
17.system类 arraycopy(注意,arraycopy并不符合命名规则(since JDK1.0),但是不改了)
public static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
举例
int[] arr = { 11, 22, 33, 44, 55 };
int[] arr2 = { 6, 7, 8, 9, 10 };
System.arraycopy(arr, 1, arr2, 2, 2);
System.out.println(Arrays.toString(arr));//[11, 22, 33, 44, 55]
System.out.println(Arrays.toString(arr2));//[6, 7, 22, 33, 10]
注意Arrays.toString(……)方法
18.BigInteger类---可以让超过Integer范围内的数据进行运算(即超过2147483647)
public BigInteger add(BigInteger val):加
public BigInteger subtract(BigInteger val):减
public BigInteger multiply(BigInteger val):乘
public BigInteger divide(BigInteger val):除
public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
BigInteger bi1 = new BigInteger("100");
BigInteger bi2 = new BigInteger("50");
BigInteger[] bis = bi1.divideAndRemainder(bi2);
System.out.println("商:" + bis[0]);//2
System.out.println("余数:" + bis[1]);//0
19. BigDecimal
由于在运算的时候,float类型和double很容易丢失精度,演示案例。所以,为了能精确的表示、计算浮点数,Java提供了BigDecimal
public BigInteger add(BigInteger val):加
* public BigInteger subtract(BigInteger val):减
* public BigInteger multiply(BigInteger val):乘
* public BigInteger divide(BigInteger val):除
* public BigInteger[] divideAndRemainder(BigInteger val):返回商和余数的数组
divisor
- 此 BigDecimal
要除以的值。scale
- 要返回的 BigDecimal
商的标度。(也就是保留多少位小数)roundingMode
- 要应用的舍入模式。(一般用ROUND_HALF_UP----即四舍五入)
20.Date类
Date:表示特定的瞬间,精确到毫秒。
Date的构造方法
Date():根据当前的默认毫秒值创建日期对象
Date(long date):根据给定的毫秒值创建日期对象
获取当前时间
long time = System.currentTimeMillis();
Date d2 = new Date(time);
System.out.println("d2:" + d2);
21.Date类的一些方法
public long getTime():获取时间,以毫秒为单位
public void setTime(long time):设置时间
掌握两个方法(转换)
从Date得到一个毫秒值
getTime()
把一个毫秒值转换为Date
构造方法
setTime(long time)
/ 创建对象
Date d = new Date();
// 获取时间
long time = d.getTime();
System.out.println(time);
// System.out.println(System.currentTimeMillis());
System.out.println("d:" + d);
// 设置时间
d.setTime(1000);//1000代表1000毫秒
System.out.println("d:" + d);
22.DateFormat
String和Date的相互转换理解
Date -- String(格式化)
public final String format(Date date)(这个是具体子类SimpleDateFormat的父类DateForamt中的一个方法)
String -- Date(解析)
public Date parse(String source)
DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat。
// Date -- String
// 创建日期对象
Date d = new Date();
// 创建格式化对象
// SimpleDateFormat sdf = new SimpleDateFormat();
// 给定模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
// public final String format(Date date)
String s = sdf.format(d);//子类调用父类的方法
System.out.println(s);
基础输出
Date -- String(格式化)
public final String format(Date date)
String -- Date(解析)
public Date parse(String source)
DateForamt:可以进行日期和字符串的格式化和解析,但是由于是抽象类,所以使用具体子类SimpleDateFormat。
SimpleDateFormat的构造方法:
SimpleDateFormat():默认模式
SimpleDateFormat(String pattern):给定的模式
这个模式字符串该如何写呢?
通过查看API,我们就找到了对应的模式
年 y
月 M
日 d
时 H
分 m
秒 s
具体方法
-1-.日期转字符串
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");//给定模式
String s = sdf.format(d);//format意为格式化
System.out.println(s);
输出如下
-2-字符串转日期
String str = "2008-08-08 12:12:12";
//在把一个字符串解析为日期的时候,请注意格式必须和给定的字符串格式匹配
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dd = sdf2.parse(str);//parse意为解析
23.Date类一个综合案例----你来到这个世界多少天
分析:
A:键盘录入你的出生的年月日
B:把该字符串转换为一个日期
C:通过该日期得到一个毫秒值
D:获取当前时间的毫秒值
E:用D-C得到一个毫秒值
F:把E的毫秒值转换为年
/1000/60/60/24
本人写法
输出测试结果
24.Calendar类(抽象类)以及getInstance()和get()方法
Calendar:它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
public int get(int field):返回给定日历字段的值。日历类中的每个日历字段都是静态的成员变量,并且是int类型。
下图解析 Calendar rightNow = Calendar.getInstance(); (运用了多态)(具体可查API)
// 其日历字段已由当前日期和时间初始化:
Calendar rightNow = Calendar.getInstance(); // 子类对象
// 获取年
int year = rightNow.get(Calendar.YEAR);
// 获取月
int month = rightNow.get(Calendar.MONTH);
// 获取日
int date = rightNow.get(Calendar.DATE);
System.out.println(year + "年" + (month + 1) + "月" + date + "日");
25.Calendar类另外两个方法
public void add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。(amount可以是负的)
public final void set(int year,int month,int date):设置当前日历的年月日
承接上一节的获取时间
三年前的今天
5年10天前
注意set 方法中的month小问题(month从0开始)
附:Calendar也有获得毫秒值的方法(具体看API)
26.一个小案例------获取任意一年的二月有多少天
import java.util.Calendar;
import java.util.Scanner;
/*
* 获取任意一年的二月有多少天(注意month从0开始)
*
* 分析:
* A:键盘录入任意的年份
* B:设置日历对象的年月日
* 年就是A输入的数据
* 月是2
* 日是1
* C:把时间往前推一天,就是2月的最后一天
* D:获取这一天输出即可
*/
public class CalendarTest {
public static void main(String[] args) {
// 键盘录入任意的年份
Scanner sc = new Scanner(System.in);
System.out.println("请输入年份:");
int year = sc.nextInt();
// 设置日历对象的年月日
Calendar c = Calendar.getInstance();
c.set(year, 2, 1); // 其实是这一年的3月1日
// 把时间往前推一天,就是2月的最后一天
c.add(Calendar.DATE, -1);
// 获取这一天输出即可
System.out.println(c.get(Calendar.DATE));
}
}
day14补充
Calendar
(1)日历类,封装了所有的日历字段值,通过统一的方法根据传入不同的日历字段可以获取值。
(2)如何得到一个日历对象呢?
Calendar rightNow = Calendar.getInstance();
本质返回的是子类对象。
day15
1.对象数组的内存图解
2.集合概述
集合的由来:
我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。
而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?
数组和StringBuffer。但是呢?StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。
而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
3.数组和集合的区别?
A:长度区别
数组的长度固定
集合长度可变
B:内容不同
数组存储的是同一种类型的元素
而集合可以存储不同类型的元素
C:元素的数据类型问题
数组可以存储基本数据类型,也可以存储引用数据类型
集合只能存储引用类型
3.集合的继承体系图解
4.Collection
Collection:是集合的顶层接口,它的子体系有重复的,有唯一的,有有序的,有无序的。
Collection的功能概述:
1:添加功能
boolean add(Object obj):添加一个元素
boolean addAll(Collection c):添加一个集合的元素
2:删除功能
void clear():移除所有元素
boolean remove(Object o):移除一个元素
boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
3:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
boolean isEmpty():判断集合是否为空
4:获取功能
Iterator<E> iterator()(重点)
5:长度功能
int size():元素的个数
面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
6:交集功能
boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
7:把集合转换为数组
Object[] toArray()
5.重点注意几个All方法
boolean addAll(Collection c):添加一个集合的元素
boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(只有包含所有的元素,才叫包含)
boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
addAll示例
removeAll示例(只要有一个元素被移除了,就返回true)
注意
boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
//假设有两个集合A,B。
//A对B做交集,最终的结果保存在A中,B不变。
//返回值表示的是A是否发生过改变。
返回值表示的是A(原集合)是否发生过改变。
6.集合的遍历
Object[] toArray():把集合转成数组,可以实现集合的遍历
// 创建集合对象
Collection c = new ArrayList();
// 添加元素
c.add("hello"); // 这个语句隐含有Object obj = "hello"; 向上转型
c.add("world");
c.add("java");
// 遍历
// Object[] toArray():把集合转成数组,可以实现集合的遍历
Object[] objs = c.toArray();
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x]);
// 我知道元素是字符串,我在获取到元素的的同时,还想知道元素的长度。
// System.out.println(objs[x] + "---" + objs[x].length());
// 上面的实现不了,原因是Object中没有length()方法
// 我们要想使用字符串的方法,就必须把元素还原成字符串
// 向下转型
String s = (String) objs[x];
System.out.println(s + "---" + s.length());
7.集合的遍历案例(最原始的遍历方式,以后不常用,用迭代器取代)
练习:用集合存储5个学生对象,并把学生对象进行遍历。
*
* 分析:
* A:创建学生类
* B:创建集合对象
* C:创建学生对象
* D:把学生添加到集合
* E:把集合转成数组
* F:遍历数组
public class StudentDemo {
public static void main(String[] args) {
// 创建集合对象
Collection c = new ArrayList();
// 创建学生对象
Student s1 = new Student("林青霞", 27);
Student s2 = new Student("风清扬", 30);
Student s3 = new Student("令狐冲", 33);
Student s4 = new Student("武鑫", 25);
Student s5 = new Student("刘晓曲", 22);
// 把学生添加到集合
c.add(s1);
c.add(s2);
c.add(s3);
c.add(s4);
c.add(s5);
// 把集合转成数组
Object[] objs = c.toArray();
// 遍历数组
for (int x = 0; x < objs.length; x++) {
// System.out.println(objs[x]);
Student s = (Student) objs[x];
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
所需的同一个包下的Student类如下
8.Iterator迭代器
Iterator iterator():迭代器,集合的专用遍历方式
Object next():获取元素,并移动到下一个位置。
boolean hasNext():如果仍有元素可以迭代,则返回 true。
典型写法
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态。
while (it.hasNext()) {
// System.out.println(it.next());//这个其实也可以
String s = (String) it.next();//建议向下转型
System.out.println(s);
}
9.注意事项
10.迭代器使用图解和原理解析
迭代器的源码 Iterator Iterable Collection都是接口
public interface Iterator {
boolean hasNext();
Object next();
}
public interface Iterable {
Iterator iterator();//这个方法到这里还没有实现
}
public interface Collection extends Iterable {
Iterator iterator();//这个方法到这里还没有实现
}
public interface List extends Collection {
Iterator iterator();//这个方法到这里还没有实现
}
public class ArrayList implements List {
public Iterator iterator() {
return new Itr();//这个方法到这里开始实现
}
private class Itr implements Iterator {
public boolean hasNext() {}
public Object next(){} //直到这里上面的接口方法才算真正实现了
}
}
Collection c = new ArrayList();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator(); //new Itr();
while(it.hasNext()) {
String s = (String)it.next();
System.out.println(s);
}
11.List接口概述
有序的
collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
与
set 不同,列表通常允许重复的元素。
12.List集合的特有功能:
A:添加功能
void add(int index,Object element):在指定位置添加元素
B:获取功能
Object get(int index):获取指定位置的元素
C:列表迭代器
ListIterator listIterator():List集合特有的迭代器
D:删除功能
Object remove(int index):根据索引删除元素,返回被删除的元素
E:修改功能
Object set(int index,Object element):根据索引修改元素,返回被修饰的元素。
13.ListIterator特有功能
public class ListDemo4 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
ListIterator lit = list.listIterator();
while (lit.hasNext()) {
String s = (String) lit.next();
System.out.println(s);
}
System.out.println("----");
while (lit.hasPrevious()) {
String s = (String) lit.previous();
System.out.println(s);
}
}
}
14.一个需要注意的问题
问题
我有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
按常理做法结果如下
运行有异常
ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
产生的原因:
迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
如何解决呢?
A:迭代器迭代元素,迭代器修改元素
元素是跟在刚才迭代的元素后面的。
B:集合遍历元素,集合修改元素(普通for)
元素在最后添加的。
附:接口 ListIterator<E>有如下几个方法(迭代器修改元素)
方法1如图
注意javaee被添加的位置
元素是跟在刚才迭代的元素后面的
方法2如图
注意javaee被添加的位置
元素在最后添加的。
15.数据结构
数据结构:数据的组织形式
面试题:常见的数据结构的优缺点?
(数据结构+算法)
16.List的子类特点
List:(面试题List的子类特点)
ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
List有三个儿子,我们到底使用谁呢?
看需求(情况)。
要安全吗?
要:Vector(即使要安全,也不用这个,后面有替代的)
不要:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
day15补充
集合的继承体系结构?
由于需求不同,Java就提供了不同的集合类。这多个集合类的数据结构不同,但是它们都是要提供存储和遍历功能的,
我们把它们的共性不断的向上提取,最终就形成了集合的继承体系结构图。
Collection
|--List
|--ArrayList
|--Vector
|--LinkedList
|--Set
|--HashSet
|--TreeSet