目录

个人博客
www.tothefor.com
蓝桥杯复习知识点汇总

本文着重说一下可能会用到的数据类型。

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 单个字符
//示例1
Scanner Scin = new Scanner(System.in);
char ch = Scin.next().charAt(0); //qwer
System.out.println(ch); //q

//示例2
char ch = Scin.next().charAt(3); //qwerasdf
System.out.println(ch); //r
1.2 字符数组
char[] ch = new char[50];
String s = Scin.next(); //qwer
ch = s.toCharArray();
System.out.println(ch); //qwer
2.输出

就记录一下坑吧。

先看代码:

char[] ch = new char[50];
String s = Scin.next(); //qwerasdf
ch = s.toCharArray();
System.out.println("s = :" + s); //s = :qwerasdf
System.out.println("ch = :" + ch); //ch = :[C@2b193f2d
System.out.println(ch); //qwerasdf

解释

可以看见,最后两行输出同一个数组,但输出却不一样。这是因为调用的输出方法不一样。

  • 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)
\uxxxx16进制Unicode字符 (xxxx)

2.基本数据类型与包装类

包装类(Wrapper)

针对八种基本数据类型定义相应的引用类型 — 包装类(封装类)。

基本数据类型包装类
byteByte父类 :Number
shortShort
intInteger
longLong
floatFloat
doubleDouble
booleanBoolean
charCharacter

基本数据类型转换为包装类

实例:

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"); //必须为数字的字符串
      // s = "456789"; 
      //Integer it = new Integer(s);
      //输出 456789
       System.out.println(it.toString());
//       Integer it2 =new Integer("123abc"); //不能加字母,否则运行时会出错
//       System.out.println(it2.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"; //只有写true输出才为true,其他的都为false,写1也为false
        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 字符串比较

  1. 两个字符串比较,总是使用equals()方法。== 比较的是两个的地址。
  1. 忽略大小写比较(equalsIgnoreCase()
String s1="abcdefghijklmnopkrstuvwxyz"
String s2="ABCDEFGHIJKLMNOPKRSTUVWXYZ"
boolean flag=s1.equalsIgnoreCase(s2)

3.2 查找子串

    1. 是否包含子串(contains()
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.contains("bc"));
System.out.println(s.contains("bd"));

//输出
true
false
    1. 查看子串是否在母串的开始(startsWith()
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.startsWith("abc"));
System.out.println(s.startsWith("bcd"));

//输出
true
false
    1. 查看子串是否在母串的最后(endsWith()
String s = "abcdefghijklmnopkrstuvwxyz";
System.out.println(s.endsWith("wxy"));
System.out.println(s.endsWith("xyz"));

//输出
false
true
    1. 找子串第一次出现的下标,从下标0开始(indexOf()),没有找到返回-1
String s = "abcdabcedaaq";
System.out.println(s.indexOf("bc"));
System.out.println(s.indexOf("fgh"));

//输出
1
-1
    1. 找子串最后一次出现的下标(lastIndexOf()
String s = "abcdbcq";
System.out.println(s.lastIndexOf("bc"));
System.out.println(s.lastIndexOf("fgh"));

//输出
4
-1
    1. 提取子串(substring()
String s = "abbcccdddd";
System.out.println(s.substring(2)); //从下标2开始
System.out.println(s.substring(1,5)); //从下标1到下标5(不包括5),即[1,5)

//输出
bcccdddd
bbcc

3.3 去除首位空白字符

    1. 去除字符串首尾空白字符(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(); // "Hello"
    1. 移除字符串首尾空白字符(strip())。它和trim()不同的是,类似中文的空格字符\u3000也会被移除。
"\u3000Hello\u3000".strip(); // "Hello"。
" Hello ".stripLeading(); // "Hello "。移除字符串首部的空白符
" Hello ".stripTrailing(); // " Hello"。移除字符串尾部的空白符

3.4 判断字符串

判断字符串是否为 空(isEmpty())和空白字符串(isBlank()

"".isEmpty(); // true,因为字符串长度为0
"  ".isEmpty(); // false,因为字符串长度不为0
"  \n".isBlank(); // true,因为只包含空白字符
" Hello ".isBlank(); // false,因为包含非空白字符

3.5 替换

替换子串(replace()),返回一个新字符串。

String s = "abcbabca";
String s1 = s.replace('a','t');//tbcbtbct,所有的字符a都被替换为t
String s1 = s.replace("ab","tttt"); //ttttcbttttca,所有的子串ab都被替换为tttt

正则表达式替换:

String s = "A,,B;C ,D";
s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D",把匹配的子串统一替换为","

3.6 分割字符串

split(),其中表达式就是一个正则表达式。返回的是一个字符串数组。

  1. 特殊情况(斜线\
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]);
   }
  1. 需要加双斜线的:+*$^
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

  1. 其他
String s = "ab,cde,fgh";
String[] s1 = s.split(",");
//输出
ab
cde
fgh
  1. 多个符号作为分隔符,使用多个分隔符则需要借助 | 符号
String s = "ab,c+de@fgh";
String[] s1 = s.split(",|\\+|@"); //以逗号、加号、@为分隔符,之间用或(|)

3.7 拼接字符串

拼接字符串使用静态方法join(),它用指定的字符串连接字符串数组。返回一个字符串。

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 类型转换

  1. 其他类型转字符(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)); //false

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. 字符串转其他类型
//整数字符串转整数
String s = "123456";
int nn = Integer.valueOf(s);
System.out.println(nn+100); //123556
System.out.println(Integer.valueOf(s));//123456

String sint = "123456";
int resu = Integer.parseInt(sint);
int re = Integer.parseInt(sint,11); //194871 把字符串里的数字当成11进制数,再转换为10进制。
System.out.println(resu); //123456
resu+=10;
System.out.println(resu); //123466

//boolean字符串转布尔值
String sbool = "true";
boolean fresu = Boolean.parseBoolean(sbool);
    if(fresu) {
        System.out.println("YES");
    }
    else {
        System.out.println("NO");
    }
//YES

//浮点数字符串转浮点数
String sdouble = "13.324";
double resu2 = Double.parseDouble(sdouble);
System.out.println(resu2); //13.324

要特别注意,Integer有个getInteger(String)方法,它不是将字符串转换为int,而是把该字符串对应的系统变量转换为Integer。例如:

Integer.getInteger("java.version"); // 版本号,11
  1. 将整数格式化为指定进制的字符串
 System.out.println(Integer.toString(100)); // "100",表示为10进制
 System.out.println(Integer.toString(100, 36)); // "2s",表示为36进制
 System.out.println(Integer.toHexString(100)); // "64",表示为16进制
 System.out.println(Integer.toOctalString(100)); // "144",表示为8进制
 System.out.println(Integer.toBinaryString(100)); // "1100100",表示为2进制

//或者
System.out.println(Integer.toString(100, radix)); // 将100转换为radix进制的字符串

3.10 字符串与char[]相互转化

char[] cs = "Hello".toCharArray(); // String -> char[]
String s = new String(cs); // char[] -> String

如果修改了char[]数组,String并不会改变。因为通过new String(char[])创建新的String实例时,它并不会直接引用传入的char[]数组,而是会复制一份,所以,修改外部的char[]数组不会影响String实例内部的char[]数组,因为这是两个不同的数组。

4.StringBuffer和StringBuilder

但两者的使用是没有区别的。所以,会用其一即可。但由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

StringBuilder 是一个可变的字符序列。它继承于AbstractStringBuilder,实现了CharSequence接口。

StringBuilder strB = new StringBuilder();

//1、append(String str)/append(Char c):字符串连接
System.out.println("StringBuilder:"+strB.append("ch").append("111").append('c'));
//return "StringBuilder:ch111c"

//2、toString():返回一个与构建起或缓冲器内容相同的字符串
System.out.println("String:"+strB.toString());
//return "String:ch111c"

//3、appendcodePoint(int cp):追加一个代码点,并将其转换为一个或两个代码单元并返回this
System.out.println("StringBuilder.appendCodePoint:"+strB.appendCodePoint(2));
//return "StringBuilder.appendCodePoint:ch111c"

//4、setCharAt(int i, char c):将第 i 个代码单元设置为 c(可以理解为替换)
strB.setCharAt(2, 'd');
System.out.println("StringBuilder.setCharAt:" + strB);
//return "StringBuilder.setCharAt:chd11c"

//5、insert(int offset, String str)/insert(int offset, Char c):在指定位置之前插入字符(串)
System.out.println("StringBuilder.insertString:"+ strB.insert(2, "LS"));
//return "StringBuilder.insertString:chLSd11c"
System.out.println("StringBuilder.insertChar:"+ strB.insert(2, 'L'));
//return "StringBuilder.insertChar:chLLSd11c"

//6、delete(int startIndex,int endIndex):删除起始位置(含)到结尾位置(不含)之间的字符串
System.out.println("StringBuilder.delete:"+ strB.delete(2, 4));
//return "StringBuilder.delete:chSd11c"

示例:

StringBuilder sb = new StringBuilder("tothefor");
System.out.println(sb);
sb.append(".com"); // append(String str)/append(Char c)
System.out.println(sb);
String mid = sb.toString(); // toString()
System.out.println(mid);
sb.insert(1,"www.");//insert(int offset, String str)/insert(int offset, Char c)
System.out.println(sb);
sb.delete(1,5);//delete(int startIndex,int endIndex) [startIndex,endIndex)
System.out.println(sb);
sb.setCharAt(1,'w');//setCharAt(int i, char c)
System.out.println(sb);

sb.appendCodePoint(65); //ASCII码65是大写的A
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); //String转换为StringBuffer
StringBuilder resbs = sbs.reverse();
String news = resbs.toString(); //StringBuffer转换为String
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() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐