java学习笔记Day7:实用类

1.实用类

1.1包装类:把基本类型数据转换为对象

(1)每个基本类型在java.lang包中都有一个相应的包装类,在JAVA当中,JDK为基本数据类型设计了相应的包装类,把基本数据类型变为了一个引用数据类型,那么他就是包装类型

(2) 学习包装类型的过程当中,要观察其规律
① 命名规律:首字母由基本数据类型的小写变为大写,除了Integer和Character之外
② 对于数值,包装类型的构造和方法当中,如果用了不属于数值的书写方式,会报NumberFormatException异常
③ 包装类型的字符串参数构造,不可以把数值类型,例如L加入字符串
Long l = new Long(“100l”);
④ 字符(Charcter)的包装类型,只有其本身类型参数的构造,没有字符串类型参数的构造
⑤ 布尔类型的包装类,只有一种情况下才会返回true,就是不区分大小写的true字符串;否则,输入任意其他类型,或null类型,那么结果都为false;
⑥ 包装类型的方法:

  1. xxxValue:包装类变为基本数据类型,这是一个普通的方法,即该方法必须通过包装类型的对象来进行调用,每一种包装类型,都有自己各自对应的方法
    在这里插入图片描述
  2. 转字符串的三种方式
  3. 字符串变为基本数据类型,调用包装类的静态方法:例如Xxx.parseInt(Str)、Xxx.parseLong(Str)……
  4. 包装类的静态方法Xxx.valueOf(xxx):把基本数据类型或者字符串变为包装类型
  5. 自动装箱和自动拆箱
  6. 在某些框架中,会去针对自己的框架设计相应的包装类型,比如hadoop当中Text\IntWriteable……
  7. 在web工程当中的实体类,其中作为参数的数值类型,通常都是定义为包装类,因为包装类型,有null值
1.1.1包装类有何作用

提供了一系列实用的方法

集合不允许存放基本数据类型数据,存放数字时,要用包装类型

1.1.2包装类的构造方法
1.2.1.1所有包装类都可将与之对应的基本数据类型作为参数,来构造它们的实例

如:Integer i=new Integer(1);

除Character类外,其他包装类可将一个字符串作为参数构造它们的实例

如: Integer i=new Integer(“123”);

注意:
(1)Boolean类构造方法参数为String类型时,若该字符串内容为true(不考虑大小写),则该Boolean对象表示true,否则表示false
(2)当Number包装类构造方法参数为String 类型时,字符串不能为null,且该字符串必须可解析为相应的基本数据类型的数据,否则编译通过,运行时NumberFormatException异常

1.2.1.2实例
//int类型代表了数值类型
Integer i1 = new Integer(100);
Integer i2 = new Integer("100");
System.out.println(i1);
System.out.println(i2);
//报异常
//Integer i3 = new Integer("100abc");
//long:不允许使用L/l
//Long l1 = new Long("123L");
//字符类型
Character c1 = new Character('杨');
System.out.println(c1);

//布尔类型
Boolean bl1 = new Boolean(true);
//((s != null) && s.equalsIgnoreCase("true"))
Boolean bl2 = new Boolean("False1111");
System.out.println(bl2);
1.1.3包装类的常用方法
1.1.3.1 XXXValue():包装类转换成基本类型
//把包装类型变为基本数据类型
Integer i1 = new Integer("1000");
int i2 = i1.intValue();
//其他类型参照
1.1.3.2 toString()

以字符串形式返回包装对象表示的基本类型数据(基本类型->字符串)

//基本数据类型转为字符串类型
int i = 1000;
String si = i+"";

//包装类对象的toString方法
Integer i2 = new Integer(i);
String si2 = i1.toString();

//包装类型的toString静态方法
String si3 = Integer.toString(i);
1.1.3.3 parseXXX():

把字符串转换为相应的基本数据类型数据(Character除外)(字符串->基本类型)

//把字符串变为基本数据类型
String str =  "1000";
//观察规律
int i1 = Integer.parseInt(str);
System.out.println(i1 * 10);
1.1.3.4 valueOf():

所有包装类都有如下方法(基本类型->包装类)

除Character类外,其他包装类都有如下方法(字符串->包装类)

//把字符串变为基本数据类型
String str =  "1000";
//把字符串变为包装类型
Integer i1 = Integer.valueOf(str);
//把基本数据类型变为包装类型
Integer i2 = Integer.valueOf(1000);
1.1.4 装箱和拆箱
1.1.4.1基本类型和包装类的自动转换

装箱:基本类型转换为包装类的对象
拆箱:包装类对象转换为基本类型的值

//自动装箱和自动拆箱
int i0 = 1000;
//自动装箱
Integer i1 = i0;
//自动拆箱
int i2 = i1;
//可以灵活的使用之前的方法
int i3 = Integer.valueOf("1000");
1.1.4.2 包装类的特点

JDK1.5后,允许基本数据类型和包装类型进行混合数学运算
包装类并不是用来取代基本数据类型的
在基本数据类型需要用对象表示时使用

1.2字符串:源码可参考openJDK

1.2.1String类位于java.lang包中,具有丰富的方法

计算字符串的长度、比较字符串、连接字符串、提取字符串。

(1) 字符串直接已双引号赋值,那么该字符串即相当于一个static常量(内存唯一),常量之间是相等的;那么new出来的String对象是存在于堆内存当中的,所以他不可以直接和常量比较。

//两种字符串创建方式的区别
String str1 = "十三真帅";
String str2 = new String("十三真帅");
String str3 = "十三真帅";
String str4 = str1.intern();
System.out.println(str1 == str2); //false
System.out.println(str1 == str3); //true
System.out.println(str1 == str4); //true
System.out.println(str2 == str4);//false

(2) intern():是将当前字符串对象,到常量池当中寻找是否有相同的常量,如果有,则返回该常量,如果没有,则新建一个常量

1.2.2String类的具体方法

① 获取字符串长度

② 必须使用equals判断字符串是否相等:

  1. 长度相等

  2. 字符串的本质其实是一个char类型的数组

  3. 依次比较两个字符串的char元素是否相等,只要有一个不等,则返回false

  4. 如果存在字符串常量,建议把常量作为方法调用者

//		String str1 = "十三真帅";
//		String str2 = "十三真帅";
//		String str3 = "十三真的非常帅";
//		System.out.println(str1.length());//长度
//		System.out.println(str1.equals(str2));//比较两个字符串是否相等
//		System.out.println("十三真帅".equals(str2));//比较两个字符串是否相等

//使用equalsIgnoreCase()方法 
//使用toLowerCase()方法
//使用toUpperCase()方法

//      String str1 = "www.baidu.com";
//		String str2 = "WWW.BAIDU.COM";
//		System.out.println(str1.equals(str2));
//		System.out.println(str1.equalsIgnoreCase(str2));//不区分大小写的比较
//		
//		System.out.println(str1.toUpperCase());
//		System.out.println(str1.toLowerCase());

5)“==”和equals()有什么区别呢?

equals():检查组成字符串内容的字符是否完全一致

==:判断两个字符串在内存中的地址,即判断是否是同一个字符串对象

③ 操作字符串元素

1)字符串连接

方法1:使用“+”
方法2:使用String类的concat()方法

//		System.out.println("a".concat("b"));//不推荐用,会新建对象
//		System.out.println("a" + "b");
  1. 判断元素位置:indexOf
方法名说明
public int indexOf(int ch)搜索第一个出现的字符ch(或字符串value),如果没有找到,返回-1
public int indexOf(String value)
public int lastIndexOf(int ch)搜索最后一个出现的字符ch(或字符串value),如果没有找到,返回-1
public int lastIndexOf(String value)
public String substring(int index)提取从位置索引开始的字符串部分
public String substring(int beginindex, int endindex)提取beginindex和endindex之间的字符串部分
public String trim()返回一个前后不含任何空格的调用字符串的副本
//		String str1 = "www.baidu.com";
//		System.out.println(str1.indexOf("."));
//		System.out.println(str1.lastIndexOf("."));
  1. 截取字符串:split

String类提供了split()方法,将一个字符串分割为子字符串,结果作为字符串数组返回

//		截取
//		System.out.println(str1.substring(str1.indexOf(".")+1));//从某一位开始,截取到最后
//		System.out.println(str1.substring(str1.indexOf(".")+1,str1.lastIndexOf(".")));//从某一位开始,到某一位之前

//		String str = "十三;今天;特别;帅";
//		String[] strs = str.split(";");
//		System.out.println(Arrays.toString(strs));
  1. 清除两端空格:trim
///	    String str1 = "   y  b  b   ";
//		System.out.println(str1.trim());
//		System.out.println(str1.replaceAll(" ", ""));
  1. 替换元素:replaceAll的匹配规则,可以是正则表达式

  2. 切割字符串:“点”“\”需要转义

//		String str1 = "www.baidu.com";
//		String[] strs = str1.split("\\.");
//		System.out.println(Arrays.toString(strs));
  1. 字符串的编码集转换
String str = "杨斌斌真帅";
//已UTF-8编码集,获取当前字符串编码,转码为iso-8859-1
String str1 = new String(str.getBytes("utf-8"),"iso-8859-1");
System.out.println(str1);
String str2 = new String(str1.getBytes("iso-8859-1"),"utf-8");
System.out.println(str2);
  1. 字符串的本质是数组,那么字符串的拼接效率,请参考ArrayList
String str = "";
Long start = new Date().getTime();
for(int i = 0 ; i < 100000 ; i ++){
//			str += "abc";
    str = str.concat("www.baidu.com");
}
Long end = new Date().getTime();
System.out.println(end - start);
1.2.3 StringBuffer
1.2.3.1StringBuffer/StringBuilder:是一种高效扩展string的对象

a. StringBuffer的append是有同步锁的synchronized,在多线程使用的情况下,他是安全的,但是效率相对低

b. StringBuilder是没有同步锁的,所以在多线程使用的情况下,StringBuilder是不安全的

在单线程的情况下,用哪个都一样,在实际的WEB开发当中,我们的应用,通常是被分配到某一个单独的线程里;除非他们处于常量状态,或者单例当中,必须要使用stringBuffer。

StringBuffer sbf = new StringBuffer();
StringBuilder sbd = new StringBuilder();
Long start = new Date().getTime();
for(int i = 0 ; i < 100000 ; i ++){
    sbf.append("www.baidu.com");
}
Long end = new Date().getTime();
System.out.println(end - start);
1.2.3.2 String类&StringBuffer类

String是不可变对象
经常改变内容的字符串最好不要使用String
StringBuffer是可变的字符串
字符串经常改变的情况可使用StringBuffer,更高效
JDK5.0后提供了StringBuilder,等价StringBuffer

1.3日期

1.3.1使用java.util.Date对象获取当前系统时间

提供操作日期和时间各组成部分的方法

//获取当前系统时间
Date date = new Date();
//默认的时间显示规则是UTC时间:Wed Apr 01 21:54:58 CST 2020
System.out.println(date);
1.3.2定义时间格式

java.text.SimpleDateFormat类,用于定制日期时间的格式

在这里插入图片描述

//格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
1.3.3字符串和时间的转换
//把时间变为字符串
String dataStr = sdf.format(date);
System.out.println(dataStr);
//把字符串变为时间
String dataStr1 = "1111-11-11 11:11:11:111";
Date date2 = sdf.parse(dataStr1);
System.out.println(date2);
1.3.4GetTime():1970-01-01 00:00:00:000到当前系统时间的毫秒数
Date date = new Date();
Long time = date.getTime();
//Returns the number of milliseconds since January 1, 1970, 00:00:00 GMTrepresented by this Date object.
System.out.println(time);//1585749799718格林威治时间(英国佬的格林威治时间线:历史的悲哀)
//
long l = (1585749799718l - 1085749799718l)/(1000*60*60*24);//计算两个时间之间相差多少天

1.3.5获取年月日

在这里插入图片描述

int year = date.getYear();//该方法已过时
System.out.println(year+1900);
1.3.6Calendar

抽象类,java.util.Calendar,用于设置和获取日期/时间数据的特定部分

Calendar类提供一些方法和静态字段来操作日历

方法或属性说明
int get(int field)返回给定日历字段的值
MONTH指示月
DAY_OF_MONTH指示一个月中的某天
DAY_OF_WEEK指示一个星期中的某天

使用Calendar的原因:

① 因为程序当中,程序的执行,是存在时间消耗的

② 如果用Date,那么在不断new的过程或在对象的传递当中,是会造成同一个对象的时间误差的

Calendar t = Calendar.getInstance();
//设置时间
t.set(Calendar.YEAR, 2019);
t.set(Calendar.MONTH, 2);
t.set(Calendar.DAY_OF_MONTH, 11);
//获取时间
System.out.println(t.get(Calendar.YEAR));
System.out.println(t.get(Calendar.MONTH)+1);//月份需要+1:0开始
System.out.println(t.get(Calendar.DAY_OF_MONTH));
System.out.println(t.get(Calendar.DAY_OF_WEEK));//西方习惯,周日是一周的第一天
System.out.println(t.get(Calendar.HOUR_OF_DAY));
System.out.println(t.get(Calendar.MINUTE));
System.out.println(t.get(Calendar.SECOND));

1.4异常

1.4.1JAVA的异常

异常:是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

(1)如果程序发生异常,会影响后续程序的执行

public static void main(String[] args) {
	System.out.println("异常前");
	int i = 1;
	int j = 0;
	//if(j != 0){
		System.out.println(i/j);
	//}
	System.out.println("异常后");
}

(2)使用异常处理机制,保证程序能够正常下去,不崩溃。

异常处理:Java编程语言使用异常处理机制为程序提供了错误处理的能力

public static void main(String[] args) {
	System.out.println("异常前");
	int i = 1;
	int j = 0;
	try{
		System.out.println(i/j);
		System.out.println("异常后1");
	}catch(ArithmeticException e){
		System.out.println("出异常啦");
	}
	System.out.println("异常后2");
}

//结果
//异常前
//出异常啦
//异常后2
1.4.2捕获异常

(1)捕获异常后,在异常类型匹配的情况下,可以保证在异常捕获之外的程序能够继续执行下去

(2)异常堆栈信息:最上面是异常发生的最开始的位置

printStackTrace()的堆栈跟踪功能显示出程序运行到当前类的执行流程

}catch(ArithmeticException e){
	e.printStackTrace();
}

(3)异常的本质只是一个标识类,效果等同用户返回值,是返回值的一种。

常见的异常类型

异常类型说明
Exception异常层次结构的父类
ArithmeticException算术错误情形,如以零作除数
ArrayIndexOutOfBoundsException数组下标越界
NullPointerException尝试访问 null 对象成员
ClassNotFoundException不能加载所需的类
IllegalArgumentException方法接收到非法参数
ClassCastException对象强制类型转换出错
NumberFormatException数字格式转换异常,如把abc转换成数字

(4)可以有多个catch,由上而下依次匹配,取第一个匹配上的,父类只能在子类异常的后面

System.out.println("异常前");
    int i = 1;
    int j = 40;
    int[] is = new int[10];
    try{
        System.out.println(i/j);
        is[1] = 1;
        Class.forName("aaa");
    }catch(ArithmeticException e){
        System.out.println("数值异常");
    }catch(IndexOutOfBoundsException e){
        System.out.println("游标异常");
    }catch(Exception e){
        System.out.println("其他异常");
    }finally{
        System.out.println("无论如何都会执行的内容");
    }
    System.out.println("异常后2");
}

(5)try当中有多个异常的时候,哪个先碰到,先处理哪个

(6)不要把一个代码块当中所有的代码都放到一个try-catch当中,这样做等同于什么也没做

(7)try-catch-finally

try-catch-finally结构中try语句块是必须的,catch、finally语句块均可选,但两者至少出现之一

try-catch块中存在return语句,是否还执行finally块,如果执行,说出执行顺序(try-catch-finally-return)
try-catch- finally块中, finally块唯一不执行的情况是什么? try 中System.exit(1)能执行

System.out.println("异常前");
		int i = 1;
		int j = 0;
		try{
			System.out.println(i/j);
			System.out.println("异常后1");
			//return;   finally执行完之后再来执行return
			System.exit(1);//强制关闭虚拟机  不执行finally的唯一情况
		}catch(ArithmeticException e){
			e.printStackTrace();
		}finally{
			System.out.println("无论如何都会执行的内容");
		}
System.out.println("异常后2");
1.4.3声明异常(throws)

(1)当前方法不想处理异常,那么可以抛出异常,交给调用者处理(捕获/抛出),谁调用谁处理

方式1:调用者处理异常
方式2:调用者继续声明异常
main()方法声明的异常由Java虚拟机处理

(2)异常最终抛无可抛,则必须要被处理;在中途被处理过的异常,其调用者就不必再处理了

public static void main(String[] args) {
		Test7 t4 = new Test7();
		t4.test2();
	}
	public void test2() {
		try {
			test1();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public void test1() throws ClassNotFoundException{
		try {
			test();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//throws声明某个方法可能抛出的各种异常,多个异常用逗号隔开
	public void test() throws ClassNotFoundException , SQLException{
		Class.forName("aaa");
	}
1.4.4手动抛出异常(throw)

(1)根据使用者的实际情况,来判断是否需要手动抛出

(2)运行时异常不是必须被处理的异常

(3)Checked异常是必须被处理的异常, 编译不通过

public static void main(String[] args) throws Exception {
	Test8 t4 = new Test8();
	t4.test(null);
}
public void test(String str){
	if(str == null){
		throw new MyStringIsNullException("这是我手动抛出的异常");
	}
}

(4)throw与throws

throwthrows
生成并抛出异常声明方法内抛出了异常
位于方法体内部,可作为单独语句使用必须跟在方法参数列表后面,不能单独使用
抛出一个异常对象,且只能是一个声明抛出异常类型,可以跟多个异常
1.4.5自定义异常

(1)异常体系结构

在这里插入图片描述

object:Exception和Error类的父类

Error:仅靠程序本身无法恢复的严重错误

Exception:由Java应用程序抛出和处理的非严重错误

RuntimeException:运行时异常不要求必须捕获或者声明抛出

SQLException,ClassNotFoundException:Checked异常必须捕获或者声明抛出

(2)创建一类类,符合异常命名规范

(2)继承Throwable类或者Exception或者RuntimeException

(3)实现所有父类构造调用

public class MyStringIsNullException extends RuntimeException{

public MyStringIsNullException() {
	super();
	// TODO Auto-generated constructor stub
}

public MyStringIsNullException(String message, Throwable cause, boolean enableSuppression,
		boolean writableStackTrace) {
	super(message, cause, enableSuppression, writableStackTrace);
	// TODO Auto-generated constructor stub
}

public MyStringIsNullException(String message, Throwable cause) {
	super(message, cause);
	// TODO Auto-generated constructor stub
}

public MyStringIsNullException(String message) {
	super(message);
	// TODO Auto-generated constructor stub
}

public MyStringIsNullException(Throwable cause) {
	super(cause);
	// TODO Auto-generated constructor stub
}
}

(4)异常链

A方法调用B方法时,B方法却抛出了异常。那A方法继续抛出原有的异常还是抛出一个新异常呢?
抛出原有的异常
A方法与B方法进行了关联,不便于代码的修改和扩展
抛出新的异常
丢失原有的异常信息

异常链创建了新的异常但却保留了原有异常的信息

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值