JAVA基础学习路线
常用类
包装类
包装类:Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却 是不面向对象的。但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如: 集合的操作中。 这时,我们就需要将基本类型数据转化成对象!
包装类均在java.lang包中,包装类跟基本数据类型的对应关系
关于int的包装类测试
@Test
void test() {
//基本对象类型转成包装类
Integer a = Integer.valueOf(10);
System.out.println(a);
Integer b = 10;
System.out.println(b);
//将字符串转为Integer
Integer c = Integer.parseInt("10");
System.out.println(c);
//将Integer转换成字符串
String str = c.toString();
System.out.println(str);
if(str.equals("10")) System.out.println("true");
else System.out.println("false");
//关于Integer封装的方法
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(Integer.max(3, 10));
System.out.println(Integer.reverse(56));
System.out.println(Integer.sum(10, 10));
}
其他封装的方法可以自己试一下使用
包装类的作用:
1、完成字符串、基本数据类型、对象之间的互相转换
2、分装基本数据类型的操作以及相关属性
自动装包和拆包
//自动装箱是指:基本类型自动分装成相同类型的包装类中
Integer i = 10;
//实际上,编译器自动添加了
Integer i = Integer.valueOf(100);
//自动拆箱是指包装类自动转成了基本数据类型
//该方法已被高版本的jdk不推荐使用了
int a = new Integer(10);
//内部完成了
int a = new Integer(100).intValue();
String类
String 是不可变 的字符序列!!!
常用的方法
1、字符串的拼接
String s1 = "hello";
String s2 = "java";
String s = s1 + s2;
2、charAt:返回字符串中的第index个字符
String s1 = "hello";
System.out.println(s1.charAt(3));
3、equals(String other):判断字符串相等
4、equalsIgnoreCase(String other):忽略大小写
5、indexOf(String str):字符匹配
6、跟匹配有关的:replace、substring、startsWith、endsWith
7、大小写转换:toLowerCase、toUpperCase
8、去除头尾空格:trim
9、其他的方法可以看String内部分装好的方法
StringBuffer 和 StringBuilder
StringBuffer sf = new StringBuffer();
sf.append("hello world");
System.out.println(sf.insert(5, " java").toString());
StringBuilder sb = new StringBuilder();
for(int i=0;i<26;i++){
char temp = (char)('a'+i);
sb.append(temp);
}
sb.reverse();
sb.setCharAt(3, 'j');
sb.delete(20, 23);
String、StringBuilder、StringBuffer 的对比:
String:不可变字符序列
StringBuilder:可变字符序列、效率高、线程不安全
StringBuffer :可变字符序列、效率低、线程安全
需要注意的是String是不可变序列:
String s = "a";
s = s+"b";
这个操作中,其实创建了两个字符串对象,反复操作会导致大量副本字符串分配了内存,没有被释放,降低效率。
效率测试
public static void main(String[] args) {
/** 使用String进行字符串的拼接 */
String str8 = "";
// 本质上使用StringBuilder拼接, 但是每次循环都会生成一个StringBuilder对象
long num1 = Runtime.getRuntime().freeMemory();// 获取系统剩余内存空间
long time1 = System.currentTimeMillis();// 获取系统的当前时间
for (int i = 0; i < 5000; i++) {
str8 = str8 + i;// 相当于产生了10000个对象
}
long num2 = Runtime.getRuntime().freeMemory();
long time2 = System.currentTimeMillis();
System.out.println("String占用内存 : " + (num1 - num2));
System.out.println("String占用时间 : " + (time2 - time1));
/** 使用StringBuilder进行字符串的拼接 */
StringBuilder sb1 = new StringBuilder("");
long num3 = Runtime.getRuntime().freeMemory();
long time3 = System.currentTimeMillis();
for (int i = 0; i < 5000; i++) {
sb1.append(i);
}
long num4 = Runtime.getRuntime().freeMemory();
long time4 = System.currentTimeMillis();
System.out.println("StringBuilder占用内存 : " + (num3 - num4));
System.out.println("StringBuilder占用时间 : " + (time4 - time3));
}
Date类
Date类和Date以下的子类已经被jdk8之后抛弃了
Date类已经惨成这样了,连构造函数都被划掉了,就8要在用了
JDK8之后出现的是LocalDateTime、
System.out.println(time);//2020-05-20T16:52:17.879475700
System.out.println(time.getMinute());//52
System.out.println(time.getYear());//2020
//手动构造一个时间
LocalDateTime d = LocalDateTime.of(2019, 5, 10, 3, 20);
System.out.println(d);//2019-05-10T03:20
比较常用的字符串解析成时间
//将字符串转换成LocalDateTime对象
d = LocalDateTime.parse("2018-05-01 11:21",DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
System.out.println(d);//2018-05-01T11:21
//date方式
//把时间对象按照“格式字符串指定的格式”转成相应的字符串
DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String str = df.format(new Date(4000000));
System.out.println(str);
Date和LocalDateTime的对比:
Date时间类是可变类,在后面多线程下对Date变量必须要保证线程安全,不然容易出现时间不一致的问题,包括SimpleDateFormat的格式化字符串也是线程不安全的类
JDK8之后出现的LocalDateTime是线程安全的,不用在考虑线程并发的问题,格式化字符串就采用DateTimeFormatter
官方文档
Canlendar(了解即可)
GregorianCalendar:公历,是 Calendar 的一个具体子类,提供了世界上大多数国家/地区使用的标 准日历系统。
月份:一月是0,二月是1,以此类推,12月是11
星期:周日是1,周一是2 周六是7
//获得日期的相关元素
Calendar calendar = new GregorianCalendar(2999,10,9,22,10,50);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DATE); //也可以使用:DAY_OF_MONTH。
int weekday = calendar.get(Calendar.DAY_OF_WEEK); //星期几。 1-7. 1:星期日,2星期一,。。。7是星期六。
System.out.println(year) ;
System.out.println(month) ; //0-11表示对应的月份。0是1月,1月是2月.....11是12月。
System.out.println(weekday);
System.out.println(day);
//设置日期的相关元素
Calendar c2 = new GregorianCalendar();
c2.set(Calendar.YEAR, 8012);
System.out.println(c2);
//日期的计算
Calendar c3 = new GregorianCalendar();
c3.add(Calendar.YEAR, -100);
System.out.println(c3) ;
//日期对象和时间对象的转化
Date d4 = c3.getTime();
Calendar c4 = new GregorianCalendar();
c4.setTime(new Date());
枚举类(了解)
跟枚举的使用方式差不多
public enum Season{
SPRING,SUMMER,AUTUMN,WINTER;
}
@Test
void test() {
Season season = Season.AUTUMN;
System.out.println(season);
switch(season){
case SPRING:
System.out.println("春天来了,播种的季节");
break;
case SUMMER:
System.out.println("夏天来了,游泳的季节");
break;
case AUTUMN:
System.out.println("秋天来了,收获的季节");
break;
case WINTER:
System.out.println("冬天来了,冬眠的季节");
break;
}
}
Math类和Random类
//取整相关操作
System.out.println(Math.ceil(3.2));
System.out.println(Math.floor(3.2));
System.out.println(Math.round(3.2));
System.out.println(Math.round(3.8));
//绝对值、开方、a的b次幂等操作
System.out.println(Math.abs(-45));
System.out.println(Math.sqrt(64));
System.out.println(Math.pow(5, 2));
System.out.println(Math.pow(2, 5));
//Math类中常用的常量
System.out.println(Math.PI);
System.out.println(Math.E);
//随机数
System.out.println(Math.random());// [0,1)
Random rand = new Random();
//随机生成[0,1)之间的double类型的数据
System.out.println(rand.nextDouble());
//随机生成int类型允许范围之内的整型数据
System.out.println(rand.nextInt());
//随机生成[0,1)之间的float类型的数据
System.out.println(rand.nextFloat());
//随机生成false或者true
System.out.println(rand.nextBoolean());
//随机生成[0,10)之间的int类型的数据
System.out.println(rand.nextInt(10));
//随机生成[20,30)之间的int类型的数据
System.out.println(20 + rand.nextInt(10));
//随机生成[20,30)之间的int类型的数据(此种方法计算较为复杂)
System.out.print(20 + (int) (rand.nextDouble() * 10));
File类
file的基本操做
//打开文件
File f = new File("D://a.txt");
//更改名字
//f.renameTo(new File("D://a.txt"));
System.out.println("File是否存在:"+f.exists());//File是否存在:true
System.out.println("File是否是目录:"+f.isDirectory());//File是否是目录:false
System.out.println("File是否是文件:"+f.isFile());//File是否是文件:true
Instant instant = Instant.ofEpochMilli(f.lastModified());//
LocalDateTime localDateTime = LocalDateTime.ofInstant(instant,ZoneId.systemDefault());
System.out.println("file最后修改的时间:"+localDateTime);//file最后修改的时间:2020-03-30T15:53:06.678
System.out.println("File的目录路径:"+f.getAbsolutePath());//File的目录路径:D:\a.txt