本文最后更新于:December 14, 2021 pm
积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。
目录 本文着重说一下可能会用到的数据类型。
1.基本数据类型 Java的两大数据类型:内置数据类型、引用数据类型。
1.1 内置数据类型 八种基本类型。 六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
1.1.1 byte
byte数据类型是8位、有符号的,以二进制补码表示的整数;
最小值是-128(-2^7);
最大值是127(2^7-1);
默认值是0;
byte类型用在大型数组中节约空间,主要代替整数,因为byte变量占用的空间只有int类型的四分之一;
例子:byte a = 100,byte b = -50。
1.1.2 short
short数据类型是16位、有符号的以二进制补码表示的整数
最小值是-32768(-2^15);
最大值是32767(2^15 - 1);
Short数据类型也可以像byte那样节省空间。一个short变量是int型变量所占空间的二分之一;
默认值是0;
例子:short s = 1000,short r = -20000。
1.1.3 int(常用)
int数据类型是32位、有符号的以二进制补码表示的整数;
最小值是-2,147,483,648(-2^31);
最大值是2,147,483,647(2^31 - 1);
一般地整型变量默认为int类型;
默认值是0;
例子:int a = 100000, int b = -200000。
1.1.4 long(常用)
long数据类型是64位、有符号的以二进制补码表示的整数;
最小值是-9,223,372,036,854,775,808(-2^63);
最大值是9,223,372,036,854,775,807(2^63 -1);
这种类型主要使用在需要比较大整数的系统上;
默认值是0L;
例子: long a = 100000L,long b = -200000L。
1.1.5 float
float数据类型是单精度、32位、符合IEEE 754标准的浮点数;
float在储存大型浮点数组的时候可节省内存空间;
默认值是0.0f;
浮点数不能用来表示精确的值,如货币;
例子:float f1 = 234.5f。
1.1.6 double(常用)
double数据类型是双精度、64位、符合IEEE 754标准的浮点数;
浮点数的默认类型为double类型;
double类型同样不能表示精确的值,如货币;
默认值是0.0d;
例子:double d1 = 123.4。
1.1.7 boolean
boolean数据类型表示一位的信息;
只有两个取值:true和false;
这种类型只作为一种标志来记录true/false情况;
默认值是false;
例子:boolean one = true。
1.1.8 char
char类型是一个单一的16位Unicode字符;
最小值是’\u0000’(即为0);
最大值是’\uffff’(即为65,535);
char数据类型可以储存任何字符;
例子:char letter = ‘A’。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
1.char的输入 也可以用String输入后再转换为char数组。
String s = cin.readLine();char [] ch = new char [100 ]; ch = s.toCharArray();
1.1 单个字符 Scanner Scin = new Scanner(System.in);char ch = Scin.next().charAt(0 ); System.out.println(ch); char ch = Scin.next().charAt(3 ); System.out.println(ch);
1.2 字符数组 char [] ch = new char [50 ]; String s = Scin.next(); ch = s.toCharArray(); System.out.println(ch);
2.输出 就记录一下坑吧。
先看代码:
char [] ch = new char [50 ]; String s = Scin.next(); ch = s.toCharArray(); System.out.println("s = :" + s); System.out.println("ch = :" + ch); System.out.println(ch);
解释
可以看见,最后两行输出同一个数组,但输出却不一样。这是因为调用的输出方法不一样。
System.out.println(“ch = :” + ch); 的源码:
public void println (String x) { synchronized (this ) { print(x); newLine(); } }
System.out.println(ch); 的源码:
public void println (char x[]) { synchronized (this ) { print(x); newLine(); } }
可以看见,两次调用的方法是不一样的。这是println方法的重载问题导致的。第一次调用的方法的参数是String类型,第二次调用的方法的参数是char[]数组类型的。这是因为第一次中的 “ch = :” 把数组转换成了字符串String类型了。
1.2 Java特殊的转义字符
符号
字符含义
\n
换行 (0x0a)
\r
回车 (0x0d)
\f
换页符(0x0c)
\b
退格 (0x08)
\0
空字符(0x0)
\s
字符串
\t
制表符
\“
双引号
\‘
单引号
\\
反斜杠
\ddd
八进制字符 (ddd)
\uxxxx
16进制Unicode字符 (xxxx)
2.基本数据类型与包装类 包装类(Wrapper) 针对八种基本数据类型定义相应的引用类型 — 包装类(封装类)。
基本数据类型 包装类
byte Byte 父类 :Number
short Short
int Integer
long Long
float Float
double Double
boolean Boolean
char Character
基本数据类型转换为包装类 实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 public class NewJavaTest { public static void main (String[] args) { int i=120 ; Integer ie = new Integer(i); System.out.println(ie.toString()); Integer it = new Integer("12345" ); System.out.println(it.toString()); } }120 12345
其他的类型用法同样的原理。
包装类转换为基本数据类型 实例:
public class NewJavaTest { public static void main (String[] args) { Integer it = new Integer(13 ); int i = it.intValue(); System.out.println(i+1 ); } }14
基本数据类型、包装类转换成 String 由于基本数据类型与包装类之间可以自动转换,所以这里就把包装类和基本数据类型当成一种来和 String 之间进行转换。
方式一 int num = 10 ; String str = num + "" ;10
方式二 float fl = 12.3f ;double db = 23.5 ; String str = String.valueOf(fl); String str1 = String.valueOf(db); System.out.println(str); System.out.println(str1);12.3 23.5
String 转换成基本数据类型、包装类 public class NewJavaTest { public static void main (String[] args) { String str = "234" ; int num = Integer.parseInt(str); System.out.println(num+1 ); String str2 = "true" ; boolean fl = Boolean.parseBoolean(str2); System.out.println(fl); } }235 true
转换图
自动装箱 JDK 5.0 新特性。 基本数据类型转换成包装类。
可以理解成,小的转换成大的叫装箱。(这里的小、大表示的是谁包含谁) 实例:
public class NewJavaTest { public static void main (String[] args) { int num = 10 ; Integer it = num; System.out.println(it); } }10
自动拆箱 包装类转换成基本数据类型。
可以理解成,大的转换成小的叫拆箱。(这里的小、大表示的是谁包含谁)
实例:
public class NewJavaTest { public static void main (String[] args) { Integer it = 12 ; int itt = it; System.out.println(itt); } }12
3.字符串(String) 3.1 String Java字符串String是不可变对象。字符串操作不改变原字符串内容,而是返回新字符串。
3.1 字符串比较
两个字符串比较,总是使用equals()方法。== 比较的是两个的地址。
忽略大小写比较(equalsIgnoreCase()
)
String s1="abcdefghijklmnopkrstuvwxyz" String s2="ABCDEFGHIJKLMNOPKRSTUVWXYZ" boolean flag=s1.equalsIgnoreCase(s2)
3.2 查找子串
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.contains("bc" )); System.out.println(s.contains("bd" ));true false
查看子串是否在母串的开始(startsWith()
)
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.startsWith("abc" )); System.out.println(s.startsWith("bcd" ));true false
String s = "abcdefghijklmnopkrstuvwxyz" ; System.out.println(s.endsWith("wxy" )); System.out.println(s.endsWith("xyz" ));false true
找子串第一次出现的下标,从下标0开始(indexOf()
),没有找到返回-1
String s = "abcdabcedaaq" ; System.out.println(s.indexOf("bc" )); System.out.println(s.indexOf("fgh" ));1 -1
找子串最后一次出现的下标(lastIndexOf()
)
String s = "abcdbcq" ; System.out.println(s.lastIndexOf("bc" )); System.out.println(s.lastIndexOf("fgh" ));4 -1
String s = "abbcccdddd" ; System.out.println(s.substring(2 )); System.out.println(s.substring(1 ,5 )); bcccdddd bbcc
3.3 去除首位空白字符
去除字符串首尾空白字符(trim()
)。空白字符包括空格,\t,\r,\n
:
String s = " fw few ewf we q qwf " ; System.out.println(s.length()); System.out.println(s); s = s.trim(); System.out.println(s.length()); System.out.println(s);23 fw few ewf we q qwf . 20 fw few ewf we q qwf." \tHello\r\n " .trim();
移除字符串首尾空白字符(strip()
)。它和trim()
不同的是,类似中文的空格字符\u3000也会被移除。
"\u3000Hello\u3000" .strip(); " Hello " .stripLeading(); " Hello " .stripTrailing();
3.4 判断字符串 判断字符串是否为 空(isEmpty()
)和空白字符串(isBlank()
)
"" .isEmpty(); " " .isEmpty(); " \n" .isBlank(); " Hello " .isBlank();
3.5 替换 替换子串(replace()
),返回一个新字符串。
String s = "abcbabca" ; String s1 = s.replace('a' ,'t' ); String s1 = s.replace("ab" ,"tttt" );
正则表达式替换:
String s = "A,,B;C ,D" ; s.replaceAll("[\\,\\;\\s]+" , "," );
3.6 分割字符串 split(),其中表达式就是一个正则表达式。返回的是一个字符串数组。
特殊情况(斜线\
)
String s = "ab\\cd\\ef\\g\\h" ; String[] s1 = s.split("\\\\" ); System.out.println(s);int len=s1.length; for (int i=0 ;i<len;++i){ System.out.println(s1[i]); }
需要加双斜线的:+
、*
、$
、^
、
String s = "ab+cdef+gh" ; String[] s1 = s.split("\\+" ); String s = "ab*cdef*gh" ; String[] s1 = s.split("\\*" ); String s = "ab$cdef$gh" ; String[] s1 = s.split("\\$" ); String s = "ab^cdef^gh" ; String[] s1 = s.split("\\^" ); ab cdef gh
其他
String s = "ab,cde,fgh" ; String[] s1 = s.split("," ); ab cde fgh
多个符号作为分隔符,使用多个分隔符则需要借助 |
符号
String s = "ab,c+de@fgh" ; String[] s1 = s.split(",|\\+|@" );
3.7 拼接字符串 拼接字符串使用静态方法join()
,它用指定的字符串连接字符串数组。返回一个字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 String s = "ab,c+de@fgh" ; String[] s1 = s.split(",|\\+|@" ); System.out.println(s);int len=s1.length;for (int i=0 ;i<len;++i){ System.out.println(s1[i]); } System.out.println("===============================" ); String s3 = String.join("****" ,s1); System.out.println(s3); ab,c+de@fgh ab c de fgh =============================== ab****c****de****fgh
3.8 格式化字符串 详见 《每日一点-JAVA保留小数点位数》
若链接失效,请直接搜索🔍
3.9 类型转换
其他类型转字符(String.valueOf()),返回一个字符串。
int n = 15 ; String nns = Integer.toString(n); System.out.println(Integer.toString(n));boolean fl = false ; System.out.println(Boolean.toString(fl)); int a = 2123 ; String resu = String.valueOf(a); System.out.println(resu);boolean flag = true ; resu = String.valueOf(flag); System.out.println(resu);double f = 23.4324 ; resu = String.valueOf(f); System.out.println(resu);
字符串转其他类型
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 String s = "123456" ;int nn = Integer.valueOf(s); System.out.println(nn+100 ); System.out.println(Integer.valueOf(s)); String sint = "123456" ;int resu = Integer.parseInt(sint);int re = Integer.parseInt(sint,11 ); System.out.println(resu); resu+=10 ; System.out.println(resu); String sbool = "true" ;boolean fresu = Boolean.parseBoolean(sbool); if (fresu) { System.out.println("YES" ); } else { System.out.println("NO" ); } String sdouble = "13.324" ;double resu2 = Double.parseDouble(sdouble); System.out.println(resu2);
要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer。例如:
Integer.getInteger("java.version" );
将整数格式化为指定进制的字符串
System.out.println(Integer.toString(100 )); System.out.println(Integer.toString(100 , 36 )); System.out.println(Integer.toHexString(100 )); System.out.println(Integer.toOctalString(100 )); System.out.println(Integer.toBinaryString(100 )); System.out.println(Integer.toString(100 , radix));
3.10 字符串与char[]相互转化 char [] cs = "Hello" .toCharArray(); String s = new String(cs);
如果修改了char[]数组,String并不会改变。因为通过new String(char[])创建新的String实例时,它并不会直接引用传入的char[]数组,而是会复制一份,所以,修改外部的char[]数组不会影响String实例内部的char[]数组,因为这是两个不同的数组。
4.StringBuffer和StringBuilder 但两者的使用是没有区别的。所以,会用其一即可。但由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。
StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。
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 StringBuilder strB = new StringBuilder(); System.out.println("StringBuilder:" +strB.append("ch" ).append("111" ).append('c' )); System.out.println("String:" +strB.toString()); System.out.println("StringBuilder.appendCodePoint:" +strB.appendCodePoint(2 )); strB.setCharAt(2 , 'd' ); System.out.println("StringBuilder.setCharAt:" + strB); System.out.println("StringBuilder.insertString:" + strB.insert(2 , "LS" )); System.out.println("StringBuilder.insertChar:" + strB.insert(2 , 'L' )); System.out.println("StringBuilder.delete:" + strB.delete(2 , 4 ));
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 StringBuilder sb = new StringBuilder("tothefor" ); System.out.println(sb); sb.append(".com" ); System.out.println(sb); String mid = sb.toString(); System.out.println(mid); sb.insert(1 ,"www." ); System.out.println(sb); sb.delete(1 ,5 ); System.out.println(sb); sb.setCharAt(1 ,'w' ); System.out.println(sb); sb.appendCodePoint(65 ); System.out.println(sb); tothefor tothefor.com tothefor.com twww.othefor.com tothefor.com twthefor.com twthefor.comA
4.1 String与StringBuilder相互转化 String ss = "abcder" ; StringBuilder sbs = new StringBuilder(ss); StringBuilder resbs = sbs.reverse(); String news = resbs.toString(); System.out.println(news);
5.区别
String: 字符串常量,字符串长度不可变。Java中String 是immutable(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
StringBuffer: 字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。
StringBuilder: 字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。
基本原则:
如果要操作少量的数据用 String ;
单线程操作大量数据用StringBuilder ;
多线程操作大量数据,用StringBuffer。
在使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,所以如果需要对字符串进行修改推荐使用 StringBuffer。 StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
一般情况下,速度从快到慢为 StringBuilder > StringBuffer > String,当然这是相对的,不是绝对的。
6.length() 方法,length 属性和 size() 方法的区别
1、length() 方法是针对字符串
来说的,要求一个字符串的长度就要用到它的length()方法;
2、length 属性是针对 Java 中的数组
来说的,要求数组的长度可以用其 length 属性;
3、Java 中的 size() 方法是针对泛型集合
说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!