常用類:系統(tǒng)幫我們封裝好很多功能在類里面,可以直接使用的方法
常用類一般不允許你創(chuàng)建對象,都私有化了構(gòu)造器
Main方法參數(shù)
當(dāng)點擊運行時,JVM會自動調(diào)用main方法
public:被JVM調(diào)用的方法,它的權(quán)限要足夠的大
static:被JVM調(diào)用的方法,不需要創(chuàng)建對象,直接使用類名調(diào)用
void:被JVM調(diào)用的方法,不需要有任何的返回值
main:方法的名稱,只能這樣寫,不然JVM識別不了
String[] args: 以前是指鍵盤錄入.
public static void main(String[] args){
}
for循環(huán)和foreach的區(qū)別:
要不要是使用腳標(biāo),使用腳標(biāo)用for循環(huán);不需要使用腳標(biāo)的情況用foreach
Scanner輸入鍵盤信息
Scanner sc = new Scanner(System.in);
等待從鍵盤錄入一個數(shù)
int i = sc.nextInt();
double d = sc.nextDouble();
System.out.println(i);
System.out.println(d);
System.out.println("--------");
從鍵盤錄入一個字符串
String s = sc.nextLine();
System.out.println(s);
數(shù)組的拷貝
arraycopy
java.lang是不需要導(dǎo)入的
src - 源數(shù)組肚邢。
srcPos - 源數(shù)組中的起始位置映胁。
dest - 目標(biāo)數(shù)組。
destPos - 目標(biāo)數(shù)據(jù)中的起始位置。
length - 要復(fù)制的數(shù)組元素的數(shù)量领铐。
public static void main(String[] args) {
arraycopy
java.lang是不需要導(dǎo)入的
src - 源數(shù)組。
srcPos - 源數(shù)組中的起始位置逢唤。
dest - 目標(biāo)數(shù)組彻消。
destPos - 目標(biāo)數(shù)據(jù)中的起始位置。
length - 要復(fù)制的數(shù)組元素的數(shù)量嚣崭。
int[] src = {1,2,3,4,5,6};
int[] desc = new int[10];//開辟了10塊空間
System.arraycopy(src, 2, desc,0, 4);
System.out.println(Arrays.toString(src));//[1, 2, 3, 4, 5, 6]
System.out.println(Arrays.toString(desc));//[3, 4, 5, 6, 0, 0, 0, 0, 0, 0]
}
要知道它的在哪個類當(dāng)中,arraycopy存在System這個類當(dāng)中
一定得要知道什么類當(dāng)中有什么方法
計算代碼耗時
System.currentTimeMills();
public static void main(String[] args) {
獲取當(dāng)前時間的毫秒值 1 秒 = 1000毫秒
從1970開始到現(xiàn)在的毫秒數(shù)
做測試一個執(zhí)行的時間
long time1 = System.currentTimeMillis();
// System.out.println(time);
for (int i = 0; i < 1000000; i++) {
System.out.println(i);
}
long time2 = System.currentTimeMillis();
long time3 = time2 - time1;
System.out.println("總耗時"+time3+"毫秒");
}
gc方法與對象銷毀
public class SystemMethod {
只有當(dāng)一個對象被回收時,才會自動調(diào)用的一個方法
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("我被回收了");
}
public static void main(String[] args) {
終止當(dāng)前正在運行的Java虛擬機
應(yīng)用于圖形化界面
System.exit(0);//0 正常退出 負(fù)數(shù)異常退出
立即運行垃圾回收器笨触。一個對象并不是立馬被回收的
new SystemMethod();
new SystemMethod();
System.gc(); 一般都不會主動去調(diào)用該方法
}
}
Math數(shù)學(xué)類
public static void main(String[] args) {
System.out.println(Math.PI);// π
求兩個數(shù)的最大值
int res = Math.max(20, 10);
System.out.println(res);
求兩個數(shù)的最小值
Math.min(5, 6);
返回一個[0,1) 的隨機數(shù)
System.out.println(Math.random());
0-100的隨機數(shù),強制轉(zhuǎn)換成int類型,向下取整
int res2 = (int) (Math.random() * 100);
System.out.println(res2);
開平方根
double res3 = Math.sqrt(4);
System.out.println(res3);
}
大精度小數(shù)
java.math
類 BigDecimal
public static void main(String[] args) {
System.out.println("0.09+0.01 = " + (0.09 + 0.01));//0.09999999999999999
System.out.println("-----------");
//表示金錢都是用BigDecimal類型
BigDecimal num1 = new BigDecimal(0.09);
BigDecimal num2 = new BigDecimal(0.01);
System.err.println(num1.add(num2));//還未正確
//0.09999999999999999687749774324174723005853593349456787109375
下面才是正確的
BigDecimal num1 = new BigDecimal("0.09");
BigDecimal num2 = new BigDecimal("0.01");
}
float,double 表示小數(shù) 不能表示精確的小數(shù)
java.math
類 BigInteger
大整形
// BigInteger
System.out.println(Long.MAX_VALUE);
BigInteger b= new BigInteger("100000"+Long.MAX_VALUE);
System.out.println(b);
總結(jié)復(fù)習(xí)
字符串本質(zhì)及分類
什么是字符串?
把多個字符串連在一起
字符串分類
1.可變字符串(StringBuffer,StringBuilder): 定義好之后,還可以進行修改, 修改是,不會創(chuàng)建新的內(nèi)存地址 (內(nèi)存地址不可變)
2.不可變字符串(String): 定義好了,就不能再去改變, 在內(nèi)存當(dāng)中不能再去修改了,修改就會創(chuàng)建新的內(nèi)存地址
字符串的本質(zhì)
其實它是一個 chat[ ] 類型的數(shù)組
private final char value[ ];
String, StringBuffer, StringBuilder 都實現(xiàn)了:CharSequence接口 ,遵守了規(guī)范可以使用里面的方法
字符串的兩種比較
不可變字符串(String)
String str = "ABC"; 在內(nèi)存當(dāng)中不能再去修改了,修改就會創(chuàng)建新的地址
str = "cd";
字符串是放到方法區(qū)常量池當(dāng)中,這里還沒講常量池,先放到堆當(dāng)中
String創(chuàng)建
1.直接賦值 String str = "ABC";
2.通過構(gòu)造器來創(chuàng)建 String str = new String("ABC");
字符串對象為空
1.表示引用為空 String str = null; 還沒初始化,沒有分配內(nèi)存空間
2.表示空字符串 String str = " "; 已經(jīng)創(chuàng)建了對象,已經(jīng)分配了內(nèi)存,內(nèi)容為空
字符串的比較
比較兩個字符串相不相等
- == 比較兩個內(nèi)存地址是否相等
String str = "ABC";
String str2 = new String("ABC");
if (str == str2) { 比的是對象的地址
System.out.println("相等");
}else {
System.out.println("不相等");
} 不相等
- 使用在object中的一個方法 equals 和 == 相同
因為 String 類覆蓋了 equals 方法
1.先去比較對象地址是否相等
2.如果不相等,再去判斷是否為String, 是的話再去逐個判斷每一個字符相不相等
if (str.equals(str2)) { 相等
System.out.println("相等");
}else {
System.out.println("不相等");
}
String類覆蓋了 equals 方法
建議子類,自己去覆蓋此方法,自己在內(nèi)部當(dāng)中去根據(jù)自己的需求去判斷兩個值是否相等
字符串創(chuàng)建以及常量池內(nèi)存分析
常量--->方法區(qū)當(dāng)中有一個常量池
String str = "ABC";
String str3 = "ABC";
System.out.println(str==str3); true
String str2 = new String("ABC");
1.String str = "ABCD"; 局部變量
使用String str = "ABCD";創(chuàng)建字符串
要么創(chuàng)建一個對象,要么不創(chuàng)建
會先到常量池當(dāng)中看一下有沒有該字符串常量
如果說已經(jīng)有了,就直接使用,不會創(chuàng)建新的字符串常量池地址
如果常量池當(dāng)中沒有的話,就會在常量池當(dāng)中創(chuàng)建一個對象
2.String str2 = new String("ABCD"); 創(chuàng)建對象
至少得要創(chuàng)建一個對象, 因為使用了new 在堆當(dāng)中,至少得要創(chuàng)建一個對象
看一下,常量池當(dāng)中,有沒有傳入的字符串常量
如果沒有的話,會創(chuàng)建一個字符串常量,放到常量池當(dāng)中
System.out.println(str2); ABCD 會在堆中找到它的創(chuàng)建地址,這個地址會有一個常量引用,所以就把ABCD打印出來了
字符串工具類設(shè)計
給一個字符串,判斷是否為空,如果為空返回false
不為空就返回一個true
一個方法當(dāng)中有return 所在的方法 會立即停止執(zhí)行
定義一個方法
static boolean hasLength(String str) {
if (str != null && !"".equals(str.replace(" ", ""))) {// 不為空
return true;
} // 為空
return false;//一個方法當(dāng)中有return 所在的方法 會立即停止執(zhí)行
}
可以直接簡寫成
static boolean hasLength(String str) {
return str != null && !"".equals(str.replace(" ", ""));
}
在main方法中執(zhí)行
boolean res = hasLength(s);
System.out.println(res);
把方法抽成一個工具類
public class StringUtils {
private StringUtils() {};
工具類有兩種情況:1.單例模式,2.全部方法搞成靜態(tài)
static boolean hasLength(String str) {
return str != null && !"".equals(str.replace(" ", ""));
}
}
System.out.println(StringUtils.hasLength(s));
Random類
構(gòu)造方法摘要 Random() 創(chuàng)建一個新的隨機數(shù)生成器。
Random r = new Random();
int res = r.nextInt();//隨機生成一個int類型的數(shù)
System.out.println(res);
System.out.println(r.nextDouble());
System.out.println(r.nextBoolean());
Random(long seed) 使用單個 long 種子創(chuàng)建一個新的隨機數(shù)生成器雹舀。
偽隨機數(shù) , 相同的種子,生成的隨機數(shù)是一樣的
Random r2 = new Random(11);//傳入?yún)?shù),生成的隨機數(shù)是一樣的
System.out.println(r2.nextInt());
生成34-179之間的隨機數(shù)
34+ [0,145)
nextInt(145) 隨機生成0到145之間的隨機數(shù)
new Random().nextInt(145);//隨機生成0到145之間的隨機數(shù)
System.out.println(34+new Random().nextInt(145));//生成34-179之間的隨機數(shù)
生成UUID
UUID:通用唯一識別符
在一臺機器上生成的數(shù)字,每一臺機器都不一樣
UUID如何生成:
通過當(dāng)前時間,跟當(dāng)前電腦網(wǎng)卡生成一段字符
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);//每次生成都不一樣
日期類Date
類 Date 表示特定的瞬間芦劣,精確到毫秒。
使用String,int類型表示日期不好
要使用java當(dāng)中專門提供的日期類型
class Employee{
int age;//年齡
String hireDate;//工齡
}
public class DateDemo {
public static void main(String[] args) {
創(chuàng)建一個日期對象
Date date = new Date();//Fri Nov 23 23:16:10 CST 2018
System.out.println(date);
獲取當(dāng)前時間的毫秒值
//public static native long currentTimeMillis();
native 是原生的方法,使用C++寫的,所以看不到如何實現(xiàn)
long curTime = System.currentTimeMillis();
把一個毫秒值轉(zhuǎn)成日期
Date date2 = new Date(curTime);
System.out.println(date2);
轉(zhuǎn)成中國人喜歡風(fēng)格,方法著畫橫線表示過期了
String str = date2.toLocaleString();
System.out.println(str);//2018-11-23 23:12:37
把一個日期類型轉(zhuǎn)成時間戳(毫秒值)
System.out.println(date2.getTime());
}
}
生成隨機驗證碼
public static void main(String[] args) {
生成驗證碼
首先是想到:5位隨機數(shù) UUID生成的是16進制
String res = UUID.randomUUID().toString();
System.out.println(res);
System.out.println(res.substring(0, 5));
System.out.println("----------");
不夠我們的需求,采取下列措施
String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
str += str.toLowerCase();
str += "0123456789";
System.out.println(str);// str字符拼接結(jié)果
從所有的字符當(dāng)中隨機生成5個出來
隨機取5個出來
每取出一個結(jié)果,在原來的基礎(chǔ)進行拼接
StringBuilder sb = new StringBuilder(5);// 指定StringBuilder空間大小
for (int i = 0; i < 5; i++) {
腳標(biāo)需要隨機的值 (0 62:字符串的長度)
int index = new Random().nextInt(str.length());// 隨機生成腳標(biāo), 0 - 62之間的隨機數(shù),不包括62
char ch = str.charAt(index);// char類型接收str的charAt取出隨機腳標(biāo)的字符
sb.append(ch);// 與空的sb StringBuilder 拼接
}
System.out.println(sb);
}
日期格式化
字符串工具類
public class StringUtils {
public static boolean hb(String str) {
return (str != null && !str.equals(str.replace(" ", "")));
}
為空就為true
public static boolean isBlank(String str) {
return !StringUtils.hb(str);
}
}
public static void main(String[] args) throws ParseException {//聲明異常
日期格式化
Date date = new Date();
System.out.println(date.toLocaleString());
//使用toLocaleString() 過時方法生成 2018-11-24 18:05:48
DateFromat是一個日期/時間格式化子類的抽象類
getInstance();獲取為日期/時間SHORT風(fēng)格的默認(rèn)日期/時間格式器
DateFormat df = DateFormat.getInstance();
對指定的日期進行格式化
String time = df.format(date);
System.out.println(time);//getInstance()SHORT風(fēng)格 18-11-24 下午1:22
System.out.println("-----------");
dateStyle日期風(fēng)格:長日期LONG,短日期SHORT
DateFormat df2 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT);
日期風(fēng)格長,時間風(fēng)格短
String time2 = df2.format(date);
System.out.println(time2);//getDateTimeInstance傳入日期風(fēng)格,時間風(fēng)格 2018年11月24日 下午1:28
System.out.println("------");
DateFormat df3 = DateFormat.getTimeInstance();
String time3 = df3.format(date);
System.out.println(time3);//getTimeInstance() 獲得時間18:05:48
把一個字符串轉(zhuǎn)成日期
DateFormat df4 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT);
String newStr = "2018年11月24日 下午5:59";
Date date2 = df4.parse(newStr);
System.out.println(date2);//Sat Nov 24 17:59:00 CST 2018
}
自定義日期模式
自定義日期模式:SimpleDateFormat
Date date = new Date();//創(chuàng)建一個日期
SimpleDateFormat sd = new SimpleDateFormat();//創(chuàng)建一個自定義日期
定義自己想要什么樣的模式
String pattern = "yyyy-MM-dd HH:mm:ss";//定義日期模式格式
sd.applyPattern(pattern);//接收格式值,申請模式
以指定的模式格式化哪個日期
String res= sd.format(date);//生成日期
System.out.println(res);
日期工具類設(shè)計
Demo類運用日期工具類方法
import java.util.Date;
public class Demo {
public static void main(String[] args) throws ParseException{
String res = DateUtil.dateToString(new Date(), "yyyy-MM-dd hh:mm:dd");
System.out.println(res);
String res2 = DateUtil.dateToString(new Date(), null);
System.out.println(res2);
String res3 = DateUtil.dateToString(new Date());
System.out.println(res3);
字符串轉(zhuǎn)時間
Date date = DateUtils.StringToDate("2018-12-16 19/16/12","yyyy-MM-dd hh/mm/ss");
System.out.println(date);//Sun Dec 16 19:16:12 CST 2018
}
}
日期工具類
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtil {
private static final String DEFAULT_PATTERN = "yyyy-MM-dd hh:mm:dd:ss";
使用常量,使得程序的可擴展性增加
private DateUtil() {
};
1.把一個日期類型轉(zhuǎn)成字符串 返回已經(jīng)轉(zhuǎn)換好的字符串
public static String dateToString(Date date, String pattern) {
牢記一個工具類,想要別人使用,記得加public不然在其他包中不能使用你的方法
判斷傳入的模式是否為空
為空的話,設(shè)置一個默認(rèn)的模式
if (StringUtils.isBlank(pattern)) {// true時
為空的話,設(shè)置一個默認(rèn)的模式
pattern =DEFAULT_PATTERN;
}
SimpleDateFormat sd = new SimpleDateFormat();
sd.applyPattern(pattern);
String res = sd.format(date);
return res;
}
public static String dateToString(Date date){
return DateUtil.dateToString(date, "");
}
2.給一個字符串可以轉(zhuǎn)成日期
public static Date StringToDate(String str,String pattern) throws ParseException{
if(StringUtils.isBlank(pattern)) {
pattern =DEFAULT_PATTERN;
}
SimpleDateFormat sd = new SimpleDateFormat();
sd.applyPattern(pattern);
Date res = sd.parse(str);
return res;
}
public static void main(String[] args) {
}
}