欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JAVA基础课程(第十七天)

程序员文章站 2022-06-22 10:49:32
...

第十七天 String

String特性

(1)代表字符串,

(2)String是一个final类,代表不可变的字符序列,不能被继承的(不可变性)

​ 不管怎么操作String,都需要重新定义内存区域进行赋值

(3)String 实现了Serializable表示可***,Comparable接口表示可以比较

(4)String对象的字符内容是存储咋一个字符数组value[] 中

(5)字符串常量池不会存相同内容的字符串

(6)String 部分源码如下

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
    private final char value[];

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = -6849794470754667710L;
    }

(7)内存说明图

JAVA基础课程(第十七天)

(8)String创建的几种方式

		String s = "hello";

		String s1 = new String();

		String s2 = new String("hello");

		char[] ch = new char[]{'h','l'};
		String s3 = new String(ch);

		String s4 = new String(ch,0,1);

(9)特别说明

		String s1 = "hello";
		String s2 = "word";
		String s3 = "helloword";
		String s4 = "hello" + "word";
		String s5 = s1 + "word";
		String s6 = s1 + s2;
		String s7 = s6.intern();

		System.out.println(s3 == s4);  //true
		System.out.println(s3 == s5);  //false
		System.out.println(s3 == s6);  //false
		System.out.println(s3 == s7);  //true

​ ①常量与常量的拼接,结果在常量池,且常量池不会有相同内容的常量

​ ②只要其中有一个变量,结果就在对中

​ ③如果拼接的结果调用intern()方法,返回的结果就在常量池中

String常用方法

常用方法很多,需要String源码,理解其底层

/**
 *     public int length() {
 *         return value.length;
 *     }
 */
s1.length();//返回字符串的长度
/***
 *     public char charAt(int index) {
 *         if ((index < 0) || (index >= value.length)) {
 *             throw new StringIndexOutOfBoundsException(index);
 *         }
 *         return value[index];
 *     }
 */
s1.charAt(0);//返回某索引的字符
/**
 *     public boolean isEmpty() {
 *         return value.length == 0;
 *     }
 */
s1.isEmpty();//判断释放是空

s1.toUpperCase();//将所有的字符转成大写

s1.toLowerCase();//将所有的字符转成小写
String与char[]相互转换
		//String 转char[]
		
		String s1 = "hello";
		char[] c = s1.toCharArray();
		
		//char[]转String
		String s2 = new String(c);
String 与byte[]相互转换
//String 转byte[]

		String s1 = "hello";
		//默认设置字符集
		byte[] c = s1.getBytes();


		//byte[]转String
		String s2 = new String(c);


		/**
		 * 转成固定字符集
		 */
		try {
			//String 转byte[]
			byte[] c1 = s1.getBytes("gbk");
			//byte[]转String
			String s3 = new String(c1,"gbk");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
StringBuffer与StringBuilder

两者都继承AbstractStringBuilder,在AbstractStringBuilder可以看到底层存储依然是char[],但是没有被final修饰,所有都是可变的字符。

StringBuffer线程安全的,看源码可以看到方法都用synchronized修饰

StringBuffer线程不安全的,但是效率高

String 不可变

相关标签: 重学Java