/**
* String是不变对象,即:
* 字符串对象创建后,内容不可改变,一旦想改变内容会创建新对象。
* 创建字符串对象推荐使用字面量的形式,这样做会重用对象,减小内存开销。
* @author Administrator
*/
public class StringTest1 {
public static void main(String[] args) {
String str1 = "helloworld";
String str2 = "helloworld";
String str4 = new String("helloworld");
/*
* 编译器在编译程序时,若发现一个计算表达式的操作符两边都是字面量时,
* 会直接将结果计算出来并编译到class文件中, 所以JVM在读取class文件时,
* 下面的代码变为:String str5 = "helloworld";
*/
String str5 = "hello"+"world";
String info = "hello";
String str6 = info + "world";
System.out.println(str1==str2);//true
System.out.println(str1==str4);//false
System.out.println(str1==str5);//true
System.out.println(str1==str6);//false
}
}
/**
* 操作字符串的一些方法
* @author Administrator
*/
public class StringTest2 {
public static void main(String[] args) {
String str = "thinking in java";
/**
* int indexOf(String str)
* 检查给定字符串在当前字符串中的位置若当前字符串不包含给定内容,返回值为-1.
*/
int index = str.indexOf("in");
System.out.println(index);//2
/*
* 重载方法,可以从指定下标处开始查找第一次出现指定字符的位置。
*/
index = str.indexOf("in", 3);
System.out.println(index);//5
/*
* int lastIndexOf(String str)
* 找到当前字符串中最后一次出现给定字符串的位置
*/
int last = str.lastIndexOf("in");
System.out.println(last);//9
/**
* String substring(int start,int end)
* 截取字符串
* 从当前字符串的start处开始,连续截取到end处。
* 需要注意的是,截取的字符串不包含end处对应的字符。
* 在java api中,通常使用2个数字表示范围时,都是"含头不含尾的"。
*/
String str = "www.oracle.com";
//截取"oracle"
String sub = str.substring(4,10);
System.out.println(sub);
/*
* 重载方法只传入一个参数,就是从该位置处开始,连续截取到字符串末尾
*/
sub = str.substring(4);
System.out.println(sub);
/*
* 通过Scanner获取用户输入的一个地址,如:
* www.tedu.com www.baidu.com
* http://www.sina.com
* http://www.xxx.com.cn
* 经过处理,输出其中的域名,如 tedu baidu sina xxx
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个地址:");
String loc = scanner.nextLine();
//第一个"."之后第一个字符的位置
int start = loc.indexOf(".")+1;
//第二个"."的位置
int end = loc.indexOf(".",start);
sub = loc.substring(start,end);
System.out.println("域名:"+sub);
/**
* String trim()
* 去除当前字符串中两边的空白字符
*/
String str = " java ";
String trim = str.trim();
System.out.println(trim);//java
/**
* char charAt(int index)
* 获取当前字符串中指定位置上的字符
*/
String str = "thinking in java";
char c = str.charAt(9);
System.out.println(c);//i
/**
* boolean startsWith(String str)
* 判断当前字符串是否是以给定的字符串开始的
*
* boolean endsWith(String str)
* 判断当前字符串是否是以给定的字符串结尾的
*/
boolean starts = str.startsWith("think");
System.out.println("starts:"+starts);//true
boolean ends = str.endsWith("ava");
System.out.println("ends:"+ends);//true
/**
* String toUpperCase()
* 将当前字符串中的英文字母转换为全大写
*
* String toLowerCase()
* 将当前字符串中的英文部分转换为全小写
*/
String str = "我爱Java";
String upper = str.toUpperCase();
System.out.println(upper);//我爱JAVA
String lower = str.toLowerCase();
System.out.println(lower);//我爱java
/**
* String提供了若干个valueOf的重载方法,这些方法都是静态的,
* 作用是将java中其他类型转换为字符串。常用的是将基本类型转换为字符串。
*/
int i = 123;
//"123"
String iStr = String.valueOf(i);
System.out.println(iStr);
iStr = 123+"";//简便的方法
String dStr = String.valueOf(123.123);
System.out.println(dStr);
}
}
/**
* java.lang.StringBuidler
* 使用该类来编辑字符串内容。
* 由于使用String频繁修改字符串对系统开销巨大,所以频繁修改字符串时,
* 应当时用StringBuilder来解决
* StringBuilder提供了便于编辑字符串相关方法
* append,delete,replace,insert
* 增,删,改,插
* @author Administrator
*
*/
public class StringBuilderTest{
public static void main(String[] args) {
String str = "努力学习java";
//将字符串转化为StringBuilder来修改内容
StringBuffer builder = new StringBuffer(str);
//将StringBuilder中的字符串获取
str = builder.toString();
System.out.println(str);
/*
* 努力学习java,为了找个好工作!
* StringBuilder append(String str)
* 将给定的字符串追加到当前字符串末尾
*/
builder.append(",为了找个好工作!");
System.out.println(builder.toString());
/*
* 努力学习java,为了找个好工作!修改为:
* 努力学习java,就是为了改变世界!
*
* StringBuilder replace(int start,int end,Strin str)
* 用给定字符串替换指定范围内的原字符串。
*/
builder.replace(9, 16, "就是为了改变世界");
System.out.println(builder.toString());
/*
* 努力学习java,就是为了改变世界!
* 修改为: ,就是为了改变世界!
* StringBuilder delete(int start,int end)
* 删除当前字符串指定范围内的字符
*/
builder.delete(0, 8);
System.out.println(builder.toString());
/*
* ,就是为了改变世界!
* 修改为:活着,就是为了改变世界!
*
* StringBuilder insert(int index,String str)
* 将给定的字符串插入到指定位置
*/
builder.insert(0, "活着");
System.out.println(builder.toString());
//翻转字符串
builder.reverse();
System.out.println(builder.toString());
/**
* StringBuilder修改字符串效率高
*/
String str = "a";
StringBuilder builder = new StringBuilder(str);
for(int i=0;i<10000000;i++){
builder.append("a");
}
System.out.println("完毕!");
}
}
/**
* 测试Point类重写Object的相关方法
* @author Administrator
*/
public class TestPoint {
public static void main(String[] args) {
Point p = new Point(1,2);
/*
* Object中定义的toString方法返回的是对象的句柄(对象的地址)
* 格式为:类名@地址
*/
String str = p.toString();
System.out.println(str);
Point p1 = new Point(1,2);
System.out.println(p==p1);
/*
* Object提供的equals方法就是使用* "=="进行比较的,所以并无实际意义。
* 当我们需要使用一个类的equals方法时应当重写它。
* java API提供的类基本都实现了该方法。
* 对于引用类型变量而言:
* "==":值比较,在这里就是地址的比较,所以两个引用类型变量指向同一个
* 对象时才为true,所以比较的是 是否为"同一个"
*
* "equals":内容比较,比较的是两个对象的内容是否一样,
* 所以比较的是"像不像"
*/
System.out.println(p.equals(p1));
}
}
/**
* 使用该类测试Object中的方法:
* String toString()
* boolean equals(Object o)
* @author Administrator
*
*/
public class Point {
private int x;
private int y;
public Point(int x,int y){
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
/**
* 重写toString方法
* 当我们调用一个类的toString方法时,就应当重写该方法,
* 因为Object提供的toString方法返回的句柄没有什么实际意义。
* toString返回的字符串应当包含当前类的属性信息。
* 具体格式可以根据实际开发需求而定。
* 需要看到那些属性,就将那些属性拼接到字符串中。
*/
public String toString(){
return "("+x+","+y+")";
}
/**
* 重写equals方法
* 目的是比较两个对象的内容是否一致,并不是说所有属性都一样,
* 才叫内容一致,这个要结合将来实际开发需求。
*/
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(obj == this){
return true;
}
if(obj instanceof Point){
Point p = (Point)obj;
return this.x==p.x&&this.y==p.y;
}
return false;
}
}