1.String类
- String类代表字符串
- String是一个final类,表示不可变
- 字符串是常量,创建之后不能更改
- String对象的字符串内容存放在一个value数组中
package concurrent_programming.chapter3;
public class StringCreateDemo {
public static void main(String[] args) {
//方式1
String str="abc";
System.out.println(str);
//方式2
String s1=new String();
System.out.println(s1);
//方式2
String s2=new String(str);
System.out.println(s2);
//方式4
char a[]={'1','2','3','4'};
String s3=new String(a);
System.out.println(s3);
//方式5
String s4=new String(a,0,2);//a[0]开始取2个字符
System.out.println(s4);
}
}
abc
abc
1234
12
String s1=“abc”;和String s2=new String(“abc”);的区别
第一种方式创建的字符串常量存放在常量池中
第二种方式创建的非常量对象在堆中,对象里面的内容如果常量池中有则不在常量池重新创建
package JavaBasis.chapter9;
public class StringEqualsDemo {
public static void main(String[] args) {
String s1="abc";
String s2="abc";
String s3=new String("abc");
String s4=new String("abc");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s1==s4);//false
System.out.println(s3==s4);//false
}
}
package JavaBasis.chapter9;
public class StringEqualsDemo2 {
public static void main(String[] args) {
Person p1=new Person();
p1.name="tom";
Person p2=new Person();
p2.name="tom";
System.out.println(p1.name.equals(p2.name));//true
System.out.println(p1.name==p2.name);//true
System.out.println(p1.name=="tom");//true
String s1=new String("abc");
String s2=new String("abc");
System.out.println(s1==s2);//false
}
}
class Person{
String name;
int age;
}
常量与常量的拼接结果在常量池,常量池中每个字符串常量只有一份
+两边只要有一个是变量,结果就在堆中
如果拼接的结果调用intern()方法,返回值就在常量池中
package JavaBasis.chapter9;
import javax.naming.ldap.ManageReferralControl;
public class StringEqualsDemo3 {
public static void main(String[] args) {
String s1="hello";
String s2="world";
String s3="hello"+"world";
String s4="helloworld";
String s5=s1+"world";
String s6=s1+s2;
String s7=(s1+s2).intern();
System.out.println(s3==s4);//treu
System.out.println(s5==s4);//false
System.out.println(s6==s4);//false
System.out.println(s7==s4);//true
}
}
- Java是值传递机制
package JavaBasis.chapter9;
public class StringTest {
String str=new String("good");
char ch[]={'t','e','s','t'};
public void change(String str,char ch[])
{
str="test ok";
ch[0]='b';
}
public static void main(String[] args) {
StringTest st=new StringTest();
st.change(st.str, st.ch);
System.out.println(st.str);//good
System.out.println(st.ch);//best
}
}
2.字符串常用方法
3.StringBuffer类
- StringBuffer是可变的字符序列
- StringBuffer():初始容量为16的字符串缓冲区
- StringBuffer(int size):构造指定容量的字符串缓冲区
- StringBuffer(String str):将内容初始化为指定字符串的内容
- 当append和insert时,如果数组长度不够,可以扩容
4.StringBuilder类
- StringBuilder和StringBuffer非常类似,均代表可变的字符序列,提供的相关功能和方法也一致
5.三种字符串类的区别
- String: 不可变序列
- StringBuffer:可变字符序列,效率低,线程安全
- StringBuilder:可变字符序列,效率高,线程不安全
package javabasis.chapter9;
public class StringTest2 {
public static void main(String[] args) {
String str=null;
StringBuffer sb=new StringBuffer();
sb.append(str);//当作字符串"null"
System.out.println(sb.length());
System.out.println(sb);
StringBuffer sb1=new StringBuffer(str);
System.out.println(sb1);
}
}
4
null
Exception in thread "main" java.lang.NullPointerException
at java.lang.StringBuffer.<init>(StringBuffer.java:139)
at javabasis.chapter9.StringTest2.main(StringTest2.java:11)
6.Java比较器
Java实现对象排序的方式有两种:
1.自然排序: java.lang.Comparable
2.定制排序: java.lang.Comparator
- 自然排序 java.lang.Comparable
package javabasis.chapter9;
import java.util.Arrays;
public class ComparableTest {
public static void main(String[] args) {
Goods all[]=new Goods[4];
all[0]=new Goods("<<红楼梦>>",100);
all[1]=new Goods("<<西游记>>",80);
all[2]=new Goods("<<水浒传>>",120);
all[3]=new Goods("<<三国演义>>",110);
Arrays.sort(all);
System.out.println(Arrays.toString(all));
}
}
class Goods implements Comparable{
private String name;
private double price;
//根据价格 比较商品大小
public int compareTo(Object o)
{
if(o instanceof Goods)
{
Goods other=(Goods)o;
if(this.price>other.price)
return 1;//自己比较大
else if(this.price<other.price)
{
return -1;
}
return 0;
}
throw new RuntimeException("输入数据类型不一致");
}
public Goods(String name,double price)
{
this.name=name;
this.price=price;
}
public String toString()
{
return "name:"+name+" price:"+price+"\n";
}
}
[name:<<西游记>> price:80.0
, name:<<红楼梦>> price:100.0
, name:<<三国演义>> price:110.0
, name:<<水浒传>> price:120.0
]
- 定制排序 java.lang.Comparator
package javabasis.chapter9;
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorTest {
public static void main(String[] args) {
Goods all[]=new Goods[4];
all[0]=new Goods("<<红楼梦>>",100);
all[1]=new Goods("<<西游记>>",80);
all[2]=new Goods("<<水浒传>>",120);
all[3]=new Goods("<<三国演义>>",100);
Arrays.sort(all,new Comparator() {
public int compare(Object o1,Object o2)//重写compare方法
{
Goods g1=(Goods)o1;
Goods g2=(Goods)o2;
return g1.price.compareTo(g2.price);
}
});
System.out.println(Arrays.toString(all));
}
}
class Goods {
String name;
Double price;//不能是基本类型
public Goods(String name,double price)
{
this.name=name;
this.price=price;
}
public String toString()
{
return "name:"+name+" price:"+price+"\n";
}
}
[name:<<西游记>> price:80.0
, name:<<红楼梦>> price:100.0
, name:<<三国演义>> price:100.0
, name:<<水浒传>> price:120.0
]
package javabasis.chapter9;
import java.util.Arrays;
import java.util.Comparator;
public class ArrayDescent {
public static void main(String[] args) {
int arr1[]=new int[]{1,5,2,4,6,1};
Integer arr2[]=new Integer[]{1,5,2,4,6,1};//需要包装类类型
Arrays.sort(arr1);
System.out.println("升序:"+Arrays.toString(arr1));
Arrays.sort(arr2,new Comparator<Integer>() {
public int compare(Integer o1,Integer o2)
{
return o2.compareTo(o1);
}
});
System.out.println("降序:"+Arrays.toString(arr2));
}
}
升序:[1, 1, 2, 4, 5, 6]
降序:[6, 5, 4, 2, 1, 1]
7.BigInteger、BigDecimal类
- 构造器 BigInteger(String val) : 根据字符串创建BigInteger对象
package javabasis.chapter9;
import java.math.BigDecimal;
import java.math.BigInteger;
public class BigIntegerTest {
public static void main(String[] args) {
BigInteger bi=new BigInteger("123");
BigDecimal bd=new BigDecimal("123.456");
System.out.println(bi);//123
System.out.println(bi.add(new BigInteger("123")));//246
System.out.println(bi);//123
}
}