1、String字符串类
字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
用代码定义一个字符串:
String str1 = "Hello World";//第一种方法
String str2 = new String("Hello World");//第二种方法
这两种都可以创建字符串。
字符串可以通过“+”来连接,基本数据类型与字符串进行“+”操作一般也会自动转换为字符串,比如
int a = 5;
String str1 = "Hello" + a;//此时str1就变成了Hello5
String str2 = "Hello"+"World";//此时str2就变成了HelloWorld
String字符串被初始化之后,长度是不变的,并且字符串内容也不变。如果要改变它的长度或者值,就会产生一个新的字符串,如下所示:
String str = "Hello ";//此时str被初始化为“Hello”
str += "World!";//此时str已经变成了“HelloWorld”
在str后直接加了个“World”字符串,形成新的字符串“HelloWorld”。其运行原理是这样的:JVM首先在堆内存中开辟了一块空间,存放了“Hello”字符串,并把str引用指向了“Hello”字符串的内存的地址。当在“Hello”字符串后面加上“World”的时候,JVM又在堆内存中开辟了一块新空间,存放了“HelloWorld”字符串,并把str引用指向到"HelloWorld"字符串的内存的地址,但其实在内存空间中,"Hello"这个字符串还存在,只是str不指向它了,而指向了"HelloWorld"这个新的字符串。
String类的特点:
(1)String类是final类,也即意味着String类不能被继承,并且它的成员方法都默认为final方法。
(2)String类继承自Java中所有类的父类Object,并重写了Object中的equals(比较)方法
(3)String类还有format方法,可以对字符串进行格式化输出
(4)String类还有直接对字符串直接的正则方法:matches方法
(5)String类其实是通过char数组来保存字符串的
深入了解String类:
JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池。每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串(这点对理解上面至关重要)
2、Math数学类
Math类也是Java中做运算常用的类,在java.lang包中,这个系统会自动导入,它包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。
一些常用的方法如下:
常用方法代码演示如下:
public static void main(String[] args) {
double a = 12.86;
long c = Math.round(a); //四舍五入
System.out.println("四舍五入:" + c);
double d = Math.floor(a); //返回小于参数a的最大整数
System.out.println("小于a的最大整数:" + d);
double e = Math.ceil(a); //返回大于参数a的最小整数
System.out.println("大于a的最小整数:" + e);
double x = Math.random(); //产生[0,1)区间内的随机浮点数
System.out.println("默认随机数:" + x);
int y = (int) (Math.random()*99); //产生[0,99)区间内的随机整数
System.out.println("0-99之间的随机整数(不包括99):" + y);
}
输出结果如下:
3、Date日期类
在JDK1.0中,Date类是唯一的一个代表时间的类,但是由于Date类不便于实现国际化,所以从JDK1.1版本开始,推荐使用Calendar类进行时间和日期处理。这里简单介绍一下Date类的使用。
使用Date类代表当前系统时间:
Date d = new Date();
System.out.println(d);
使用Date类的默认构造方法创建出的对象就代表当前时间,由于Date类覆盖了toString方法,所以可以直接输出Date类型的对象,输出结果如下:
这样是最简单的方法了,但是输出格式可能不太适合我们,所以我们需要进行简单的修饰,那么这时需要java.text包中的SimpleDateFormat类中的format方法对文本进行格式化,代码如下:
Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String today = sdf.format(d);
System.out.println(today);
这样就输出了我们常用的时间:
另外格式我们也可以按照我们的需要定义,反过来呢,我们还可以把文本变成默认的时间格式,这用到了SimpleDateFormat类中的parse方法,但是这个方法可能会出现异常,所以需要java.text中的异常类ParseException类进行异常处理,看一个小实例:
public static void main(String[] args) throws ParseException {
//使用parse()方法将文本转换为日期
String d = "2019-02-25 15:53:54";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//调用parse()方法,将字符串转换为日期
Date date = sdf.parse(d);
System.out.println(date);
}
输出结果是:
另外在java.util包中还有一个时间处理的Calendar类,因为Date类中的本身的设计方法,遭到了众多批评,所以推荐使用Calendar类来处理时间,Calendar类是一个抽象类,可以通过调用getInstance静态方法获得Calendar的一个对象,此对象默认由当前时间进行初始化,直接来一个简单的实例:
public static void main(String[] args) {
Calendar c = Calendar.getInstance(); //实例化Calendar对象
int year = c.get(Calendar.YEAR); //通过get方法获得当前年
int month = c.get(Calendar.MONTH) + 1; //月份0-11,需要加1
int day = c.get(Calendar.DAY_OF_MONTH); //日期
int hour = c.get(Calendar.HOUR_OF_DAY); //获取小时
int minute = c.get(Calendar.MINUTE); //获取分钟
int second = c.get(Calendar.SECOND); //获取秒数
System.out.println("当前时间:" + year + "年" + month + "月" + day + "日" + " " + hour + ":" + minute + ":" + second);
}
输出结果是:
Calendar还提供了getTime方法,用来获取Date对象,实现Calendar和Date对象的互转,还可以用getTimeInMillis获得1970年01月01日0时0分0秒,到当前时间的毫秒数,大约是Unix时间戳的1000倍
简单代码如下:
Date date = c.getTime(); //对象转换
Long time = c.getTimeInMillis(); //获取至现在的毫秒数
System.out.println("当前时间:" + date);
System.out.println("当前毫秒数:" + time);
输出结果:
4、Java包装类
基本数据类型我们都很熟悉,例如:int、float、double、boolean、char等,基本数据类型不具备对象的特征,不能调用方法,一般能实现的功能比较简单,为了让基本数据类型也具备对象的特性,Java为每个数据类型都提供了一个包装类,这样我们就可以像操作对象一样,操作这些基本数据类型了。
常见的包装类和基本类型对应关系如下:
包装类主要提供了两类方法:
1、进行多个类型之间的转换
2、将字符串和本类型及包装类相互转换
比如下面代码:
1 int i = 2;
2 Integer m = new Integer(5);
3 Integer n = new Integer("8");
第一行是用基本类型定义了整型变量i,第二行是利用int包装类定义了int对象m,虽然赋值为整型的5,但是现在会将基本类型转换为包装类中的5,第三行初始化值为字符串类型的"8",但是会被包装类转换成整数类型,这就是包装类的基本使用方法
每个包装类都可以和其他类进行转换,比如Integer包装类,转换的对应关系如下:
根据转换的对应关系,可以写一个简单的实例如下:
public static void main(String[] args) {
int score1 = 86;
// 创建Integer包装类对象,表示变量score1的值
Integer score2=new Integer(score1);
// 将Integer包装类转换为double类型
double score3=score2.doubleValue();
// 将Integer包装类转换为float类型
float score4=score2.floatValue();
// 将Integer包装类转换为int类型
int score5 =score2.intValue();
System.out.println("Integer包装类:" + score2);
System.out.println("double类型:" + score3);
System.out.println("float类型:" + score4);
System.out.println("int类型:" + score5);
}
通过这个简单的包装类转换程序,可以看出包装类转换为各种基本数据类型也是很方便的
那么基本类型怎么转换为包装类的对象呢?其实前面三行代码已经体现了,只不过不太完全,基本类型转换为包装类可以理解为一个装箱的过程,装箱有两种方式:手动装箱和自动装箱,那么同理包装类转换为基本类型叫做拆箱,同样分为:手动拆箱和自动拆箱,上面的例子就是一个手动拆箱的例子,
那么其中自动装箱和自动拆箱,都是编译器根据数据类型自动完成了转换,简单的代码如下:
public static void main(String[] args) {
double a = 91.5;
// double类型手动装箱
Double b = new Double(a);
// double类型自动装箱
Double c = a;
System.out.println("装箱后的结果为:" + b + "和" + c);
Double d = new Double(87.0);
// Double包装类对象手动拆箱
double e = d.doubleValue();
//Double包装类对象自动拆箱
double f = d;
System.out.println("拆箱后的结果为:" + e + "和" + f);
}
例子很简单,对每一个数据类型分别完成了自动和手动两个操作,所以b和c的值是一样的,e和f的值是一样的
除了基本数据类型的包装转换之外,基本类型和字符串之间也可以进行转换
比如一个基本类型:int a = 30;有3中方式转换为字符串对象:
1、使用包装类的toString方法,String str1 = Integer.toString(a);
2、使用String类的valueOf方法,String str2 = String.valueOf(a);
3、用一个空字符串加上基本类型,系统会将基本类型转换为字符串类型,String str3 = a + "";
反过来,定义:String str = "18";将一个字符串类型转换为基本类型有以下两种方法:
1、调用包装类的parseXxx静态方法,int b = Integer.parseInt(str);
2、调用包装类的valueOf方法,完成自动拆箱,int c = Integer.valueOf(str);
其他类型转换也是一样,替换里面的类型即可,下面是一个简单的例子:
public static void main(String[] args) {
double m = 78.5;
//将基本类型转换为字符串
String str1 = Double.toString(m);
System.out.println("m 转换为String型后与整数20的求和结果为: "+(str1+20));
String str = "180.20";
// 将字符串转换为基本类型
Double a = Double.valueOf(str);
System.out.println("str 转换为double型后与整数20的求和结果为: "+(a+20));
}
这个例子实现了两次转换,所以str1+20应该输出:78.520,a+20应该输出:200.20,前者结果是字符串类型,后者结果是基本的浮点数类型。
谢谢你的浏览,如果对你有所帮助,记得点赞评论哦!