根据b站韩顺平教育韩顺平教育java教学视频学习的学习笔记。个人学习理解,如有疏漏,敬请改正。
包装类(Wrapper类)
包装类的分类
1、针对八种基本数据类型相应的应用类型—包装类
2、有了类的特点就可以调用类中的方法
基本数据类型
包装类
boolean
Boolean
char
Character
byte
Byte
short
Short
int
Integer
long
Long
float
Float
double
Double
颜色标注为这个的包装类其父类都是Number
包装类和基本数据类型的转换(装箱和拆箱)基本数据类型——>包装类型(装箱),反之拆箱。自动装箱底层调用的是valueOf()方法
实例(以int和Integer演示)
//手动装箱 //int --> Integer int n1 = 100; Integer integer = new Integer(n1);//手动转换 Integer integer1 = Integer.valueOf(n1);//自动转换 //手动拆箱 // Integer--> int int i = integer.intValue(); //jdk5以后能进行自动装箱和拆箱 //自动装箱 int n2 = 200; Integer integer2 = n2;//底层使用的仍然是Interger.valueOf(n2) // 自动拆箱 int n3 = integer2;//底层使用的仍然是integer.intValue()
其他包装类类似
应用包装类对应的就是对象,对象之间使用“==”运算符,则是判断是不是一个对象。只要有基本数据类型“==”比较的就是数值。
三元运算符是一个整体
String类
包装类与String类的相互转换
//Integer --> String Integer i = 1; //方式1 String str = i.toString(); //方式2 String str1 = i + " "; //方式3 String str3 = String.valueOf(i); //String --> Integer String str_ = "123"; Integer integer = Integer.parseInt(str_);//使用到自动装箱 Integer integer1 = new Integer(str_);//构造器
- String对象用于保存字符串,也就是一组字符序列。
- 字符串常量对象是用双引号括起的字符序列。
- 字符串的字符使用Unicode字符编码,一个字符(不区分字母还是汉字)占两个字节。
- String类常用构造器
String str = new String(); String str1 = new String(String original); String str2 = new String(char[] a); String str3 = new String(char[] a,int startindex,int count); String str4 = new String(byte[] b)
5、String实现了Serializable接口,说明String可以串行化,即可以在网络上传输
String也实现了Comparable接口,当一个类实现Comparable接口,说明这个类的对象可以互相比较
6、String是一个final类,不可被继承
7、String有属性private final char value[];用于存放字符串内容
8、一定要注意:value是一个final类型,不可以修改(地址不可修改非值不可修改(数组))。
创建String对象的两种方式
方式一:直接赋值String s = “hsp”;
方式二:调用构造器 String s1 = new String(“hsp”);
区别:
方式一:现从常量池查看是否有“hsp”数据空间,如果有直接指向;如果没有则重新创建。s最终指向的是常量池的空间地址。
方式二:先从堆中创建空间,里面维护了value属性,指向常量池的数据空间。如果常量池没有则重新创建,如果有,直接通过value指向。S1最终指向的是堆中的空间地址。
字符串特性
- String是一个final类,代表不可变的字符序列
- 字符串是不可变的,一个字符串对象一旦被分配,其内容是不可变的
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。
String a = “ab” + “cd”;常量相加看的是池,String a = b + d;变量相加看的是堆。
String类的常见方法
equals//区分大小写,判断内容是否相等
equalsIgnoreCase//忽略大小写的判断内容是否相等
length//获取字符个数,字符串的长度
indexOf//获取字符在字符串中第一次出现的索引,索引从0开始,如果找不到,返回-1
lastIndexOf//获取字符在字符串中最后一次出现的索引,索引从0开始,如找不到,返回-1
substring//截取制定范围的字串
trim//去前后空格
charAt:获取某索引处的字符,注意不能使用Str[index]这种方式
String类是保存字符串常量的。每次更新都需要重新开辟空间,效率较低,因此java设计者还提供了StringBuilder和StringBuffer来增强String的功能,并提高效率。
StringBuffer和StringBuilder类
StringBuffer
Java.lang.StringBuffer代表可变的字符序列,可以对字符串内容进行增删。
很多方法与String相同,但StringBuffer是长度可变的。
StringBuffer是一个容器,同时也是一个final类
StringBuffer实现了Serializable接口,即StringBuffer的对象可以串行化
StringBuffer的直接父类是AbstractStringBuilder,这个父类中有属性char[] value,这个属性不是final,该value数组存放字符串内容,存放在堆中,即不再在常量池中读取数据空间,所以每次变化(增加、删除)都不用更换地址(创建新的对象),所以效率高于String
StringBuffer的构造器
StringBuffer():构造一个其中不带字符的字符串缓冲区,其初始容量为16个字符
StringBuffer(CharSequence seq):构造一个字符串缓冲区,它包含与制定的CharSequence相同的字符。
StringBuffer(int capacity):构造一个不带字符,但具有制定初始容量的字符串缓冲区,即对char[]大小进行制定
StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为制定的字符串内容
String和StringBuffer的相互转换
//String --> StringBuffer //方式一:使用构造器 String str = "hello"; StringBuffer stringBuffer = new StringBuffer(str); //方式二:使用append()方法 StringBuffer stringBuffer1 = new StringBuffer(); stringBuffer1 = stringBuffer1.append(str); //StringBuffer --> String StringBuffer str1 = new StringBuffer("hello"); //方式一:使用StringBuffer提供的toSting方法 String str2 = str1.toString(); //方式二:使用构造器 String s = new String(str1);
StringBuffer常用方法
增:append
删:delete(start,end)
改:replace(start,end,string)将start---end之间的内容替换掉,不含end
查:indexOf
插:insert
获取长度:length
StringBuilder
- 一个可变的字符序列。此类提供了一个与StringBuffer兼容的API,但不保证同步(StringBuilder不是线程安全)。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可以,建议优先使用该类,因为在大多数实现中,它比StringBuffer要快。
2、在StringBuilder上的主要操作是append和insert方法,可重载这些方法,已接收任意类型的数据。StringBuilder与StringBuffer的方法是一样的,所以使用和StringBuffer一样
3、继承AbstractStringBuilder类,实现Serializable接口,是final类,其对象字符序列仍然是存放在其父类 AbstractStringBuilder的char[] value。
4、StringBuilder的方法没有做互斥的处理,即没有synchronized关键字,因此适合用于单线程
如果我们要对字符串进行大量的修改,不要使用String
Math类
Math类中的方法都是静态的,具体方法和作用查看javaAPI文档
Date日期类、Calendar日历类以及新的日期
第一代日期类
- Date:精确到毫秒,代表特定的瞬间。获取当前系统的时间,默认输出的日期格式是国外的方式
- SimpleDateFormat:格式化和解析日期的类。它允许进行格式化(日期->文本)、解析(文本->日期)和规范化
Date date = new Date(); System.out.println("当前日期:"+ date); SimpleDateFormat sdf = new SimpleDateFormat(); String format = sdf.format(date); System.out.println("当前日期:"+ format); SimpleDateFormat sdf1 = new SimpleDateFormat("YYYY年MM月dd日 hh:mm:ss E"); String format1 = sdf1.format(date); System.out.println("当前日期:"+ format1); long l = System.currentTimeMillis(); System.out.println("自1970-1-1-0-0至当前时间毫秒数:" + l);
第二代日期类Calendar类(日历)
Calendar类是一个抽象类。它为特定瞬间与一组诸如YEAR、MONTH、DAT_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
Calendar是一个抽象类,并且构造器是private
- 可以通过getInstance()来获取实例
- 提供大量的方法和字段提供给程序员
Calendar can = Calendar.getInstance();//创建日历类对象,不用new 抽象类 //获取日历对象的某个日历字段 System.out.println("年:" + can.get(Calendar.YEAR)); //月份默认从0开始计算,所以要加1 System.out.println("月:" + (can.get(Calendar.MONTH) + 1)); System.out.println("日:" + can.get(Calendar.DATE)); System.out.println("小时:" + can.get(Calendar.HOUR)); System.out.println("分钟:" + can.get(Calendar.MINUTE)); System.out.println("秒:" + can.get(Calendar.SECOND));
Calendar没有专门的格式化方法,所以需要程序员自己来组合显示
第三代日期类
前面两代日期类的不足
JDK1.0中包含了一个java.util.Date类,但是它的大多数方法依据在JDK1.1引入Calendar类之后就被弃用了。而对于Calendar
可变性:像日期和时间这样的类应该是不可变的
- 偏移性:Date中的年份是从1900开始的,而月份都从0开始
- 格式化:格式化只对Date有用,Calendar则不行
- 此外,他们不是线程安全的;不能处理闰秒等(每隔两天,多出1秒)。
鉴于以上,JDK8加入LocalDate(日期/年月日):只包含日期、LocalTime(时间/时分秒):只包含时间、LocalDateTime(日期时间/年月日时分秒):包含日期+时间
常用方法
- now返回当前日期
时间的对象
//now表示获取当前时间 LocalDateTime ldt = LocalDateTime.now();//LocalDate.now()/ LocalTime.now() System.out.println("Now LocalDateTime :" + ldt); System.out.println("年:" + ldt.getYear()); //月份默认从0开始计算,所以要加1 System.out.println("月:" + ldt.getMonth()); System.out.println("月:" + ldt.getMonthValue()); System.out.println("日:" + ldt.getDayOfMonth()); System.out.println("小时:" + ldt.getHour()); System.out.println("分钟:" + ldt.getMinute()); System.out.println("秒:" + ldt.getSecond()); DateTimeFormatter dtf = DateTimeFormatter.ofPattern("YYYY年MM月dd日 hh:mm:ss E"); String day = dtf.format(ldt); System.out.println(day);
- DateTimeFormatter格式日期类,类似于SimpleDateFormat
Instant——>Date
Date date = Date.from(instant);
Date——>Instant
Instant instant = date.toInstant();
- Instant时间戳,类似于Date,提供了一系列和 Date类转换的方式
System类
- exit:退出当前程序 System.exit(0):0表示正常的状态,正常退出
- arraycopy(src,srcPos,det,detPos,length):复制数组元素,比较适合底层调用,一般使用Arrays.copyOf完成复制数组,五个参数的意义看源码。
- currentTimeMillens:返回当前时间距离1970-1-1的毫秒数
- gc:运行垃圾回收机制System.gc();
Arrays类
Array里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)
常用方法
- toString:返回数组的字符串形式
- sort:排序,自然排序和定制排序
- binarySearch:通过二分搜索法进行查找,要求必须排好序、
- CopyOf:数组元素的复制
- Fill:数组元素的填充
- equals:比较两个数组元素内容是否完全一致
- asList将一组值,转换成list
BigInteger类和BigDecimal类(大数处理方案)
- BigInteger适合保存比较大的整型、
- BigDecimal适合保存精度更高的浮点型(小数)
常见方法
- add加
- subtract减
- multiply乘
- divide除
在使用BigDecimal的divide方法时,对于无限循环的小数会抛出异常,此时在调用时制定精度即可。如果有无限循环小数,就会保留分子的精度
BigDecimal bigDecimal = new BigDecimal("298.1000987876576858"); BigDecimal bigDecimal1 = new BigDecimal("3"); BigDecimal divide = bigDecimal.divide(bigDecimal1,BigDecimal.ROUND_CEILING); System.out.println(divide);