常用类
文章目录
内部类
概念:
- 在一个类的内部再定义一个完整的类
特点:
-
编译之后可以生成独立的字节码文件
-
内部类可直接访问外部类的私有成员,而不破坏封装
-
可为外部类提供必要的内部功能组件
成员内部类:
public class Outer{
class Inner{
}
}
//new一个成员内部类方法
Outer outer = new Outer();
Inner inner = outer.new Inner();
//一步到位
Inner inner = new Outer().new Inner();
//如果内部类和外部类的属性名相同,先访问内部类的属性
this.属性名
//访问外部类属性的方法
outer.this.属性名
//成员内部类不能包含静态成员,但可以包含静态常量(final)
静态内部类:
静态内部类不依赖外部类,有外部类的所有特性。
public class Outer{
private String name = "外部类"
static class Inner{
//可以有静态成员
private static String name = "静态内部类";
public void show(){
//调用外部类的属性:
//先创建外部类对象
Outer outer = new Outer();
//再调用外部类对象的属性
outer.name;
}
}
}
//创建静态内部类对象
Outer.Inner inner = new Outer.Inner();
局部内部类
点一在外部类的方法当中,作用范围和创建对象仅限于当前方法中。
public class Outer{
private String classname = "外部类"
public void show(){
//方法中不能加修饰符
//定义局部变量
String name = "方法";
//局部内部类
class Inner{
//成员内部类不能包含静态成员,但可以包含静态常量(final)
private String number = "110";
private String email = "1061328535@qq.com";
public void show2(){
//访问外部类的属性(如果局部内部类在静态方法当中,不能访问外部类非静态类属性)
Outer.this.classname//"外部类"
//访问内部类的属性
this.number
this.email
//访问局部变量,变量必须常量(final可省略,会自动添加)
name//“方法”
}
}
//需要在方法当中创建局部内部类对象,才能实现方法的内部类
Inner inner = new Inner();
inner.show2();
}
}
//调用局部内部类
Outer outer = new Outer();
outer.show();
匿名内部类:
没有类名的局部内部类(一切特征都与局部内部类相同)
//必须继承一个父类或者一个接口
//接口
public interface Usb {
//定义一个方法
void service();
}
//父类
public abstract class Demo01 {
public void show(){};
}
//匿名内部类优化局部内部类(相当于创建了一个局部内部类)
//实现接口
Usb fan = new Usb() {
@Override
public void service() {
System.out.println("我是风扇!!!!!!!");
}
};
//调用方法
fan.service;
//继承父类
Demo01 demo01 = new Demo01() {
@Override
public void show() {
System.out.println("我继承了父类");
}
};
demo01.show
- 优点:节省代码
- 缺点:可读性差
Object类
概念:
-
类 Object 是类层次结构的根类。
-
每个类都使用 Object 作为超类。
-
所有对象(包括数组)都实现这个类的方法。
-
简单来说就是,Object类是所有类的父类,包括我们所写的类,我们在使用类的时候就会利用Object类中的方法。
-
Object可统一所有数据,包装类的默认值时null
getClass()方法
- 应用:通常用于判断两个引用中实际存储对象类型是否一致
hashCode()方法
- 一般情况下相同对象返回相同的哈希值
toString()方法
-
返回该对象的字符串表示
-
可以根据程序需求覆盖(重写)该方法。
equals()方法
-
默认实现为(this == obj),比较两个对象的地址是否相同
-
可以根据程序需求覆盖(重写)该方法,比较两个对象的内容是否相等。
-
intanceof 判断对象是否是某种类型。
finalize()方法
(还不懂有什么用,好像很鸡肋)
-
当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
-
垃圾对象:没有有效引用指向此对象时,为垃圾对象。
-
垃圾回收:由GC销毁垃圾对象,释放数据存储空间。
-
自动回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
-
手动回收机制:使用System.gc();通知JVM执行垃圾回收。
包装类
概述:
-
基本数据类型所对应的引用数据类型
-
包装类的默认值是null
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
- 包装类将基本类型包装在一个对象中,给八大基本类型添加属性
类型转换与装箱、拆箱
- 8种包装类型提供不同类型间的转换方式:
Number父类中提供的6个共性方法
(Integer为例子:)
int num = 10;
//类型转换:装箱,基本类型转成引用类型的过程
Integer integer = new Integer(num);
//拆箱
integer.intValue();
integer1.doubleValue();
//JDK1.5之后,提供了自动装箱和自动拆箱
int age = 20;
//自动装箱
Integer integer2 = age;
//自动拆箱
int age2 = integer2;
parseXXX()静态方法
//基本类型和字符串之间的转换
//1.基本类型转成字符串
int n1 = 255;
//1.1使用+号
String s1 = n1+"";
//1.2使用Integer的toString方法
String s2 = Integer.toString(n1);
//重载方法(转换为几进制)
String s3 = Integer.toString(n1,16);
System.out.println(s2);
System.out.println(s3);
//2.把字符串转变为基本类型
String str = "150";
//使用Integer.parseXXX();
int i = Integer.parseInt(str);
System.out.println(i);
//boolean字符串形式转成基本类型,“true”-->true 非“true”-->false
String str2 = "true";
String str3 = "other"; //"false"
boolean b = Boolean.parseBoolean(str2);
System.out.println(b);
valueOf()方法
//类型转换:装箱,基本类型转成引用类型的过程
int num = 10;
Integer integer1 = Integer.valueOf(num);
整数缓冲区
- Java预先创建了256个常用的整数包装类型对象
Integer integer = new Integer(100);
Integer integer1 = new Integer(100);
//equals 和 == 的区别
System.out.println(integer == integer1); //false 存放地址不同
System.out.println(integer.equals(integer1)); //true
/**这里的equals比较的是包装类中的内容是否相等
* public boolean equals(Object obj) {
* if (obj instanceof Integer) {
* return value == ((Integer)obj).intValue();
* }
* return false;
* }
*/
//自动装箱实际上运用了 Integer integer2 = Integer.valueOf(100);
Integer integer2 = 127;
Integer integer3 = 127;
System.out.println(integer2 == integer3); //true
System.out.println(integer2.equals(integer3)); //true
Integer integer4 = 200;
Integer integer5 = 200;
System.out.println(integer4 == integer5); //false
System.out.println(integer4.equals(integer5)); //true
/**使用Integer.valueOf()方法,以下为他的源码
* 其中low为-128,high为127,若输入的i在此区间内,则直接在cache[]这个数组中拿数据
* 否则,new Integer(i);
* 所以当使用Integer.valueOf()方法创建Integer对象时
* 在区间-128~127之间的int,若值相同,则它们的地址一样
*
* public static Integer valueOf(int i) {
* if (i >= IntegerCache.low && i <= IntegerCache.high)
* return IntegerCache.cache[i + (-IntegerCache.low)];
* return new Integer(i);
* }
*/
String类
概述:
-
字符串是常量,创建之后不可改变。
-
字符串字面存储在字符串池(方法区/元空间)中,可以共享。
String name = "hello";
name = "sbbb"; //不可修改
String name2 = "sbbb" //共享
String name3 = new String("java");
String name4 = new String("java");
sout(name3 == name4); //输出false
如下图:
常用方法
String content = "java是世界上最好的编程语言java";
//1.length()返回字符串的长度
System.out.println(content.length()); //15
//2.charAt(int index)返回某个位置的字符
System.out.println(content.charAt(content.length()-1)); //言
//3.contains(String str)判断是否包含某个子字符串
System.out.println(content.contains("java")); //true
//4.toCharArray()返回字符串对应的数组
System.out.println(Arrays.toString(content.toCharArray()));
//[j, a, v, a, 是, 世, 界, 上, 最, 好, 的, 编, 程, 语, 言, j, a, v, a]
//5.indexOf()返回字符串首次出现的位置
System.out.println(content.indexOf("java")); //0
System.out.println(content.indexOf("java真好")); //-1
System.out.println(content.indexOf("java",5)); //15
//6.lastIndexOf()返回字符串最后一次出现的位置
System.out.println(content.lastIndexOf("java")); //15
//7.trim()去掉字符串前后的空格
String conten2 = " Hello World ";
System.out.println(conten2.trim()); //Hello World
//8.toUpperCase()把小写改成大写 toLowerCase()把大写改成小写
System.out.println(conten2.toUpperCase()); //HELLO WORLD
System.out.println(conten2.toLowerCase()); //hello world
//9.endWith(str)判断是否已str结尾 starWith(str)判断是否已str开头
System.out.println(conten2.endsWith(" ")); //true
System.out.println(conten2.startsWith(" ")); //true
//10.replace(char old, char new)用新的字符或字符串来替换旧的字符或字符串
System.out.println(content.replace("java", "php"));
//11.split()对字符串进行拆分
String say = "java is the best programing language,java";
String[] arr = say.split("[ ,]+"); //空格或者括号可以连续出现多个
System.out.println(arr.length);
for (String s : arr) {
System.out.println(s);
}
//12.equals()比较大小
String s1 = "hello";
String s2 = "HeLlo";
System.out.println(s1.equals(s2)); //false
//equalsIgnoreCase()忽略大小写的比较
System.out.println(s1.equalsIgnoreCase(s2)); //true
//13.compareTo()暂时不常用
//14.substring()方法截取某一段字符
System.out.println(conten2.substring(5,10)); //lo Wo
StringBuffer和StringBuilder
- StringBuffer:可变长字符串,JDK1.0提供,运行效率慢,线程安全
- StringBuilder:可变长字符串,JDK5.0提供,运行效率快,线程不安全
//两个都有一样的方法
StringBuffer sb = new StringBuffer();
StringBuilder sb2 = new StringBuilder();
//1.append()追加
sb.append("java世界第一");
System.out.println(sb.toString());
sb.append(",java真好");
System.out.println(sb.toString());
//2.insert()添加
sb.insert(0,"我是最前面");
System.out.println(sb.toString());
//3.replace()替换
sb.replace(0,6,"sb,");
System.out.println(sb.toString());
//4.delete()删除
sb.delete(0, 2);
System.out.println(sb.toString());
BigDecimal类
- Java在java.math包中提供的API类BigDecimal
- 用来对超过16位有效位的数进行精确的运算
- 双精度浮点型变量double可以处理16位有效数
- float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal
//double类型的减法运算
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1-d2); //0.09999999999999998
//BigDecimal类的使用
BigDecimal bg1 = new BigDecimal("1.0");
BigDecimal bg2 = new BigDecimal("0.9");
//1.subtract()减法
System.out.println(bg1.subtract(bg2)); //0.1
//2.add()加法
System.out.println(bg1.add(bg2)); //1.9
//3.multiply()乘法
System.out.println(bg1.multiply(bg2)); //0.90
//4.divide()除法 除不尽会报错,要说明保留多少位效数
System.out.println(bg1.divide(bg2,2,BigDecimal.ROUND_CEILING)); //1.12
Date
- 大部分方法已经被Calendar类代替
Calendar
- 提供了获取或设置各种日历字段的方法
- 构造方法 protected Calendar() : 由于修饰符是protected,所以无法直接创建该对象
//1.创建Calendar对象
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
System.out.println(calendar.getTimeInMillis());
//2.获取时间信息
//年
int year = calendar.get(Calendar.YEAR);
//月 从0-11
int month = calendar.get(Calendar.MONTH);
//日
int day = calendar.get(Calendar.DAY_OF_MONTH);
//小时
int hour = calendar.get(Calendar.HOUR_OF_DAY);
//分钟
int minute = calendar.get(Calendar.MINUTE);
//秒
int second = calendar.get(Calendar.SECOND);
System.out.println(year+"/"+(month+1)+"/"+day+"/"+hour+"/"+minute+"/"+second);
SimpleDateFormat类
- 是一个以与语言环境有关的方式来格式化和解析日期的具体类
- 进行格式化(日期–文本)、解析(文本–日期)
- 常用的时间模式字母
G | Era 标志符 | Text | `示例 |
---|---|---|---|
y | 年 | Year | 1996 ; 96 |
M | 年中的月份 | Month | July ; Jul ; 07 |
w | 年中的周数 | Number | 27 |
W | 月份中的周数 | Number | 2 |
D | 年中的天数 | Number | 189 |
d | 月份中的天数 | Number | 10 |
F | 月份中的星期 | Number | 2 |
E | 星期中的天数 | Text | Tuesday ; Tue |
a | Am/pm 标记 | Text | PM |
H | 一天中的小时数(0-23) | Number | 0 |
k | 一天中的小时数(1-24) | Number | 24 |
K | am/pm 中的小时数(0-11) | Number | 0 |
h | am/pm 中的小时数(1-12) | Number | 12 |
mi | 小时中的分钟数 | Number | 30 |
s | 分钟中的秒数 | Number | 55 |
S | 毫秒数 | Number | 978 |
z | 时区 | General time zone | Pacific Standard Time ; PST ; GMT-08:00 |
Z | 时区 | RFC 822 time zone | -0800 |
//SimpleDateFormat的使用
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
Date date = new Date();
//格式化(把日期转成字符串)
System.out.println(sdf.format(date));
//解析(把字符串转成日期)
System.out.println(sdf.parse("2019年02月11日"));
System类
- System系统类,主要用于获取系统的属性数据和其它操作
- 构造方法是私有的,所以不用创建对象
- 标准输入输出, 如out、in、err
- 外部定义的属性和环境变量的访问,如getenv()/setenv()和getProperties()/setProperties()
- 加载文件和类库的方法,如load()和loadLibrary()、
- 快速拷贝数组的方法:arraycopy()
- jvm操作:如gc()、runFinalization()、exit(),该部分并未在源码的java doc中提到,可能因为本身不建议主动调用吧。而且这几个方法都仅仅是Runtime.getRuntime()的调用,两者没有区别
- 获取时间方法:System.nanoTime 和 System.currentTimeMillis
System类中提供了一些系统级的操作方法,这些方法实现的功能分别如下:
arraycopy方法 | public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) |
currentTimeMillis方法 | public static long currentTimeMillis() |
exit方法 | public static void exit(int status) |
gc方法 | public static void gc() |
备注
- 这是“奋进的叻叻”的第一篇java学习笔记
- 所参考的视频是bilibili的“千锋教育-2020新版 Java常用类最新教程”
https://www.bilibili.com/video/BV1vt4y197nY?p=1