字符与字符串

字符(char)

Java中,char也是基本数据类型的一种,用于处理单个字符,定义其字面量时使用一对单引号,如'a';当需要特殊的字符,如单引号本身、换行符等字符时,需要使用\字符进行转义,常用的转义字符有:

  • \b,退格符。
  • \n,换行符。
  • \r,回车符。
  • \t,水平制表符。
  • \",双引号。
  • \',单引号。
  • \\,\符。
  • \uxxxx,Unicode字符,xxxx为字符的十六进制编码。

下面的代码,演示了字符与其编码之间的转换。

Java
public class Hello {
	public static void main(String[] args) {
		char ch = 'A';
		int code = (int)ch;
		System.out.println((int)ch);
		System.out.println((char)code);
	}
}

代码显示结果如下图。

String类

Java中的字符串实际就是String类的实例,定义字面量时需要使用一对双引号,如"abc"。除了可以通过String类的成员操作字符串,还需要注意字符串的连接操作。

使用+运算符,可以将两个字符连接;当字符串与其它类型进行+运算时,会将其它类型转换为字符串,然后进行连接操作。下面的代码演示了字符串的连接操作。

Java
public class Hello {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "def";
		int num = 123;
		System.out.println(s1 + s2);
		System.out.println(s1 + num);
	}
}

代码执行结果如下图。

下面了解一些String类中的常用方法。

compareTo​(String anotherString)方法,比较两个字符串的内容,区分字母大小写,内容相同时返回0值。

compareToIgnoreCase​(String str)方法,比较两个字符串内容并忽略字母大小写,内容相同时返回0值。

下面的代码演示了这两个比较方法的应用。

Java
public class Hello {
	public static void main(String[] args) {
		String s1 = "abc";
		String s2 = "ABC";
		System.out.println(s1.compareTo(s2));
		System.out.println(s1.compareToIgnoreCase(s2));
	}
}

代码执行结果如下图。

本例中,第一个输出结果的32是由小写字母a的编码(97)减大写字母A的编码(65)得来的;第二个输出0,由于忽略了字母大小写,所以两个字符串的内容是相同的。

substring()方法,截取字符串的一部分并返回,参数一指定开始截取的索引位置;如果不指定参数二,返回参数一位置开始的所有内容,否则返回参数一位置到参数二位置之前的内容,其中不包含参数二指定位置的字符,如果使用了substring(m,n),实际上就是返回从m开始的n-m个字符。下面的代码演示了substring()方法的应用。

Java
public class Hello {
	public static void main(String[] args) {
		String s1 = "abcdefg";
		System.out.println(s1.substring(2));
		System.out.println(s1.substring(2,5));
	}
}

代码执行结果如下图。

join()是一个静态方法,可以使用指定的内容连接多个字符串,其中,参数一指定连接内容,参数二定义为可变长参数,用于指定被连接的多个内容,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		String s1 = String.join("->", "File","Open","Folder");
		System.out.println(s1);
	}
}

代码执行结果如下图。

此外,String类中常用实例方法还有:

  • concat​(String str)方法,将str添加到原字符串对象的末尾,并返回连接后的字符串。
  • startsWith​(String prefix)方法,判断字符串是否以perfix开始。
  • endsWith​(String suffix)方法,判断字符串是否以suffix结束。
  • indexOf​(String str)方法,返回str第一次出现的索引值,没有找到返回-1。
  • lastIndexOf​(String str)方法,返回str最后一次出现的索引值,没有找到返回-1。
  • isBlank()方法,判断字符串中是否只包含空白字符,返回boolean类型。
  • length()方法,返回字符串中的字符数量。
  • isEmpty()方法,判断字符串是否为空,即length()方法返回值为0。
  • toLowerCase()方法,将字符串中的字母转换为小写,并返回转换后的字符串。
  • toUpperCase()方法,将字符串中的字母转换为大写,并返回转换后的字符串。

字符串格式化

前面的示例中,我们已经大量使用System.out.printf()方法格式化输出代码的执行结果;在String类中的静态方法format()则用于生成格式化后的字符中,其定义为format​(String format, Object... args),其中,参数一指定包含格式化字符的字符串,参数二为可变长参数,用于指定格式化字符所表示的实际数据。

format()方法的参数一中,常用的格式化字符有:

  • %b,显示布尔数据。
  • %d,显示为整数。
  • %x,显示为十六进制数。
  • %o,显示为八进制数。
  • %s,显示为字符串。
  • %f,显示浮点数,如指定显示两位小数时,可以使用%.2f。

下面的代码演示了String.format()方法的使用。

Java
public class Hello {
	public static void main(String[] args) {
		int x = 10;
		double y = 99.1234;
		String s1 = String.format("%d + %.4f = %.4f", x, y, x+y);
		System.out.println(s1);
	}
}

代码执行结果如下图。

将字符串转换为基本类型

在基本类型的包装类中,定义了parseXXX()方法,可以将字符串转换为相应的类型,如Integer类中的parseInt()方法。

Integer.parseInt()方法中,参数一指定需要转换的字符串,参数二指定整数的进制,如果没指定,默认为10进制数。下面的代码显示了Integer.parseInt()方法的使用。

Java
public class Hello {
	public static void main(String[] args) {
		System.out.println(Integer.parseInt("1010"));
		System.out.println(Integer.parseInt("1010",2));
	}
}

代码显示结果如下图。

相关方法包括:

  • Byte.parseByte​()、Short.parseShort​()、Integer.parseInt()和Long.parseLong​()方法,用于将字符串转换为相应的整数,方法的应用可以参考前面的Integer.parseInt()方法。
  • Float.parseFloat​(String s)方法,将字符串s转换为float类型。
  • Double.parseDouble​(String s)方法,将字符串s转换为doble类型。
  • Boolean.parseBoolean​(String s)方法,将字符串s转换为boolean类型;其中,当字符串中内容为“true”(不区分大小写)时,返回true值;其它内容、空字符串或null值转换为false。

请注意,使用这些方法将字符串转换为基本数据类型时,如果不能正确转换就会产生异常,如果需要在任何时候都有一个可用的数据,可以参考下面的代码。

Java
public class CStr {
	// 创建为int类型
	public static int toInt(String s) {
		try {
			return Integer.parseInt(s);
		}
		catch(Exception e) {
			return 0;
		}
	}
}

CStr.toInt()静态方法中,使用Integer.parseInt()方法将字符串转换为int类型,如果转换成功则返回转换后的整数,如果转换不成功则返回0;实际应用中,可以参考此方法封装其它类型的数据,下面的代码测试了CStr.toInt()方法的使用。

Java
public class Hello {
	public static void main(String[] args) {
		System.out.println(CStr.toInt("123"));
		System.out.println(CStr.toInt("abc"));
	}
}

代码执行结果如下图。

StringBuilder和StringBuffer类

String类型用于处理是不可变字符串,使用+运算符连接大量的String对象的操作效率并不高;此时,我们可以使用StringBuilder或StringBuffer类型,除了可以连接字符串,还可以更高效地将各种类型的数据组合到一起。

这两个类的使用方法相同,区别在于,StringBuffer类是保证线程完全,如果对象中的内容需要在多线程中操作,可以保存操作正确性,但在性能上会有一些开销。对于本地的或内容不需要在多线程中共享的操作,使用StringBuilder类型会有更好的性能。下面,我们以StringBuilder为例,StringBuffer类可以参考使用。

StringBuilder类的常用构造方法包括:

  • StringBuilder(),初始化一个没有内容的对象。
  • StringBuilder(int),初始化一个指定尺寸的对象,但没有内容;如果内容不超过指定的尺寸,则不再需要分配内存空间。
  • StringBuilder(String),使用参数中的内容初始化对象。

创建StringBuilder对象后,可以使用一系列重载版本的的append()方法添加内容,如下面的代码。

Java
public class Hello {
	public static void main(String[] args) {
		StringBuilder sb = new StringBuilder(50);
		sb.append("abc");
		sb.append(123);
		sb.append(true);
		System.out.println(sb.toString());
	}
}

代码执行结果如下图。

此外,StringBuilder还有一些常用的方法,如:

  • indexOf​(String str)方法,返回str出现的索引位置。
  • insert()方法,在参数一指定的索引位置插入参数二指定的内容。
  • length()方法,返回字符数量。
  • replace​(int start,int end, String str)方法,将start到end(不包含)索引位置之间的内容替换为str。下面的代码演示了replace()方法的应用。
  • Java
    public class Hello {
    	public static void main(String[] args) {
    		StringBuilder sb = new StringBuilder(10);
    		sb.append("abcdefg");
    		sb.replace(2,6,"****");
    		System.out.println(sb.toString());
    	}
    }

代码执行结果如下图。

MD5及SHA-1编码

MD5和SHA-1是基本的散列算法,可用于文本加密存储、校验等用途,下面的代码封装了将字符串转换为MD5和SHA-1编码的方法。

Java
import java.math.BigInteger;
import java.security.MessageDigest;
public class CStr {
		// MD5
	public static String toMd5(String s) {
		try {
			MessageDigest m = MessageDigest.getInstance("MD5");
			m.update(s.getBytes());
			byte[] bytes = m.digest();
			BigInteger bi = new BigInteger(1,bytes);
			return bi.toString(16).toUpperCase();
		}
		catch(Exception ex) {
			return "";
		}
	}
		// SHA-1
	public static String toSha1(String s) {
		try {
			MessageDigest m = MessageDigest.getInstance("SHA-1");
			m.update(s.getBytes());
			byte[] bytes = m.digest();
			BigInteger bi = new BigInteger(1,bytes);
			return bi.toString(16).toUpperCase();
		}
		catch(Exception ex) {
			return "";
		}
	}
}

下面的代码,我们在main()方法中测试这两个方法的应用。

Java
public class Hello {
	public static void main(String[] args) {
		String s = "12345";
		System.out.println(CStr.toMd5(s));
		System.out.println(CStr.toSha1(s));
	}
}

代码执行结果如下图。

代码中,确定的算法的关键在于MessageDigest.getInstance()方法,其中支持的算法包括:

  • MD2
  • MD5
  • SHA-1
  • SHA-256
  • SHA-384
  • SHA-512

GUID

GUID又称UUID,可以提供全球唯一标识,是标识唯一资源的常用方法,下面的代码,我们继续在CStr类中封装静态方法getGuid()来获取GUID字符串。

Java
import static java.util.UUID.randomUUID;
public class CStr {
		//
	public static String getGuid() {
		return randomUUID().toString();
	}
}

代码中,使用静态导入导入了java.util.UUID.randomUUID方法,然后通过toString()方法返回GUID的字符串形式。下面,我们在main()方法中测试getGuid()方法。

Java
public class Hello {
	public static void main(String[] args) {
		System.out.println(CStr.getGuid());
		System.out.println(CStr.getGuid());
	}
}

实际应用中,每次生成的GUID都是不同的,下图显示了返回的格式。

稍后,在正则表达式部分将介绍如何删除其中的连接号(-)。

BASE64

与MD5、SHA-1编码不同的是,BASE64编码是可以双向操作的,即可以编码,也可以解码还原文本内容。下面的代码,继续在CStr中封装base64Encode()和base64Decode()方法进行文本和字节数组的BASE64编码和解码操作。

Java
import java.util.Base64;
public class CStr {
		//
	public static String base64Encode(String s) {
		if(s!=null)
			return Base64.getEncoder().encodeToString(s.getBytes());
		else
			return "";
	}
	//
	public static String base64Decode(String s) {
		byte[] bytes = Base64.getDecoder().decode(s);
		return new String(bytes);
		}
}

下面的代码,我们在main()方法中测试这两个方法的应用。

Java
public class Hello {
	public static void main(String[] args) {
		String s = "abcdefg";
		String sBase64 = CStr.base64Encode(s);
		System.out.println(s);
		System.out.println(sBase64);
		System.out.println(CStr.base64Decode(sBase64));
	}
}

代码执行结果如下图。

本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc001013