[TOC]
String 类使用
1.Scanner 详解于使用
Scanner的概述:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串,以默认空格作为分割。
Scanner的构造方法原理:
[TOC]
Scanner的概述:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串,以默认空格作为分割。
Scanner的构造方法原理:
[TOC]
Scanner的概述:一个简单的文本扫描器,可以使用正则表达式解析原始类型和字符串,以默认空格作为分割。
Scanner的构造方法原理:1
2
3
4
5
6
7
8#由于是final修饰Scanner类不能被继承
public final class Scanner
extends Object
implements Iterator<String>, Closeable
#常用方法
Scanner(InputStream source)
Scanner(System.in)
System类下有一个静态的字段:public static final InputStream in
; 标准的输入流,对应着键盘录入。
一般方法
Scanner获取数据出现的小问题及解决方案
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38package com.weiyigeek;
import java.util.Scanner;
public class ScannerClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
//示例1:输入格式判断
System.out.print("请输入一个整数:");
if (sc.hasNextInt()) {
System.out.println("整数:"+sc.nextInt());
}else {
System.out.println("格式错误!");
}
//示例2.NextInt域nextLine联用的问题
System.out.print("请输入第二个1数字:");
int integer = sc.nextInt();
System.out.println("请输入第二个字符串:");
String line = sc.nextLine();
System.out.println("Integer 整数:"+integer+","+line);
//解决方法1:创建两次对象
int i = sc.nextInt();
Scanner lineStr = new Scanner(System.in);
String line1 = lineStr.nextLine();
System.out.println("解决方法: 整数="+ i +", 字符串=" + line1);
}
}
//#执行结果
请输入一个整数:1024
整数:1024
请输入第二个1数字:2048
请输入第二个字符串:
Integer 整数:2048,
4096
I love Study Java
解决方法: 整数=4096, 字符串=I love Study Java
String类的概通过JDK提供的API,查看String类的说明,只要是java.lang
里面的类都不用导包;
Java语言为字符串连接运算符(+)提供特殊支持,并为其他对象转换为字符串。
常见构造方法:1
2
3
4
5
6* public String():空构造
* public String(byte[] bytes):把字节数组转成字符串
* public String(byte[] bytes,int index,int length):把字节数组的一部分转成字符串
* public String(char[] value):把字符数组转成字符串
* public String(char[] value,int index,int count):把字符数组的一部分转成字符串
* public String(String original):把字符串常量值转成字符串
String类的常见面试题:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23#* 1.判断定义为String类型的s1和s2是否相等
* String s1 = "abc";
* String s2 = "abc";
* System.out.println(s1 == s2); #T
* System.out.println(s1.equals(s2)); #T
#* 2.下面这句话在内存中创建了几个对象?
* String s1 = new String("abc"); #// 2 个对象 ,常量池一份(正本),堆内存一份(副本);
#* 3.判断定义为String类型的s1和s2是否相等
* String s1 = new String("abc");
* String s2 = "abc";
* System.out.println(s1 == s2); #F
* System.out.println(s1.equals(s2)); #T
#* 4.判断定义为String类型的s1和s2是否相等
* String s1 = "a" + "b" + "c";
* String s2 = "abc";
* System.out.println(s1 == s2); #T JAVA中的常量优化机制
* System.out.println(s1.equals(s2)); #T
#* 5.判断定义为String类型的s1和s2是否相等
* String s1 = "ab";
* String s2 = "abc";
* String s3 = s1 + "c";
* System.out.println(s3 == s2); #F
* System.out.println(s3.equals(s2)); #T
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63package com.weiyigeek;
public class StringDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
//#示例1.字符串是不可更改的,除了 字符串缓冲区支持可变字符串
String str = "abcdefg"; //字符串对象
System.out.println(str); //输出字符串
System.out.println(str.toString()); //String类重写了toString方法返回的是该对象本身;
//#示例2.字符串是常量一旦被赋值将不能被改变
str = "重新赋值,原来的字符串就变成垃圾等待被回收!";
System.out.println(str);
//#示例3.String类的构造方法
byte[] arr1 = {48, 65, 97};
String s1 = new String(arr1); //通过使用平台的默认字符集解码指定的字节数组来构造新的 String
System.out.println(s1);
byte[] arr2 = {97,98,99,100,101,102};
String s2 = new String(arr2,2,3); //从arr2数组中第三个元素开始解码转换3个
System.out.println(s2);
char[] arr3 = {'a','b','c','d','e'}; //字符数组转换成为字符串
String s3 = new String(arr3);
System.out.println(s3);
String s4 = new String(arr3,2,2); //字符数组从指定位置开始转多少个
System.out.println(s4);
String s5 = new String("WeiyiGeek");
System.out.println(s5);
//示例3.面试题
extracted();
stackFinal();
diffrenent();
}
//常量池中没有这个字符串对象就创建,如果有就直接引用即可(相同地址)
private static void extracted() {
String a1 = "abc";
String b1 = "abc";
System.out.println("方式1:"+(a1 == b1)); //我们前面知道 == 号默认比较的是对象地址,这里由于字符串是常量实际a1与b1指向同一个;
System.out.println("方式2:"+b1.equals(a1));
}
//常量池中的地址与堆内存中的地址是不一样的;
private static void stackFinal() {
String s1 = new String("abc"); //记录的是堆内存的地址值
String s2 = "abc"; //记录是常量池中的地址值
System.out.println(s1 == s2); // == 比较的是地址
System.out.println(s1.equals(s2)); //比较的是字符串
}
//字符串串联符号+以及将其他对象转换为字符串
private static void diffrenent() {
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c"; //经过StringBuffer 再使用toString转换成String ; 所以地址是不同的
System.out.println("方式1:" + (s3 == s2));
System.out.println("方式2:" + s3.equals(s2));
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18abcdefg
abcdefg
重新赋值,原来的字符串就变成垃圾等待被回收!
0Aa
cde
abcde
cd
WeiyiGeek
方式1:true
方式2:true
false
true
方式1:false
方式2:true
String类的判断功能:
空串””和null的区别
会出现空指针异常
,null常量可以给任意的引用数据类型赋值
;基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27package com.weiyigeek;
public class StringJudge {
public static void main(String[] args) {
// TODO Auto-generated method stub
//示例1.判断是否为空以及内容是否相同区分大小
String s1 = "";
String s2 = "abc";
String s3 = "ABC";
System.out.println("isEmpty: " + s1.isEmpty()); //是为空返回TRUE
System.out.println("equals: " + s2.equals(s3)); //返回FALSE由于区分大小写
System.out.println("equalsIgnoreCase: " + s2.equalsIgnoreCase(s3)); //返回TRUE由于不区分大小写
//示例2.判断字符串中是否包含另一个字符串以及匹配开头可结尾
String s4 = "ABC is capital,then lowercase is abc";
System.out.println("contains: " + s4.contains(s2)); // 返回为true由于S4确实包含s2字符串
System.out.println("startsWith: " + s4.startsWith(s3)); //返回为True由于s3字符串是s4字符串的开头
System.out.println("endsWith: " + s4.endsWith(s2)); //返回为TRUE由于s2字符串是s4字符的结尾
}
}
//执行结果:
isEmpty: true
equals: false
equalsIgnoreCase: true
contains: true
startsWith: true
endsWith: true
String类的获取功能1
2
3
4
5
6
7
8
9* int length():获取字符串的长度(其实是获取每一个字符的个数)
* char charAt(int index):获取指定索引位置的字符
* int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。(不存再返回-1)
* int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
* int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
* int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次出现处的索引。
* lastIndexOf
* String substring(int start):从指定位置开始截取字符串,默认到末尾。
* String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60package com.weiyigeek;
public class StringIndexSub {
public static void main(String[] args) {
//示例1.字符串长度length()其实是获取每一个字符的个数,不管中英文
String s1 = "WeiyiGeek";
String s2 = "我是一名java开发者";
System.out.println("English Text is "+s1+", Length = " +s1.length());
System.out.println("Chinese Text is "+s2+", Length = " +s2.length());
//示例2.获取指定索引的字符或者记录字符出现的索引(+ 如果不加""默认是将字符解码成为ascii序号并进行相加)
System.out.println(s1.charAt(0)+""+s1.charAt(1)+""+s1.charAt(2)+""+s1.charAt(3)+""+s1.charAt(4));
System.out.println("Index : " + s2.indexOf('j')); //参数接收的是int类型,传递char类型会自动提升;
System.out.println("Index : " + s2.indexOf("java")); //如果不存在则返回 -1
System.out.println("Index : " + s2.indexOf("开发者",5)+"\n"); //指定位置开始从前向后找
System.out.println("lastIndex : " + s2.lastIndexOf('j')); //从后向前找第一次出现的字符串
System.out.println("lastIndex : " + s1.lastIndexOf("e", 7)); //从指定位置向前找(注意这里是指定的位置任然是从字符开头到结尾数)
System.out.println("lastIndex : " + s2.lastIndexOf("java",4)+"\n"); //从第4个位置进行查找匹配
//示例3.指定截取字符串
System.out.println("My Name is " + s1.substring(0, 5) + ", I am is " + s1.substring(5)); //指定位置截取到末尾
//关键点:注意字符串有些方法会在字符串上进行操作,有的不在字符串本身进行操作(substring)不会改变源字符串;
//示例4.字符串的遍历,通过for循环获取到字符串中每个字符的索引;
String Demo = "Hacker";
for(int i = 0; i < Demo.length(); i++)
{
System.out.println(Demo.charAt(i));
}
//实际案例
countNumber();
}
//统计字符串中大小写,字符串字符以及数字字符出现此时
public static void countNumber() {
String s = "abcdefABCDE123456!@#$%%^";
int cap = 0;
int small = 0;
int num = 0;
int other = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if( c >= 'a' && c <= 'z'){
small++;
}else if(c >= 'A' && c <= 'Z'){
cap++;
}else if(c >= '0' && c <= '9'){
num++;
}else {
other++;
}
}
System.out.println("大写字母个数: " + cap + ", 小写字母个数: " + small + ", 数字个数: " + num + ", 其他字符数量" + other);
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22English Text is WeiyiGeek, Length = 9
Chinese Text is 我是一名java开发者, Length = 11
Weiyi
Index : 4
Index : 4
Index : 8
lastIndex : 4
lastIndex : 7
lastIndex : 4
My Name is Weiyi, I am is Geek
H
a
c
k
e
r
大写字母个数: 5, 小写字母个数: 6, 数字个数: 6, 其他字符数量7
String类的转换功能1
2
3
4
5
6
7
8
9
10* byte[] getBytes():把字符串转换为字节数组。
* char[] toCharArray():把字符串转换为字符数组。
#注意:String类的valueOf方法可以把任意类型的数据转成字符串
* static String valueOf(char[] chs):把字符数组转成字符串。
* static String valueOf(int i):把int类型的数据转成字符串
* static String valueOf(Object obj): 返回 Object参数的字符串 Object形式。
* String toLowerCase():把字符串转成小写。
* String toUpperCase():把字符串转成大写。
* String concat(String str):把字符串拼接。 (重点)
注意事项:
1 | static String copyValueOf(char[] data) #相当于 valueOf(char[]) 。 |
基础案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66package com.weiyigeek;
public class StringConversion {
public static void main(String[] args) {
//示例1.探究字符串默认转换的码表,编码把我们看的懂转换为计算机看的懂的;
demo1();
//示例2.将字符串转换成为字符数组
demo2();
//示例3.将valueof任意类型的数据转换成为字符串
char[] arr4 = {'a','b','c'}; //底层都是采用 new String() 构造方法来进行的
String s = String.valueOf(arr4);
System.out.println("\n" + s + ", 整形转换成为字符串 : " + String.valueOf(1024));
//示例4.字符串的大小写转换并且进行拼接
String lower = "abcd";
String upper = "ABCD";
System.out.println("Lower -> Upper :" + lower.toUpperCase());
System.out.println("Upper -> Lower :" + upper.toLowerCase());
System.out.println("字符串拼接1:" + lower + upper); //任意字符串拼接
System.out.println("字符串拼接2:" + lower.concat(upper)); //只能字符串类型进行拼接
//示例5.非常值得学习 把一串字符串首字母转成大写,其余为小写。(只考虑英文大小写字母字符)
String ori = "iLOveStudyJavaPrograminG";
String dst = ori.substring(0, 1).toUpperCase().concat(ori.substring(1).toLowerCase()); //链式编程
System.out.println("示例5:" + dst);
}
public static void demo2() {
String s3 = "This";
char[] arr = s3.toCharArray();
System.out.println("\n字符串转换成为字符数组 ");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
public static void demo1() {
String s1 = "abc";
String s2 = "你好,JAVA";
System.out.println("英文字符:" + s1);
byte[] arr1 = s1.getBytes();
byte[] arr2 = s2.getBytes();
for(int i = 0; i < arr1.length; i++)
{
System.out.print(arr1[i] + " ");
}
System.out.println("\n中文字符:" + s2);
//gbk码表表示 一个中文代表两个字节 ,gbk码表特点中文的第一个字节肯定是负数
for(int i = 0; i < arr2.length; i++)
{
System.out.print(arr2[i] + " ");
}
//注意这里是统计的数组个数所以是length (特殊中文字符串)
System.out.println("\n特殊中文字符:琲");
byte[] arr3 = "琲".getBytes();
for( int i = 0; i < arr3.length; i++)
{
System.out.print(arr3[i] + " ");
}
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21英文字符:abc
97 98 99
中文字符:你好,JAVA
-60 -29 -70 -61 44 74 65 86 65
特殊中文字符:琲
-84 105
字符串转换成为字符数组
T h i s
abc, 整形转换成为字符串 : 1024
Lower -> Upper :ABCD
Upper -> Lower :abcd
字符串拼接1:abcdABCD
字符串拼接2:abcdABCD
示例5:Ilovestudyjavaprograming
String类的其他功能
1 | #字符串替换 |
注意事项:
10位UNICODE编码
再进行比较;基础案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33package com.weiyigeek;
public class StringReplace {
public static void main(String[] args) {
//示例1.字符串替换replace
String s = "I love Java Programing!";
String s1 = s.replace("o", "A");
String s2 = s.replace("Java", "PHP"); //如果没有找到替换字符则保留原字符串不改变;
System.out.println("o -> A : " + s1);
System.out.println("Java -> PHP : " + s2);
//示例2.除去字符串两边的空格
String s3 = " Weiyi Geek ";
String s4 = s3.trim();
System.out.println("两边 blank space 去除 : " + s4);
//示例3.比较两个字符串实际将ascii码进行比较相减,如果第一个字符相减为0则,第二个字符进行相减操作直到字符串末尾;
String s5 = "abc";
String s6 = "bcd";
int num = s5.compareTo(s6); //是按照码表值进行比较
System.out.println("s5 < s6 = " + num); // 97(a) - 98(b) = -1
//不区分大写比较
int num2 = "weiyigeek".compareToIgnoreCase("WeiyiGeek");
System.out.println("CompareToIgnoreCase 不区分大小写: " + num2);
//java默认是utf-8码表
int num1 = "唯".compareTo("一");
System.out.println('唯'+0);
System.out.println('一'+0);
System.out.println("unicode(唯) - unicode(一) = " + num1);
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11o -> A : I lAve Java PrAgraming!
Java -> PHP : I love PHP Programing!
两边 blank space 去除 : Weiyi Geek
s5 < s6 = -1
CompareToIgnoreCase 不区分大小写: 0
21807
19968
unicode(唯) - unicode(一) = 1839
描述:线程安全可变的字符序列,字符串缓冲区就像一个String但可以修改(长度会随着字符串变长而变长)。1
2
3
4
5
6
7
8public final class StringBuffer //不能被继承
extends Object
implements Serializable, CharSequence
StringBuffer() #构造一个没有字符的字符串缓冲区,初始容量为16个字符。
StringBuffer(CharSequence seq) #构造一个包含与指定的相同字符的字符串缓冲区 它包含与指定CharSequence相同的字符
StringBuffer(int capacity) #构造一个没有字符的字符串缓冲区和指定的初始容量。
StringBuffer(String str) #构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer获取长度的方法:
StringBuffer两个添加方法:append 和 insert 方法;
StringBuffer的删除功能:
StringBuffer的替换反转功能:
StringBuffer的截取功能:
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62/**
* @Filename: Demo1_StringBufeer.java
* @Author: WeiyiGeek
* @Function:
* @CreateTime: 下午10:12:22
*/
package com.weiyigeek.stringbuffer;
public class Demo1_StringBufeer {
public static void main(String[] args) {
//示例1.StringBuffer的三种构造方法
StringBuffer sb1 = new StringBuffer();
System.out.println("空参构造 理论长度 : "+sb1.capacity() +", 实际长度 : "+sb1.length());
StringBuffer sb2 = new StringBuffer(10); //设置一个缓冲区初始量
System.out.println("有参构造 理论长度 : "+sb2.capacity() +", 实际长度 : "+sb2.length());
StringBuffer sb3 = new StringBuffer("Java");
System.out.println("有参构造 理论长度 : "+sb3.capacity() +", 实际长度 : "+sb3.length()); //capacity() = 初始量(16) + 字符串长度(4)
//示例2.StringBuffer的增加字符串
StringBuffer sb4 = new StringBuffer();
StringBuffer sb5 = sb4.append(true);
StringBuffer sb6 = sb4.append("WeiyiGeek");
//后面的多个引用其实指向同一个对象,并且该类中重写了toString方法
System.out.println("append方法 理论长度 : "+sb5.capacity() +", 实际长度 : "+sb5.length() + ", 值为 " + sb5.toString()); //capacity() = 初始量(16) + 字符串长度(4)
System.out.println("append方法 理论长度 : "+sb6.capacity() +", 实际长度 : "+sb6.length() + ", 值为 " + sb6.toString()); //capacity() = 初始量(16) + 字符串长度(4)
//示例3.StringBuffer的指定位置添加字符元素
StringBuffer sb7 = new StringBuffer("Iloveprogramming!"); //注意这里缓冲区初始量是 16 + 17个字符 = 33
sb7.insert(5, "java"); //索引是从0开始,在指定位置添加字符串元素,如果没有指定位置的索引便会报索引越界异常;
System.out.println("insert方法 理论长度 : "+sb7.capacity() +", 实际长度 : "+sb7.length() + ", 值为 " + sb7.toString()); //capacity() = 初始量(16) + 字符串长度(4)
//示例4.StringBuffer删除功能
sb7.deleteCharAt(16); //删除sb7字符串中的一个m
System.out.println("deleteCharAt 方 法 : " + sb7);
sb7.delete(0, 5); //删除字符Ilove,删除时候是包含头但不包含尾0~5
System.out.println("delete 方法 : " + sb7);
sb7.delete(0,sb7.length()); //清空缓存区
System.out.println("delete 方法 理论长度 : "+sb7.capacity() +", 实际长度 : "+sb7.length() + ", 值为 空" + sb7.toString()); //capacity() = 初始量(16) + 字符串长度(4)
sb7 = new StringBuffer(); //不要用,原来的变成垃圾浪费内存
System.out.println("[不推荐这种方式清空缓冲区]理论长度 : "+sb7.capacity() +", 实际长度 : "+sb7.length());
//示例5.StringBuffer的替换与反转功能
StringBuffer sb8 = new StringBuffer("My Name is Weiyi");
sb8.replace(sb8.length()-5, sb8.length(), "Geek");
System.out.println("replace 方法: " + sb8.toString());
System.out.println("reverse 方法: " + sb8.reverse());
//实例6.StringBuffer字符串截取功能呢
StringBuffer sb9 = new StringBuffer("I'am weiyigeek!");
String subdemo1 = sb9.substring(5); //截取从第六个字符到末尾
String subdemo2 = sb9.substring(5,10); //截取从第6个字符开始截取直到底十的字符结束;
System.out.println("SubDemo1 = " + subdemo1 + ", SubDemo2 = " + subdemo2);
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18空参构造 理论长度 : 16, 实际长度 : 0
有参构造 理论长度 : 10, 实际长度 : 0
有参构造 理论长度 : 20, 实际长度 : 4
append方法 理论长度 : 16, 实际长度 : 13, 值为 trueWeiyiGeek
append方法 理论长度 : 16, 实际长度 : 13, 值为 trueWeiyiGeek
insert方法 理论长度 : 33, 实际长度 : 21, 值为 Ilovejavaprogramming!
deleteCharAt 方 法 : Ilovejavaprograming!
delete 方法 : javaprograming!
delete 方法 理论长度 : 33, 实际长度 : 0, 值为 空
[不推荐这种方式清空缓冲区]理论长度 : 16, 实际长度 : 0
replace 方法: My Name is Geek
reverse 方法: keeG si emaN yM
SubDemo1 = weiyigeek!, SubDemo2 = weiyi
描述:StringBuffer与String类的区别?
StringBuffer与String进行转换:
String和Stringbuffer分别作为参数传递问题;
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41package com.weiyigeek.stringbuffer;
public class Demo2_StringBuffer {
public static void main(String[] args) {
//实例1.StringBuffer类与String类相互转换
//String -> StringBuffer对象 : 通过构造方法 或者 append() 方法;
StringBuffer sb1 = new StringBuffer("initialize 初始化"); //通过String对象转换成为StringBuffer对象;
StringBuffer sb2 = new StringBuffer();
sb2.append("initialize append");
System.out.println("方法1 : " + sb1);
System.out.println("方法2 : " + sb2);
//StringBuferr -> String : 通过构造方法 或者 toString() 方法 或者 subString(0, length)
String s1 = new String(sb1);
String s2 = sb1.toString();
String s3 = sb1.substring(0, 10);
System.out.println("方法1 = " + s1);
System.out.println("方法2 = " + s2);
System.out.println("方法3 = " + s3);
//实例2.String和Stringbuffer分别作为参数传递问题
String s4 = "String parma";
System.out.println("源字符串 : " + s4);
changeStr(s4); //一弹栈就内部的s4就变成了垃圾,也由于String一旦初始化将不会被改变(类似于C中的局部变量)
System.out.println("changeStr 方法外: " + s4);
StringBuffer sb3 = new StringBuffer(); //两个引用指向同一个对象(类似于C指针);
sb3.append("append 1");
System.out.println("第一次引用 : " + sb3);
changeStrBuf(sb3);
System.out.println("第二次引用(经过changeStrBuf) : " + sb3);
}
private static void changeStrBuf(StringBuffer sb3) {
sb3.append(",append 2");
}
private static void changeStr(String s4) {
s4 += "add";
System.out.println("changeStr 方法内 : " + s4);
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12方法1 : initialize 初始化
方法2 : initialize append
方法1 = initialize 初始化
方法2 = initialize 初始化
方法3 = initialize
源字符串 : String parma
changeStr 方法内 : String parmaadd
changeStr 方法外: String parma
第一次引用 : append 1
第二次引用(经过changeStrBuf) : append 1,append 2
注意事项:
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61package com.weiyigeek.stringbuffer;
import java.util.Scanner;
public class Demo3_Stringbuffer {
public static void main(String[] args) {
//实例1. 利用StringBuffer将数组转换成为字符串; "[1,2,3]"形式
int[] arr = {1,2,3};
System.out.println(arrayToString(arr));
//实例2.键盘录入反转
Scanner sc = new Scanner(System.in); //创建一个键盘录入对象
System.out.print("请输入一串字符: ");
String line = sc.nextLine(); //将键盘录入的字符串存储到line中
StringBuffer sb = reverseStr(line);
System.out.println("缓存区的内容反转 : " + sb);
//实例3.反转字符串数组并输出特定格式
String[] arr1 = {"Study","Java","Programming"};
System.out.println(changeStrReverse(arr1));
}
//实例1.抽取方法
private static String arrayToString(int[] arr) {
StringBuffer sb1 = new StringBuffer(); //创建缓冲区对象(节省内存-不需要重复的申请对象提高效率)
sb1.append("[");
for(int i = 0; i < arr.length; i++) //遍历数组
{
if( i == arr.length-1 ){
sb1.append(arr[i]).append("]"); //[推荐形式]
}else {
sb1.append(arr[i] + ","); //只有这种形式不推荐(底层还是new string然后toString()),所以还是建议采用append的方法
}
}
return sb1.toString();
}
//实例2.抽取方法
public static StringBuffer reverseStr(String line) {
StringBuffer sb = new StringBuffer(line); //重点,将输入的字符串放入缓存区之中
sb.reverse(); //注意操作是sb对象本身
return sb;
}
//实例3. 抽取方法 (这里返回方法采用StringBuffer减少一次String对象申请)
private static StringBuffer changeStrReverse(String[] arr1) {
StringBuffer sb2 = new StringBuffer();
sb2.append("{");
for (int i = 0; i < arr1.length; i++) {
if( i == arr1.length - 1)
{
sb2.append(reverseStr(arr1[i])).append("}");
}else {
sb2.append(reverseStr(arr1[i])).append(",");
}
}
return sb2;
}
}
执行结果:1
2
3
4[1,2,3]
请输入一串字符: Whoami
缓存区的内容反转 : imaohW
{ydutS,avaJ,gnimmargorP}
描述: 一个可变的字符序列。 此类提供与StringBuffer的API,但不保证同步。
此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况);在可能的情况下,建议使用这个类别优先于StringBuffer ,因为它在大多数实现中将更快;
StringBuilder的主要StringBuilder是append和insert方法
,它们是重载的以便接受任何类型的数据
(参数类型不一致);1
2
3
4#类结构
public final class StringBuilder
extends Object
implements Serializable, CharSequence
问:String,StringBuffer与StringBuilder的区别
描述:说到数组类的使用不得说关于数组相关的排序算法,这可是编程中的灵魂;
该类包含用于操作数组的各种方法(如排序和搜索)。 该类还包含一个静态工厂可以将数组视为列表。1
2public class Arrays
extends Object
数组高级之冒泡排序
描述:轻的上浮,沉的下降;两个相邻位置比较如果前面的元素大于后面的元素则交互位置;
数组高级之选择排序
描述:用一个索引位置上的元素,依次与其他索引位置上的元素比较小在前面(右) ,大的在后面(左) - 与冒泡排序位置相反
数组高级之二分查找法
描述:二分查找前提必须是有序的
,二分查找 查找元素对应的索引;
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69package com.weiyigeek.array;
public class Demo1_ArrayMaopao {
public static void main(String[] args) {
//实例1. 冒泡排序(相邻元素比较)
int[] arr = {45,12,89,75,65,17};
for (int i = 0; i < arr.length - 1; i++) { //外循环只需要比较arr.length-1
for(int j = 0; j < arr.length - 1 - i; j++) { // -1为了防止数组越界产生异常, -i 为了提高效率;
if(arr[j] > arr[j+1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp; //拿取最大值向左边走
}
}
}
extracted("冒泡算法 :",arr);
//实例2. 选择排序
int[] arr1 = {45,12,89,75,65,17};
for (int i = 0; i < arr1.length - 1; i++) { //循环5次
for(int j = i + 1; j < arr1.length; j++) //从 i + 1 次开始
{
if(arr1[i] > arr1[j])
{
int temp = arr1[i]; //将大值存放在temp
arr1[i] = arr1[j]; //循环遍历过滤出最小的
arr1[j] = temp; //将temp给当前[j]
}
}
}
extracted("\n选择排序:", arr1);
//实例3.二分查找
int res = binarySearch(arr1,45);
if(res != -1) {
System.out.println("\n二分查找:\n已经找到该值 : " + arr1[res]+", Index = "+res);
}else {
System.out.println("未找到您要查询的值!");
}
}
private static int binarySearch(int[] arr1, int i) {
int min = 0;
int max = arr1.length - 1;
int mid = (max - min) / 2;
//判断mid索引在数组值是否等于i
while(arr1[mid] != i) {
if(arr1[mid] < i) { //如果当然mid索引值 小于 查找的值 则 最小值 = mid+1;下次就从mid+1处理开始
min = mid + 1;
}else if(arr1[mid] > i) {
max = mid - 1;
}
if( min > max ) {
return -1;
}
mid = (max - min) /2;
}
return mid;
}
//公共方法(输出数组各个元素值)
public static void extracted(String name,int[] arr) {
System.out.println(name);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
执行结果:1
2
3
4
5
6
7
8冒泡算法 :
12 17 45 65 75 89
选择排序:
12 17 45 65 75 89
二分查找:
已经找到该值 : 45, Index = 2
描述:Arrays常用的以下方法可以处理上面我们的问题示例;
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25import java.util.Arrays;
public class Demo2_ArrayMethod {
public static void main(String[] args) {
//示例1.Arrays类中的toString
int[] arr1 = {20,19,17,1,5,9,95};
System.out.println("示例1 : " + Arrays.toString(arr1));
//示例2.Arrays类中的sort排序
Arrays.sort(arr1);
System.out.println("示例2 : " + Arrays.toString(arr1)); //重点这里输出是采用Arrays.方法
//示例3.Arrays类中的二分法
System.out.println("示例3 : Index = " + Arrays.binarySearch(arr1, 19));
System.out.println("示例3 : Index = " + Arrays.binarySearch(arr1, 2019)); //由于2019大于arr1数组中所有元素则排在索引为7的地方; -(7+1) 及 -插入点 -1
}
}
//执行结果:
示例1 : [20, 19, 17, 1, 5, 9, 95]
示例2 : [1, 5, 9, 17, 19, 20, 95]
示例3 : Index = 4
示例3 : Index = -8
Arrays工具类的asList()方法的使用
描述: Collection中toArray(T[] a)泛型版的集合转数组,而asList()将数组转成集合;1
2
3
4
5
6#加入了泛型
java.util.Arrays
static <T> List<T> asList(T... a) #返回由指定数组支持的一个固定大小的列表。
#java.util
<T> T[] toArray(T[] a) #返回包含此集合中所有元素的数组;返回数组的运行时类型是指定的数组的运行时类型
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Demo2_CollectionAsList {
public static void main(String[] args) {
//Arrays工具类的asList()方法的使用
//实例1.数组转成集合(虽然不能可以增加或者删除元素,但是可以利用集合的思想操作数组),
//也就是说使用其他集合的方法
String[] arr = {"a","b","c","d"};
List<String> list = Arrays.asList(arr);
System.out.println(arr + " " + list);
//list.add("不能添加")
//示例2.整形数组转换成为集合
int[] arr1 = {11,222,333}; //基本数据类型
List<int[]> list1 = Arrays.asList(arr1); //基本数据类型的数组转换成为集合.会将整改数组当做一个对象
System.out.println(list1); //返回的是一个地址
//重点
Integer[] arr2 = {11,22,344}; //引用数据类型(数组转集合)
List<Integer> list2 = Arrays.asList(arr2);
System.out.println(arr2 + " " + list2);
//示例3.泛型集合转数组
ArrayList<String> list3 = new ArrayList<String>();
list3.add("demo");
list3.add("YES");
list3.add("this");
String[] arr3 = list3.toArray(new String[0]); //new String[0]当集合转化成数组时候,数组的长度小于等于集合的size,转换后的数组长度等于集合
//new String[10]如果数组长度大于了size,匹配的数组就和您设置长度一致,不存在的以null补齐
for (String param : arr3) {
System.out.print(param + " ");
}
}
}
//#执行结果
[Ljava.lang.String;@15db9742 [a, b, c, d]
[[I@6d06d69c]
[Ljava.lang.Integer;@7852e922 [11, 22, 344]
demo YES this
描述:将基本数据类型封装成为对象的好处,可以在对象中定义更多的功能方法操作该数据;
常见的操作就是用于基本数据类型之间的转换(进制转换/字符串之间的转换);
基本数据类型和引用数据类型包装类对应表:1
2
3
4
5
6
7
8
9基本数据类型 引用数据类型(包名称)
byte Byte
short Short
int Integer #比较特殊
long Long
float Float
double Double
char Character #比较特殊
boolean Boolean
下面以Integer为例来进行学习,其他的基本数据类型与包装类都差不多;
描述:Integer类包装一个对象中的原始类型int的值。 类型为Integer的对象包含一个单一字段其类型为int ;提供了一些将int转换为String和String转换为int,以及在处理int时有用的其他常量和方法1
2
3
4
5
6
7
8
9
10public final class Integer
extends Number
implements Comparable<Integer>
//自带常量值
static int BYTES 用于表示二进制补码二进制形式的 int值的字节数。
static int MAX_VALUE 一个持有最大值一个 int可以有2^31 -1。
static int MIN_VALUE 的常量保持的最小值的 int可以具有,-(2 ^31)。
static int SIZE 用于表示二进制补码二进制形式的 int值的位数。
static 类<Integer> TYPE 类原始类型 int的 类实例。
Integer类构造方法:
Integer类常用方法:
Inter类型与String相互转换:
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55package com.weiyigeek.integer;
import java.util.Arrays;
public class Demo2_Integer {
public static void main(String[] args) {
//实例1.Integer类的构造方法以及常量
System.out.println("int 类型 Max : " + Integer.MAX_VALUE);
System.out.println("int 类型 Min : " + Integer.MIN_VALUE);
Integer it1 = new Integer(100);
Integer it2 = new Integer("100"); //数字字符串转换成为整形
Integer it3 = new Integer('a'); //注意:这里可以将单个字符转成码表对应的十进制值(但是字符串是不行的比如"abc")
System.out.println(it1);
System.out.println(it2);
System.out.println(it3);
//实例2.Integer类的一些方法(实现十进制转成其他进制)
int src = 255;
System.out.println(src + " -> Binary : " + Integer.toBinaryString(src)); //二进制
System.out.println(src + " -> Octal : " + Integer.toOctalString(src)); //八进制
System.out.println(src + " -> Hex : " + Integer.toHexString(src)); //十六进制
//实例3.int与String之间的相互转换
//整数转成字符串类型
int num = 1024;
String s1 = num + ""; //method1 (推荐)
String s2 = String.valueOf(num); //method2 (推荐)
Integer num2 = new Integer(num);
String s3 = num2.toString();
String s4 = Integer.toString(1024);
System.out.println("四种int 转成 字符串 的 静态方法 :" + s1 + ", " + s2 + ", " + s3 + ", " + s4);
//字符串转成整数
String s5 = "1024";
Integer num3 = new Integer(s5);
int num4 = num3.intValue();
int num5 = Integer.parseInt(s5); // 推荐方法
System.out.println("字符串转换成为整形:");
System.out.print(num4);
System.out.println(num5);
//实例3.ParseXXX的方法,可以将这七种字符串表现形式转换成为基本数据类型;
Boolean b = Boolean.parseBoolean("true");
System.out.println(b);
}
}
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16int 类型 Max : 2147483647
int 类型 Min : -2147483648
100
100
97
255 -> Binary : 11111111
255 -> Octal : 377
255 -> Hex : ff
四种int 转成 字符串 的 静态方法 :1024, 1024, 1024, 1024
字符串转换成为整形:
1024 1024
true
补充知识:
超过了该范围便会重新创建该对象
;基础实例演示:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66//实例1.JDK5的新特性(面试题会问)
System.out.println("JDK 新特殊 : 自动装箱与拆箱");
//1.5 之前
int x = 1024;
Integer i1 = new Integer(x); //将基本数据类型 包装成为 对象 -> 装箱
int y = i1.intValue(); //将对象 转换成为 基本数据类型 -> 拆箱
//1.5版本之后
Integer i2 = 1024; // 自动装箱(把基本数据类型转换成为对象) - 其实底层还是上面的操作;
int z = i2 + 200; // 自动拆箱(把对象转换成为基本数据类型)
System.out.println(i2 + ", " + z);
//注意Integer 调用intValue但是如果值为null,null调用方法就会出现异常
// Integer i3 = null;
// int a = i3 + 100;
// System.out.println(a); //调用会导致空指针异常 java.lang.NULLPointerException
//面试题 自动装箱拆箱的特性
int number1 = 1024;
int number2 = 1024;
Integer int1 = new Integer(number1);
Integer int2 = new Integer(number2);
System.out.println(int1 == int2); //对象地址之间的比较
System.out.println(int1.equals(int2)); //对象之间的比较
System.out.println("#-----------------------------------------#");
Integer int3 = new Integer(512);
Integer int4 = new Integer(512);
System.out.println(int3 == int4);
System.out.println(int3.equals(int4));
System.out.println("#-----------------------------------------#");
//特殊点来了(如果取值范围在bytes中 -127 ~ 128,将直接从常量中取)
Integer int5 = 97;
Integer int6 = 97;
System.out.println(int5 == int6);
System.out.println(int5.equals(int6));
System.out.println("#-----------------------------------------#");
Integer int7 = 197;
Integer int8 = 197;
System.out.println(int7 == int8);
System.out.println(int7.equals(int8));
System.out.println("#-----------------------------------------#");
//执行结果:
JDK 新特殊 : 自动装箱与拆箱
1024, 1224
false
true
#-----------------------------------------#
false
true
#-----------------------------------------#
//特殊点(-127 ~ 128)
true
true
#-----------------------------------------#
false
true
#-----------------------------------------#
描述: Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数;里面的方法都是静态不用去new Math使用直接类名.方法名称;1
2
3
4
5
6
7#lang包里
java.lang.Object
java.lang.Math
#语法结构
public final class Math
extends Object
常用方法和静态属性:1
2
3
4
5
6
7
8
9
10
11
12#属性
public static final double E #double值比任何其他的努尔紧密,自然对数的基础。
public static final double PI # double值比其他任何接近零圆周率,圆周和直径的比值。
#部分方法
* public static int abs(int a) #对a取绝对值
* public static double ceil(double a) #向上取值 天花板
* public static double floor(double a) #向下取值 地板
* public static int round(float a) #参数为double的自学
* public static int max(int a,int b) #min自学取最小值
* public static double pow(double a,double b) #求幂次方
* public static double random() #随机数 0~1
* public static double sqrt(double a) #求平方根
基础案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23//示例1.常量值
System.out.println("自然对数 : " + Math.E);
System.out.println("圆周率 : " + Math.PI);
//示例2.常用方法
System.out.println(" -2 的绝对值 : " + Math.abs(-2));
System.out.println(" -2 .0的绝对值 : " + Math.abs(-2.0));
System.out.println("向上取整" + Math.ceil(12.3));
System.out.println("向上取整" + Math.ceil(12.99));
System.out.println("向下取整" + Math.floor(12.3));
System.out.println("向上取整" + Math.floor(12.99));
System.out.println("四舍五入 " + Math.round(12.30));
System.out.println("四舍五入 " + Math.round(12.50));
System.out.println("5 8 最大值 = " + Math.max(5, 8));
System.out.println("5 8 最大值 = " + Math.min(5, 8));
System.out.println("2^16 = " + Math.pow(2,16));
System.out.println("随机数 = " + Math.random());
执行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18自然对数 : 2.718281828459045
圆周率 : 3.141592653589793
-2 的绝对值 : 2
-2 .0的绝对值 : 2.0
向上取整13.0
向上取整13.0
向下取整12.0
向上取整12.0
四舍五入 12
四舍五入 13
5 8 最大值 = 8
5 8 最大值 = 5
2^16 = 65536.0
随机数 = 0.511862521199665
描述: 这个类的一个实例是用于生成伪随机数流。该类使用一个48位的种子,这是使用线性同余公式的修正。
此类用于产生随机数如果用相同的随机数种子
创建两个 Random 实例,对每个实例进行相同的方法调用序列,它们将生成并返回相同的
数字序列。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18//#包
java.util.Random
//#基础语法结构
public class Random
extends Object
implements Serializable
//#构造方法
public Random() //#创建一个新的随机数发生器。此构造函数将随机数发生器的种子设置为一个非常有可能与此) 纳米值构造函数的任何其他调用不同的值。 内部取值System.nanoTime(
public Random(long seed) //#使用一个单一的 long种子创造了一种新的随机数发生器。种子的伪随机数发生器的方法 next(int)保持内部状态的初始值。 相同的种子生成的随机数是一致的;与调用new Random(seed)是等价的:
protected int next(int bits) //#生成下一个随机数。
int nextInt() //#返回下一个伪随机、均匀分布的 int价值从这个随机数生成器的序列。
int nextInt(int bound) //#返回一个随机、均匀分布的 int值在0(含)和指定值(独家),从这个随机数发生器的顺序绘制。值为0<=n<bound
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29package com.weiyigeek.random;
import java.util.Random;
public class Demo1_Random {
public static void main(String[] args) {
//示例1.Random类的使用
//方式1:伪随机数底层种子默认采用系统当前时间的纳秒
Random ra = new Random();
System.out.println("伪随机 = " + ra.nextInt());
System.out.println("伪随机 = " + ra.nextInt());
//方式2
System.out.println("相同的seed种子数,生成的随机数是一致的:");
Random r = new Random(1024); //调用new Random(seed)与r.setSeed(seed)是等价的:
System.out.println(r.nextInt());
System.out.println(r.nextInt());
//方式3
Random r1 = new Random();
r1.setSeed(1024);
System.out.println(r1.nextInt());
System.out.println(r1.nextInt());
//示例2.生成一个范围内的随机数
Random r2 = new Random();
for (int i = 0; i < 10; i++) {
System.out.print(r.nextInt(100) + " "); //生成十次 0 ~ 99 的随机数(注意这里不是100)
}
}
}
执行结果:1
2
3
4
5
6
7
8
9
10伪随机 = 1656751839
伪随机 = 112905377
相同的seed种子数,生成的随机数是一致的:
-1549467450
1376243983
-1549467450
1376243983
87 33 98 93 9 43 61 69 68 9
描述: 由System类提供的设施包括标准输入、标准输出和错误输出流;访问外部定义的属性和环境变量;加载文件和库的方法;和一种快速复制数组的一部分的实用方法。
注意事项:由于它私有了它的构造方法所以不能采用new System申请对象的形式(即它不能被实例化);
1 | #基础格式 |
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48package com.weiyigeek.system;
public class Demo1_System {
public static void main(String[] args) {
//示例1.垃圾回收机制(需要用到Object中的)
//protected void finalize()throws Throwable 当垃圾收集确定没有对对象的引用时,由对象上的垃圾收集器调用。
//子类重写 finalize方法配置系统资源或执行其他清理。
for (int i = 0; i < 5; i++) {
System.out.print(i);
new GcDemo();
System.gc(); //运行垃圾回收机制(当数量达到一定限制的时候)
}
//示例2.当前系统时间(毫秒数) 从 1970年1月1日开始
long startTime = System.currentTimeMillis();
for (int i = 0; i < 100; i++) {
System.out.print(i + " ");
}
long endTime = System.currentTimeMillis();
System.out.println("\n循环花费的毫秒数 = " + (endTime - startTime));
//示例3.直接Arraycopy复制拼接目标数组
int[] arr1 = {18,2017,2019,7,1,9};
int[] arr2 = new int[5+arr1.length];
arr2[1] = 1;
arr2[4] = 4;
System.arraycopy(arr1, 0, arr2, 5, arr1.length);
for (int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
//示例4
System.exit(0); //正常的退出java
}
}
//注意:一个java文件中只有一个public 公共类
class GcDemo {
public int count = 0;
@Override
public void finalize() throws Throwable {
count++;
System.out.println(" - 垃圾正在被回收!");
//super.finalize();
}
}
执行结果:1
2
3
4
5
6
7
8
9
10012 - 垃圾正在被回收!
3 - 垃圾正在被回收!
4 - 垃圾正在被回收!
- 垃圾正在被回收!
0 - 垃圾正在被回收!
1 ~ ~ ~ 99
循环花费的毫秒数 = 2
0 1 0 0 4 18 2017 2019 7 1 9
注意事项:
描述:可以让超过Integer范围内的数据进行运算;可变的任意精度整数,BigInteger提供类似java的所有原始的整数商,从java.lang.math所有相关的方法。此外BigInteger提供操作的模运算,GCD计算,素性测试,原代、位操作,和其他一些杂项作业。
1 | #包 |
常用方法描述:1
2
3
4
5
6
7
8
9#构造方法
public BigInteger(String val) #翻译BigInteger的十进制字符串表示为BigInteger。
#成员方法
* public BigInteger add(BigInteger val) #//加
* public BigInteger subtract(BigInteger val) # //减
* public BigInteger multiply(BigInteger val) # //乘
* public BigInteger divide(BigInteger val) #//除法
* public BigInteger[] divideAndRemainder(BigInteger val) #//将除法所得 与取模所得 放入数组之中
基础示例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27package com.weiyigeek.bigInteger;
import java.math.BigInteger;
public class Demo1_BigInteger {
public static void main(String[] args) {
//示例1.将比long大的字符串转换成为可被计算的整形
String val = new String("3141592600000000000");
BigInteger bi = new BigInteger(val);
System.out.println(bi);
//示例2.大整数计算(注意会生成新值不会再远值上改变)
BigInteger bi1 = new BigInteger("256");
BigInteger bi2 = new BigInteger("2");
BigInteger[] bi3 = bi1.divideAndRemainder(bi2);
System.out.println("add = " + bi1.add(bi2)); //加
System.out.println("subtract = " + bi1.subtract(bi2)); //减
System.out.println("multiply = " + bi1.multiply(bi2)); //乘
System.out.println("divide = " + bi1.divide(bi2)); //除
System.out.println("div = " + bi3[0] + ", Remainder = " + bi3[1]);
}
}
//###执行结果######
3141592600000000000
add = 258
subtract = 254
multiply = 512
divide = 128
div = 128, Remainder = 0
描述:该类出现为了更加精确的处理小数部分,由于在运算的时候,float类型和double很容易丢失精度,所以为了能精确的表示、计算浮点数,Java提供了BigDecimal不可变的、任意精度的有符号十进制数。
BigDecimal类的算术,尺度操纵,圆、比较、散列提供的操作,和格式转换。的toString()方法提供的一个典型代表,一个BigDecimal。
1 | #包 |
基本案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23package com.weiyigeek.BigDecimal;
import java.math.BigDecimal;
public class Demo1_BigDecimal {
public static void main(String[] args) {
//示例1.BigDecimal 精确计算的几种方法
BigDecimal bd1 = new BigDecimal(2.0); //方式1 传入double类型参数
BigDecimal bd2 = new BigDecimal(1.1);
System.out.println("Demo1 - 开发中不推荐此种方式 2.0 - 1.1 = " + bd1.subtract(bd2));
BigDecimal bd3 = new BigDecimal("2.0"); //方式2 传入字符串的方式
BigDecimal bd4 = new BigDecimal("1.1");
System.out.println("Demo2 - 通过构造中传入字符串的方式 开发时候推荐 2.0 - 1.1 = " +bd3.subtract(bd4));
BigDecimal bd5 = BigDecimal.valueOf(2.0); //方式3
BigDecimal bd6 = BigDecimal.valueOf(1.1);
System.out.println("Demo3 - 在开发中也是推荐的 2.0 - 1.1 = " + bd5.subtract(bd6));
System.out.println(bd5.add(bd6));
System.out.println(bd5.multiply(bd6));
System.out.println(bd5.divide(bd6,1)); //注意除法 有其他参数
}
}
执行结果:1
2
3
4
5
6
7
8
9Demo1 - 开发中不推荐此种方式 2.0 - 1.1 = 0.899999999999999911182158029987476766109466552734375
Demo2 - 通过构造中传入字符串的方式 开发时候推荐 2.0 - 1.1 = 0.9
Demo3 - 在开发中也是推荐的 2.0 - 1.1 = 0.9
3.1
2.20
1.8
描述:类 Date 表示特定的瞬间,精确到毫秒。里面大多方法都失效了我只关注没有没替代的;
1 | #包 |
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21package com.weiyigeek.Date;
import java.util.Date;
public class Demo_Date {
public static void main(String[] args) {
//示例1.
Date d1 = new Date(); //没有传入参数代表的是当前时间
System.out.println("当前时间 = " + d1);
Date d2 = new Date(0); //代表的是1970年1月1日,通过毫秒值创建时间对象
System.out.println("格林GMT起始时间 = " + d2); //需要注意时区的影响
//示例2.
Date d3 = new Date();
System.out.println("通过时间对象获取当前毫秒值 :" + d3.getTime());
System.out.println("通过类方法获取当前毫秒值 :" + System.currentTimeMillis());
//示例3.设置毫秒值改变时间对象 从1970年一月一日开始 (与示例 d2 有一定的关联)
Date d4 = new Date();
d4.setTime(1000);
System.out.println("与示例 d2 有一定的关联" + d4);
}
}
执行结果:1
2
3
4
5当前时间 = Sun Aug 25 21:51:27 CST 2019
格林GMT起始时间 = Thu Jan 01 08:00:00 CST 1970
通过时间对象获取当前毫秒值 :1566741087306
通过类方法获取当前毫秒值 :1566741087306
与示例 d2 有一定的关联 : Thu Jan 01 08:00:01 CST 1970
注意事项:
java.util.Date
包下描述:DateFormat类是抽象类(无法直接new创建对象实例化),所以使用其子类SimpleDateFormat; DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并解析日期或时间。
日期时间格式的子类SimpleDateFormat,允许的格式(例如,日期→文本),分析(文本→日期),和归一化。1
2
3
4
5
6
7
8
9
10
11
12#包
java.text.DateFormat
#语法结构
public abstract class DateFormat #DateFormat是一个抽象类的子类格式的日期/时间格式化和解析日期或独立于语言的方式时间
extends Format
#构造与方法
protected Format() //唯一的构造函数。(用于调用子类构造函数,通常是隐式的。
public static final DateFormat getDateInstance() //#获取与默认格式样式为默认 FORMAT本地化的日期格式。
public static final DateFormat getDateInstance(int style) //#获取与给定的格式设置样式为默认 FORMAT本地化的日期格式。
//相当于调用getDateInstance(style, Locale.getDefault(Locale.Category.FORMAT))。
DateFormat子类:1
2
3
4
5
6
7
8
9
10
11
12
13#包
java.text.SimpleDateFormat
#语法结构
public class SimpleDateFormat
extends DateFormat
//#SimpleDateFormat构造方法
public SimpleDateFormat()
public SimpleDateFormat(String)
//#子类方法
public final String format(Date date); //格式化日期转换成为字符串显示
public Date parse(String source); //字符串日期解析为日期对象
下面的例子显示的日期和时间模式1
2
3
4
5
6
7
8
9
10
11
12Date and Time Pattern Result
"yyyy.MM.dd G 'at' HH:mm:ss z" 2001.07.04 AD at 12:08:56 PDT
"EEE, MMM d, ''yy" Wed, Jul 4, '01
"h:mm a" 12:08 PM
"hh 'o''clock' a, zzzz" 12 o'clock PM, Pacific Daylight Time
"K:mm a, z" 0:08 PM, PDT
"yyyyy.MMMMM.dd GGG hh:mm aaa" 02001.July.04 AD 12:08 PM
"EEE, d MMM yyyy HH:mm:ss Z" Wed, 4 Jul 2001 12:08:56 -0700
"yyMMddHHmmssZ" 010704120856-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ" 2001-07-04T12:08:56.235-0700
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
"YYYY-'W'ww-u" 2001-W27-3
实际案例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49//SimpleDateFormat类实现日期和字符串的相互转换
package com.weiyigeek.DateFormat;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Demo1_DateFormat {
public static void main(String[] args) throws ParseException {
//示例1
//DateFormat df = new DateFormat(); //注意 : DateFormat是抽象类不允许实例化
//态工厂方法之一:
DateFormat df1 = DateFormat.getDateInstance();//默认格式YYYY/MM/dd 相当于父类引用指向子类对象,右边的方法返回一个子类
System.out.println("示例1 " + df1.format(new Date()));
DateFormat df2 = new SimpleDateFormat(); //效果同上
//示例2
Date d = new Date(); //时间对象
SimpleDateFormat sdf = new SimpleDateFormat(); //创建日期格式化对象
System.out.println("当前时间默认格式化: " + sdf.format(d)); //将日期转换字符串
//自定义输出格式
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH:mm:ss");
System.out.println("当前时间自定义格式化: " + sdf1.format(d));
//示例3
String str = "2019 年 08 月 25 日 22:09:25"; //将时间字符串转换成日期对象
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH:mm:ss");
Date d1 = sdf2.parse(str);
System.out.println("转换结果 : " + d1);
//示例4:生日当前时间生活了多少天
String birthDay = "1995年01月10日";
String currentDay = "2019年08月25日";
//定义日期格式化对象
SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy年mm月dd日");
//将日期字符串转换成为日期对象
Date bir = sdf3.parse(birthDay);
Date cur = sdf3.parse(currentDay);
//通过日期对象获取时间毫秒值
long res = cur.getTime() - bir.getTime();
//之间差毫秒值除以1天的毫秒值 1000 / 3600 / 24
System.out.println("我已经生活了 " + (res / 1000 / 3600 / 24) + " 天");
}
}
执行结果:1
2
3
4当前时间默认格式化: 19-8-25 下午10:35
当前时间自定义格式化: 2019 年 08 月 25 日 22:35:18
转换结果 : Sun Aug 25 22:09:25 CST 2019
我已经生活了 8781 天
描述Calendar类的概述是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。
1 | //包 |
基础实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63//Calendar类的概述和获取日期的方法
package com.weiyigeek.calendar;
import java.util.Calendar;
import java.util.Scanner;
public class Demo_Calendar {
public static void main(String[] args) {
// 实例1.Calendar使用
Calendar c = Calendar.getInstance();
System.out.println("当前详细时间 : " + c);
//获取指定的年月日周
System.out.println(c.get(Calendar.YEAR)); //字段静态成员年
System.out.println(c.get(Calendar.MONTH)+1); //字段获取月主要是从年开始 (注意是从0开始的)
System.out.println(c.get(Calendar.DAY_OF_MONTH)); //月中的的第几天
System.out.println(c.get(Calendar.DAY_OF_WEEK)); //周中第几天 周日是第一天,周六是最后一天
//实例2.获取当前星期几
System.out.println(getWeek(c.get(Calendar.DAY_OF_WEEK)));
//实例3.个数前进行补0
System.out.println("当前月中的天数 : " + getDay(c.get(Calendar.DAY_OF_MONTH)));
//实例4.常用方法
Calendar c1 = Calendar.getInstance(); //父类引用指向子类对象
c1.add(Calendar.YEAR, -1); //当前年份-1; 我们可以对字段进行向前减或者向后加 2018
c1.set(Calendar.DAY_OF_MONTH,29); // 设置当前月中的天数为29号
System.out.println(c1.get(Calendar.YEAR) + "年" + (c1.get(Calendar.MONTH)+1) +"月" +c1.get(Calendar.DAY_OF_MONTH)+"日");
//实例5.平年闰年判断
System.out.print("请输入一个年份判断是闰年还是平年: ");
Scanner sc = new Scanner(System.in);
String year = sc.nextLine();
int y = Integer.parseInt(year); //将数字字符串转换成为数字
Calendar c2 = Calendar.getInstance();
c2.set(y, 2, 1); //设置年3月1日
c2.add(Calendar.DAY_OF_MONTH, -1);
String flag = (c2.get(Calendar.DAY_OF_MONTH) == 29) ? "润年":"平年";
System.out.println(year+"年是"+flag);
}
private static String getWeek(int i) {
String[] week = {"","星期天","星期一","星期二","星期三","星期四","星期五","星期六"}; //注意这里week[0] 为空
return week[i];
}
private static String getDay(int i) {
return i > 9 ? "" + i:"0" + i; //非两位数补0
}
}
//#######执行结果############
当前详细时间 : java.util.GregorianCalendar[time=1566785857554,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Shanghai",offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2019,MONTH=7,WEEK_OF_YEAR=35,WEEK_OF_MONTH=5,DAY_OF_MONTH=26,DAY_OF_YEAR=238,DAY_OF_WEEK=2,DAY_OF_WEEK_IN_MONTH=4,AM_PM=0,HOUR=10,HOUR_OF_DAY=10,MINUTE=17,SECOND=37,MILLISECOND=554,ZONE_OFFSET=28800000,DST_OFFSET=0]
2019 8 26 2
星期一
当前月中的天数 : 26
2018年8月29日
请输入一个年份判断是闰年还是平年: 2088
2088年是润年
`
你好看友,欢迎关注博主微信公众号哟! ❤
这将是我持续更新文章的动力源泉,谢谢支持!(๑′ᴗ‵๑)
温馨提示: 未解锁的用户不能粘贴复制文章内容哟!
方式1.请访问本博主的B站【WeiyiGeek】首页关注UP主,
将自动随机获取解锁验证码。
Method 2.Please visit 【My Twitter】. There is an article verification code in the homepage.
方式3.扫一扫下方二维码,关注本站官方公众号
回复:验证码
将获取解锁(有效期7天)本站所有技术文章哟!
@WeiyiGeek - 为了能到远方,脚下的每一步都不能少
欢迎各位志同道合的朋友一起学习交流,如文章有误请在下方留下您宝贵的经验知识,个人邮箱地址【master#weiyigeek.top】
或者个人公众号【WeiyiGeek】
联系我。
更多文章来源于【WeiyiGeek Blog - 为了能到远方,脚下的每一步都不能少】, 个人首页地址( https://weiyigeek.top )
专栏书写不易,如果您觉得这个专栏还不错的,请给这篇专栏 【点个赞、投个币、收个藏、关个注、转个发、赞个助】,这将对我的肯定,我将持续整理发布更多优质原创文章!。
最后更新时间:
文章原始路径:_posts/编程世界/Java/JAVA入门学习五.md
转载注明出处,原文地址:https://blog.weiyigeek.top/2019/4-24-290.html
本站文章内容遵循 知识共享 署名 - 非商业性 - 相同方式共享 4.0 国际协议