Java基础-字符编码与练习

一、概述
1.字符流的出现为了方便操作字符。
2.更重要的是加入了编码的转换,即转换流。
3.通过子类转换流来完成。在两个对象进行构造的时候,可以加入字符集(即编码表),可传入编码表的有:
        (1)转换流:InuputStreamReader和OutputStreamWriter
        (2)打印流:PrintStream和PrintWriter,只有输出流
编码表的由来
       计算机只能识别二进制数据,早期由来是电信号。为了方便应用计算机,让它可以识别各个国家的文字。
       就将各个国家的文字用数字来表示,并一一对应,形成一张表。这就是编码表。
常见的编码表:
        (1)ASCII:美国标准信息交换码表。用一个字节的7位表示
        (2)IOS8859-1:拉丁码表;欧洲码表。用一个字节的8位表示
        (3)GB2312:中国的中文编码表()早期
        (4)GBK:中国的中文编码表升级,融合了更多的中文文字字符。打头的是两个高位为1的两个字节编码。为负数
        (5)Unicode:国际标准码,融合了多种文字。所有文字都用两个字节来表示,Java语言使用的就是unicode。
        (6)UTF-8:Unicode Transformation Format
最多用三个字节表示一个字符的编码表,根据字符所占内存空间不同,分别用一个、两个、三个字节来编码。
 
二、转换流的编码应用
1.可以将字符以指定编码格式存储。
2.可以对文本数据指定编码格式来解读。
3.指定编码表的动作由构造函数完成。
 
三、编码和解码
1.编码:字符串变成字节数组
        (1)默认字符集:
              String  --->  byte[]  :srt.getBytes()
        (2)指定字符集:
              String  --->  byte[]  :srt.getBytes(charsetName)
2.解码:字节数组变成字符串
        (1)默认字符集:
              byte[]  --->  String :new String(byte[])
        (2)指定字符集:
              byte[]  --->  String :new String(byte[],charsetName)
 
四、对于编码和解码的字符集转换注意事项
1.如果编码失败,解码就没意义了。
2.如果编码成功,解码出来的是乱码,,则需对乱码通过再次编码(用解错码的编码表),然后再通过正确的编码表解码。针对于IOS8859-1是通用的。
3.如果用的是GBK编码,UTF-8解码,此时通过再次编码后解码的方式,就不能成功了,因为UTF-8也支持中文,在UTF-8解的时候,会将对应的字节数改变,所以不会成功。
4.特别注意:对于中文的”联通“,这两个字比较特别,它的二进制位正好是和在UTF-8中两个字节打头的相同,所以在文本文件中,
如果单独写“联通”或者和满足UTF-8编码格式的字符一起保存时,记事本就会用UTF-8来进行解码动作,这样显示的就会是乱码。

代码:

import java.io.*;

public class code
{
	public static void main(String[] args) throws Exception {
		String s = "王五";
		
		byte[] b1 = s.getBytes("GBK");
		System.out.println(Arrays.toString(b1));
		String s1 = new String(b1, "utf-8");
		System.out.println("s1="+s1);
		
		byte[] b2 = s.getBytes("utf-8");
		System.out.println(Arrays.toString(b2));
		String s2 = new String(b2, "gbk");
		System.out.println("s2="+s2);
		//GBK utf-8  都识别中文,所以会解码不匹配
	}
}
练习:
有五个学生,每个学生有3门课的成绩,
从键盘输入以上数据(包括姓名,三门课成绩),
输入的格式:如:zhagnsan,30,40,60计算出总成绩,
并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。
步骤:
1,描述学生对象。
2,定义一个可操作学生对象的工具类。
思想:
1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。
2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。
所以可以使用TreeSet。

3,将集合的信息写入到一个文件中。

代码:

import java.io.*;
import java.util.*;

public class code
{
	public static void main(String[] args) throws IOException {
		Comparator<Student> cmp = Collections.reverseOrder();
		
		Set<Student> stus = Stuinfotool.getStudents(cmp);
		Stuinfotool.writeFile(stus);
	}
}

class Student implements Comparable<Student>
{
	private String name;
	private int shuxue,yuwen,yingyu;
	private int sum;
	
	public Student(String name,int shuxue,int yinyu,int yuwen) {
		this.name = name;
		this.shuxue = shuxue;
		this.yingyu = yingyu;
		this.yuwen = yuwen;
		sum = shuxue + yingyu + yuwen;
	}
	//成绩排序
	public int compareTo(Student s) {
		int num = new Integer(this.sum).compareTo(new Integer(s.sum));
		if(num == 0)
			return this.name.compareTo(s.name);
		return num;
	}
	//hash存值
	public int hashCode() {
		 return name.hashCode()+sum*12;
	}
	//判断类型
	public boolean equals(Object obj) {
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配"); 
		Student s = (Student)obj;
		return this.name.equals(s.name) && this.sum==s.sum;
	}
	
	public String toString() {
		return "student["+name+","+shuxue+","+yingyu+","+yuwen+"]";
	}
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getShuxue() {
		return shuxue;
	}

	public void setShuxue(int shuxue) {
		this.shuxue = shuxue;
	}

	public int getYuwen() {
		return yuwen;
	}

	public void setYuwen(int yuwen) {
		this.yuwen = yuwen;
	}

	public int getYingyu() {
		return yingyu;
	}

	public void setYingyu(int yingyu) {
		this.yingyu = yingyu;
	}

	public int getSum() {
		return sum;
	}

	public void setSum(int sum) {
		this.sum = sum;
	}	
}

class Stuinfotool
{
	public static Set<Student> getStudents() throws IOException{
		return getStudents(null);
	}
	
	public static Set<Student> getStudents(Comparator<Student> cmp) throws IOException{
		BufferedReader bufr = 
				new BufferedReader(new InputStreamReader(System.in));
		String len = null;
		Set<Student> stus = null;
		
		if(cmp==null)
			stus = new TreeSet<Student>();
		else
			stus = new TreeSet<Student>(cmp);
		
		while((len=bufr.readLine())!=null) {
			if("over".equals(len))
				break;
			String[] info = len.split(",");
			Student stu = new Student(info[0], 
					Integer.parseInt(info[1]) , 
					Integer.parseInt(info[2]),
					Integer.parseInt(info[3]));
			stus.add(stu);
		}
		bufr.close();
		return stus;
	}
	
	public static void writeFile(Set<Student> stus) throws IOException
	{
		BufferedWriter bufw = new BufferedWriter(new FileWriter("demo.txt"));
		
		for(Student stu : stus) {
			bufw.write(stu.toString()+"\t");
			bufw.write(stu.getSum()+"");
			bufw.newLine();
			bufw.flush();
		}
		bufw.close();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 字符串拼接是指将两个或多个字符串连接起来形成一个新的字符串。在Java中,可以使用"+"运算符来进行字符串拼接,也可以使用String类的concat()方法来实现。 例如: String str1 = "Hello"; String str2 = "World"; String str3 = str1 + " " + str2; // 使用"+"运算符进行字符串拼接 String str4 = str1.concat(" ").concat(str2); // 使用concat()方法进行字符串拼接 在以上代码中,str3和str4的值都是"Hello World",它们是由str1和str2拼接而成的。需要注意的是,使用"+"运算符进行字符串拼接时,如果其中一个操作数是字符串,另一个操作数会自动转换为字符串类型。如果要将其他类型的数据转换为字符串类型,可以使用String类的valueOf()方法。 例如: int num = 123; String str5 = "The number is " + String.valueOf(num); // 将int类型的数据转换为字符串类型 在以上代码中,str5的值是"The number is 123",它是由字符串"The number is "和整数123拼接而成的。 ### 回答2: Java字符串是指由零个或多个Unicode字符组成的有限序列。在Java编程中,字符串是非常常见的一种数据类型。Java中有许多种创建字符串对象的方法,其中最常见的一种是使用String类。 在Java中,String类是一个包含各种有用方法的类,它允许我们在程序中创建并操作字符串。其中一个可以使用的方法是字符串拼接或字符串拼接运算。字符串拼接运算是将两个或多个字符串连接成一个新的字符串。在Java中,它通过"+"号来执行。 例如,在Java中,我们可以这样使用字符串拼接运算: String str1 = "hello "; String str2 = "world"; String str3 = str1 + str2; System.out.println(str3); 这将输出“hello world”。 需要注意的是,在执行字符串拼接运算时,Java会自动调用toString()方法将数据类型转换为字符串类型。因此,例如,如果我们想用一个int类型的变量来连接字符串,我们需要将其转换为字符串类型: int num = 10; String str = " the result is: " + Integer.toString(num); System.out.println(str); 这将输出“the result is: 10”。 在实际的编码中,字符串拼接操作经常用于构建消息字符串,例如在向用户显示错误消息或日志消息时,我们通常会将不同的字符串拼接在一起以形成完整的消息。另外,在实际的编码中,我们应该尽可能的使用StringBuilder或StringBuffer来执行字符串拼接操作,以提高字符串拼接操作的性能。 ### 回答3: Java中的String是一种不可变的对象,意味着一旦字符串对象创建后,其中的内容就不可更改。而字符串拼接的过程涉及操作创建新的字符串对象,因此需要特别留意与优化。 Java中有两种字符串拼接的方法: 1.使用‘+’运算符连接字符串 这是一种最常见的字符串拼接方法。例如:String str = "Hello" + " World";拼接出的结果为 Hello World。也可以将字符串变量与常量拼接:String name = "Tom"; String greeting = "Hello " + name; 使用‘+’运算符拼接字符串,底层代码实现是先创建一个新的StringBuilder对象,然后将操作数添加到这个StringBuilder对象里,最后拿到StringBuilder对象里的字符串。 需要注意,大量的字符串连接所产生的新的临时对象也会占用内存,导致较慢的时间和空间性能。如下代码所演示: String message = ""; for (int i = 1; i < 1000; i++) { message += "" + i; } 在上面的例子中,message每次操作都会新建一个StringBuilder对象,每次字符串长度增长都必须创建一个新的String对象,最后的字符串还需要拷贝到一个新的String对象中返回。这样的连续字符串拼接最终导致频繁创建和销毁大量的字符串对象,降低了系统的性能。 2.使用StringBuilder拼接字符串 StringBuilder类可以用来创建可改变的字符串,这就意味着它可以构建一个可变的字符串,并可以动态的增加或修改其内容。StringBuilder类提供了多种方法,可以将不同类型的数据拼接到一个字符串中。 对于大量的字符串拼接,使用StringBuilder所达到的效果比使用‘+’运算符更优。如下所演示: StringBuilder message = new StringBuilder(); for (int i = 1; i < 1000; i++) { message.append(i); } String finalMessage = message.toString(); 这里使用了append()方法向StringBuilder中添加了每一个数字。最后通过调用toString()方法来获取拼接后的字符串。 总结:在实际开发中应该尽量避免直接使用‘+’运算符来进行字符串拼接。如果只是简单的拼接几个字符串或者单个变量,可以使用‘+’运算符。但是对于大量的拼接,我们应该使用StringBuilder,这样能够显著的提高系统的效率和性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值