构造方法
String 类型的构造方法
- String s = “”; 最常用
String s = "hello";
- 2,String s = new String("");
String s = new String("hello");
- 3,String s = new String(char数组);
char[] chars = {'你','好'};
String s = new String(chars)
- 4,String s = new String(char数组,起始下标,长度)
char[] chars = {'你','好','世界'};
String s = new String(chars,1,2);
- 5,String s = new String(byte数组);
byte[] bytes = {97,98,99};
String s1 = new String(bytes);
System.out.println(s1);//abc
- 6,String s = new String(byte数组,起始下标,长度);
String s3 = new String(bytes,1,2);
System.out.println(s3);//表示从第一个元素起始位置开始,长度为2,将byte数组的一百部份转化为字符串
不同方式创建字符串对象内存的变化
字符串常量池:
字符串常量池是为了避免多次创建字符串对象,在JVM中开辟了一块空间,存储不同的字符串,开发效率也大大提高
在JDK1.7之前字符串常量池是存放在方法区内存当中的,从JDK1.7开始,字符串常量池被单独拿到堆内存中了
当以"" 的形式声明字符串,java会去字符串常量池当中寻找此字符串,如果字符串常量池中没有该字符串,则会在字符串常量池当中创建该字符串对象,并将字符串常量池中字符串对象的地址返回给该引用.如果字符串常量池当中又该字符串,直接将地址返回给引用
当以new String(" hello ")的方式来创建:这种情况会在堆内存中创建两个对象,首先"hello"会在字符串常量池中创建对象.new String()会在堆内存中创建一个对象,new String() 对象里存储的是 "hello"的引用,指向字符串常量池中的字符串对象.
字符串不可变
可以看看java.lang.String的源码.
value数组是用于字符的存储,这个数组被final修饰,数组创建之后,数组的长度不可变,final修饰的引用一旦指向一个对象之后,就不能在指向其他对象了.
因为java中的字符串是不可变的,每一次拼接会产生新字符串
这样会占用大量的方法区内存会给字符串常量池带来很大的压力。
这时候可以使用jdk中java.lang.StringBuffer
java.lang.StringBuider,
这是java.lang.StringBuffer类中的构造方法,他们也是用char[]数组存储字符的,但是并没有被final修饰,数组的长度可以改变,当调用无参构造方法的时候,数组默认长度为16.
String类的常用方法
//1,charAt(int index)
char c = "中国人".charAt(1);
System.out.println(c); // 国,
//2,compareTo(String anotherString)
int result = "abc".compareTo("abc");
System.out.println(result);// 0
int result1 = "abcd".compareTo("abce");
System.out.println(result1);//-1
int result2 = "abce".compareTo("abcd");
System.out.println(result2);//1
//3,boolean contains(CharSequence s)
System.out.println("HelloWord.java".contains(".java"));//true
//4,boolean endsWith(String suffix)
System.out.println("HelloWord.java".endsWith(".java"));//true
System.out.println("HelloWord.java".endsWith(".txt"));//false
//5,boolean equals(Object anObject)
System.out.println("ab".equals("ab"));//true
System.out.println("ab".equals("cb"));//false
//6,boolean equalsIgnoreCase(String anotherString)
System.out.println("AB".equalsIgnoreCase("ab"));//true
//7,byte[] getBytes()
byte[] bytes = "abcdef".getBytes();
System.out.println(Arrays.toString(bytes));//[97, 98, 99, 100, 101, 102]
//8,int indexOf(String str)
System.out.println("python,java,c++".indexOf("c++"));//12
//9,boolean isEmpty()
System.out.println("".isEmpty());//true
System.out.println(" ".isEmpty());//false
//10,int length()
System.out.println("abc".length());//3
//11,int lastIndexOf(String str)
System.out.println("python,java,c++,python,java,c++".lastIndexOf("c++"));//28
//12,String replace(CharSequence target, CharSequence replacement)
String s = "http://www.baidu.com".replace("http://","https://");
System.out.println(s);// https://www.baidu.com
String ss = "www.baidu.com".replace("baidu","google");
System.out.println(ss);
//13,String[] split(String regex) 是以某个字符串来分割
String[] s1 = "1989-19-12".split("-");
System.out.println(Arrays.toString(s1));//[1989, 19, 12]
//14,boolean startsWith(String prefix)
System.out.println("HelloWord.java".contains(".java"));//false
//15,String substring(int beginIndex) 截取字符串
System.out.println("http://www.baidu.com".substring(7));//www.baidu.com
//16,String substring(int beginIndex, int endIndex)
System.out.println("http://www.baidu.com".substring(7,10));//www
//17,char[] toCharArray()
char[] chars = "中国人".toCharArray();
System.out.println(Arrays.toString(chars));//[中, 国, 人]
//18,String toLowerCase()
System.out.println("ABAJS".toLowerCase());//abajs
//19,String toUpperCase()
System.out.println("abcdl".toUpperCase());//ABCDL
//20,String trim()
System.out.println(" shi sji ".trim());//shi sji
//21,static String valueOf(参数)
String s3 = String.valueOf(true);
System.out.println(s3);//"true"
//22,String intern()
new String("Hello").intern();