java——String、StringBuffer、StringBuilder、包装类、单双引号
String:
String是一个特殊的类,被定义为final类型,为字符串常量,同样的字符串在常量池中不能重复。
但是由于使用关键字new创建新的字符串,java会在对中分配新的空间,这样即使字符串相同返回的引用也不相同。
public class Exp { public static void main(String[] args) { String a = "hello"; String b = "hello"; String c = new String("hello"); System.out.println(a==b); //true System.out.println(a==c); //false } }
而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
StringBuilder和StringBuffer: 对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。StringBuffer支持多线程,且具有线程安全性,该类的方法可以同步执行。缓冲区字符串的初始长度为字符串长度加16。str.capacity()
注意这里的equals()方法:String重写了equals(),这里的equals()比较的是String的值,而StringBuffer()继承了Object类的equals(),这个equals()比较的是地址。
记录一个子串在整串中出现的次数:
package package_name; public class exp { public static void main (String[] args) { String str = "abcssssasasasnddbiweabcabcahabcccccabqwertadabc"; String key = "abc"; int res = getCounts(str, key); System.out.println(res); } public static int getCounts(String str, String key) { int count = 0; int index = 0; if(!str.contains(key)) { return count; } while((index = str.indexOf(key) )!= -1) { str = str.substring(index + key.length()); count++; } return count; } }
包装类:
Java并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。但是我们在实际使用中经常需要将基本数据类型转化成对象,便于操作。比如:集合的操作中。这时,我们就需要将基本数据类型转化成对象。
装箱和拆箱的自动转换是在编译阶段完成的。
基本数据类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Character |
float | Float |
double | Double |
boolean | Boolean |
字符串排序:
package package_name; import java.util.Arrays; public class exp { private static final String SPACE_SEPARATOR = " "; public static void main (String[] args) { String str = "20 78 9 -7 88 36 29"; System.out.println(str); str = sortStringNumber(str); System.out.println(str); } public static String sortStringNumber(String str) { String[] str_arr = stringToArray(str); int[] int_arr = toIntArray(str_arr); mySortArray(int_arr); String temp = arrayToString(int_arr); return temp; } public static String[] stringToArray (String str){ String[] str_arr = str.split(SPACE_SEPARATOR); return str_arr; } public static int[] toIntArray(String[] str_arr) { int[] str_int = new int[str_arr.length]; for(int i=0;i<str_arr.length;i++) { str_int[i] = Integer.parseInt(str_arr[i]); } return str_int; } public static void mySortArray(int[] int_arr) { Arrays.sort(int_arr); } public static String arrayToString(int[] int_arr) { StringBuffer sb = new StringBuffer(); for(int i=0; i<int_arr.length; i++) { sb.append(int_arr[i] + SPACE_SEPARATOR); } return sb.toString(); } }
在Python中单双引号没什么区别,只是为了字符串中引入单双引号方便,但是在java中单双引号是不同的: