Bootstrap

JAVA基础(一):常用类

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

在这里插入图片描述

;