java学习笔记二:常用类
本文是记录在尚硅谷学习java的一些笔记,因为刚开始写博客,可能大部分都是PPT的搬用,希望多多包涵,后续会继续更新,欢迎大家交流学习,如有不妥之处,欢迎多多评论
字符串相关的类:String
String的特性
- String 类:代表字符串。Java程序中的所有字符串字面值(如“abc”)都读作为此类的实例实现
- String是一个final类,代表不可变的字符序列
- 字符串是常量,用双引号引起来表示。他们的值在创建之后不能更改。
- String对象的字符内容是存储在一个字符数组value[]中的
String对象的创建
//字面量方式,直接在常量池创建char[]
String str = "hello";
//通过new+构造器
//本质上this.value = new char[0]
String s1 = new String();
//this.value = original.value;
String s2 = new String(String original);
//this.value = Array.copyOf(value,value.length);
String s3 = new String(char[] a);
String s4 = new S
面试题:String s = new String(“abc”);方式创建对象,在内存中创建了几个对象?
答:两个,一个是堆空间中new结构,另一个是char[]对应的常量池中的数据:“abc”
字符拼接
String s1 = "123";
String s2 = "abc";
String s3 = "123abc";
String s4 = "123"+"abc";
String s5 = s1+"abc";
String s6 = "123"+s2;
String s7 = s1+s2;
s3 == s4 //true
s3 == s5 //false
s3 == s6 //false
s3 == s7 //false
String s8 = s5.intern();//返回值得到的s8使用的常量值中已经存在的"123abc"
s3 == s8 //true
总结:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量
2.只要其中有一个是变量,结果就在堆中
3.如果拼接的结果调用intern()方法,返回值就在常量池中
字符串相关的类:String常用方法
String与基本数据类型转换
注意编码和解码的问题
StringBuffer与StringBuilder
String、StringBuffer、StringBuilder三者的异同?
String:不可变的字符序列;底层使用char[]存储
StringBuffer:可变的字符序列、效率低、线程安全;底层使用char[]存储
StringBuilder:JDK5.0新增;可变的字符序列、效率高、线程不安全;底层使用char[]存储
注意:参数传递的话,方法内部String不会改变其值,StringBuffer、StringBuilder会改变其值
- 源码分析
String str = new String; //new charr[0];
String str1 = new String("abc"); //new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer(); //new char[16]底层创建了一个长度16的数组
sb1.append('a'); // value[0] = 'a'
sb1.append('b'); // value[1] = 'b'
StringBuffer sb2 = new StringBuffer("abc"); // char[] value = new char["abc".length+16]
问题1:System.out.println(sb2.length()); //3
问题2:扩容问题:如果要添加的底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
指导意义:开发中建议大家使用:StringBuffer(int capacity)或StringBuilder(int capacity)
StringBuffer类的常用方法
注意StringBuilder的方法与StringBuffer类似
JDK8之前日期时间API
3. java.sql.Date对应着数据库中的日期类型的变量
-> 如何将java.util.Date对象转换为java.sql.Date
//情况一:
Date date1 = new java.sql.Date(12873618L); //多态
java.sql.Date date2 = (java.sql.Date)date1; //强转
//情况二:
Date date3 = new Date();
java.sql.Date date4 = new java.sql.Date(date3.getTime());
//按照指定的方式格式化和解析
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化
String format = sdf.format(date);//2020-07-24 17:06:21
//解析:要求字符串必须是符合SimpleDateFormat识别的格式(通过构造器参数体现)
sdf.parse("2020-07-24 17:06:21");//这里传入的String必须是实例化带参的格式
JDK8新日期时间API
LocalDate 、 LocalTime 、 LocalDateTime
瞬时Instant
格式化与解析日期或时间
//方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE_DATE
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
//格式化:日期->字符串
LocalDateTime localDateTime = LocalDateTime.now();
String str1 = formatter.format(localDateTime);
//解析:字符串->日期
TemporalAccessor parse = formatter.parse("2020-07-24T21:21:21.234");
//方式二:
//本地化相关的格式。如ofLocalizedDateTime()
//FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT:适用于LocalDateTime
DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG);
//格式化
String str2 = formatter1.format(localDateTime);
//本地化相关格式。如ofLocalizedDate()
//FormatStyle.FULL / FOrmatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT:适用于LocalDate
DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL);
//格式化
String str3 = formatter.format(LocalDate.now());
//重点:方式三:自定义的格式。如ofPattern("yyyy-MM-dd hh:mm:ss E")
DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss E");
//格式化
String str4 = formatter3.format(LocalDateTime.now());
//解析
TemporalAccessor parse1 = formatter3.parse("2020-07-24 21:35:23");
其他API
- 与传统日期处理的转换
Java比较器
- 在 Java 中经常会涉及到对象数组的排序问题,那么就涉及到对象之间的比较问题 。
- Java 实现对象排序的方式有两种:
-> 自然排序: java.lang.Comparable
-> 定制排序: java.util.Comparator
自然排序
定制排序
Comparable和Comparator的适用比较
Comparable接口的方式一旦确定,保证Comparable接口实现类的对象再任何位置都可以比较大小
Comparator接口属于临时性的比较
System类
Math类
BigInteger 与 BigDecimal
BigInteger类