JavaSE基础
1.String
String的特点:String类型也就是我们所谓的"字符串类型"
字符串类型是不可改变的,字符串引用变量可以改变
在基本类型(8个)用比较值的大侠
在引用变量中-==比较的是:是否指向同一个对象或者是否指向同一个常量池
public class DemoString {
public static void main(String[] args) {
String s1 ="ABC";
String s2 = s1;
String s3 = "ABCDEF";
s1 = s1+"DEF";//字符串拼接
System.out.println(s1);
System.out.println(s2);
System.out.println(s1==s3);
}
}
String是不可改变的对象
-
java.lang.String使用了final修饰,不能被继承,字符串一旦创建,对象将永远无法改变,但字符串引用可重新赋值;
-
String常量池:java为提高性能,静态字符串(字面量/常量/字符串连接的结果)在常量池中创建,并尽量使用同一个对象,重用静态字符串;
-
对应重复出现的字符串,JVM会首先在常量池中查找,如果存在即可返回该对象
public class DemoString01 {
public static void main(String[] args) {
String s1="ABC";//不能改变,加拼接符可以改变
String s2=s1;
/*
* "=="用于基本类型比较变量的值大小
* 在引用变量中:说明两个引用是否指向同一个对象!
*/
System.out.println(s1==s2);//true
String s3="ABC";
String s4="ABC";
//s3和s4引用同一个对象,优点是重用字符串对象。
System.out.println(s3==s4);//true
String s5="A";
String s6=s5+"BC"; //变量连接的结果(“ABC”)
//创建动态新字符串对象,不会被常量池优化,与静态字符串“ABC”不是同一个对象
System.out.println(s3==s6);//false
//这里字符串对象的参数是常量池中的字符串对象“ABC"
String s7 = new String("ABC");
System.out.println(s3==s7);
}
}
2.经典面试题
public class DemoString02 {
public static void main(String[] args) {
String str = new String("DEF");
//如上代码执行期间创建了几个字符串对象 答案:B
//A.1 B.2 C.3 D.4
String s1 = new String("A"+"BC");
//如上代码执行期间创建了几个字符串对象 答案:B
//A.1 B.2 C.3 D.4
}
}
3.String相关的常用方法
- length()方法检查字符串的个数(字符串长度);返回的是int类型
- String长度length()方法,数组长度是length属性
- String提供了charAt()方法,获取指定位置上的字符,返回char类型
- 利用length()方法和charAt()方法配合使用可以实现遍历字符串中每个字符
- indexof()检查字符串中的字符,如果查找到则返回下标数字,如果没找到则返回-1;例(indexOf(“1”,7)表示从下标7开始检查,如果检查到返回下标位置,如果没搜索到返回-1;
- String提供了从后面向前查找lastIndexOf(String str);str=97 用ASCII编码表示
public class DemoString04 {
public static void main(String[] args) {
/*
* 使用length()方法检查字符串的个数(字符串的长度)
* 返回int类型
*/
String str ="今早你吃早点了吗?";
int n=str.length();
System.out.println(n);
/*
* String长度length()方式
* 数组长度是length属性
*/
int[] arr = {1,2,3,4,5};
int n1 = arr.length;
System.out.println(n1);
/*
* String提供了charAt方法,获取指定位置上的字符
* 返回一个char类型
*/
char ch = str.charAt(1);
System.out.println(ch);//早
/*
* 利用length方法和charAt方法配合可以实现遍历字符串中每个字符
*/
for(int i=0;i<str.length();i++){
char c = str.charAt(i);
System.out.print(c);
}
//0123456789................
String str = "http://ykt.com/index.ht2ml";
//在字符串str中检查斜线"/"出现的位置,如果找到第一个字符的位置,就返回这个位置
//如果没有找到指定的字符,则返回-1;
int n = str.indexOf("u");
//System.out.println(n);
//查找字符串时候返回的是匹配字符的启始位置
n=str.indexOf("com");
//System.out.println(n);
/*
* String提供了indexOf(String str,int index)从index下标开始检查,检查到str.
* 返回str的检索/下标位置,如果没有搜索到则返回-1
*/
n = str.indexOf("ht", 7);
//System.out.println(n);
/*
* 从后面向前查找
* String提供了lastIndexOf(String str)
*/
n = str.lastIndexOf("/");
//System.out.println(n);//14
int s = str.indexOf(97); //char('a')---->97
System.out.println(s);
byte[] a = str.getBytes();
System.out.println(Arrays.toString(a));//输出的是ASCII编码
}
}
- String类提供了subString(int beginindex,int endIndex)(含头不含尾,不含结束的下标);例(subString(7);表示从下标7之后,全部截取)
- subString(7,7+4);//从7开始连续截取4个字符
- 也可以动态截取,用indexOf("/",7);表示从下标7开始截取,截取到"/"出现位置,一般可以用在获取url地址中
public class DemoString06 {
public static void main(String[] args) {
//0123456789
String str = "http://ykt.com/index.html";
/*
* String类提供了
* substring(int beginIndex, int endIndex);
* 含头不含尾(含开始的下标,不含结束的下标)
*/
String s = str.substring(0, 4);
System.out.println(s);
//截取str中的域名“ykt.com"
String s1 = str.substring(7, 14);
System.out.println(s1);
//从7开始连续截取4个字符
String s2 = str.substring(7,7+4);
System.out.println(s2);
//截取str中的“ykt.com/index.html”;
/*
* String提供了substring(int index)方法
* 从启始位置到最后全部截取为子字符串
*/
String s3 = str.substring(7, 25);
String s4 = str.substring(7);
System.out.println(s3);
System.out.println(s4);
/*
* 动态截取URL中主机名
* 0123456789
* http://xiaoding.org/index.html
*/
String url = "http://xiaoding.org/index.html";
int index = url.indexOf("/",7);
System.out.println(index);
String host = url.substring(7, index);
System.out.println(host);
//截取URL中的文件名“index.html"利用lastIndexOf()
int index1 = url.indexOf("l",20);
String text = url.substring(20, index1);
System.out.println(text);
/*
int n = url.lastIndexOf("/");
System.out.println(n);
String u = url.substring(n+1);
System.out.println(u);*/
//String u = url.substring(url.lastIndexOf("/")+1);
//System.out.println(u);
}
}
- 去除两端空白,trim()如果两字符串两端有空白则返回这个字符串的一个两端没有空白的副本,但是字符串中间的空格是不能去掉的.
- 当去掉字符串两边的空格之后,产生新的没有空格的副本与原来的字符串是不同的.
- 如果输入的是" Tom ",之后再new 一个"Tom"两个也是不同的.
public class DemoString07 {
public static void main(String[] args) {
/*
*去除当前字符串的两端空白
*trim()如果两字符串两端有空白则返回这个字符串的一个两端没有空白的副本
*/
String str=" Tom ";
System.out.println(str.length());
str = str.trim();
System.out.println(str.length());
str=" T O M ";
str = str.trim();
System.out.println(str);
String a = "A";
String b = "B";
String c=a+b;
String d ="AB";
System.out.println(d == c);
String s = " Tom";
String s1 = s.trim(); //Tom 正本和副本是不一样的,但是在常量池中没有
System.out.println(s==s1);//false
String s2 = "Tom"; //在常量池里面有没有Tom,生产的副本不在常量池中
System.out.println(s1==s2);//false
String s3 = "Jerry";
String s4 = s3.trim();
System.out.println(s3==s4);//true
//并没有赋值,答案仍旧是” TOM “
String name =" TOM ";
name.trim();
}
}
- String类提供了startWith(String str)监测一个字符串是否以指定字符串开头
- String类提供了endWith(String str)监测一个字符串是否以指定字符串结尾
/*//类似于main方法
@Test
public void t(){
System.out.println("dadadada");
}*/
@Test
public void testStartsWith(){
/*
* String类提供了startsWith(String str) 检测一个字符串是否以
* 指定字符串开头
*/
String str = "http://baidu.com";
if(str.startsWith("http")){
System.out.println("是");
} else {
System.out.println("否");
}
}
@Test
public void testEndWith(){
/*
* String类提供了endsWith(String str) 检测一个字符串是否以
* 指定字符串结尾
*/
String str = "http://baidu.com";
if(str.endsWith("com")){
System.out.println("T");
} else {
System.out.println("F");
}
}
@Test
public void test01(){
/*
* 检测输入的用户名是否以“王”开头
*/
Scanner scanner = new Scanner(System.in);
System.out.println("请输入用户的姓名");
String name = scanner.nextLine();
if(name.startsWith("王")){
System.out.println("对的");
} else {
System.out.println("错了");
}
}
@Test
public void test(){
String url = "http://ykt.com/index.html";
/*
* 运用indexOf() substring() startsWith() 动态截取域名“ykt.com
*/
int start = url.startsWith("http")?7:6;
int end = url.indexOf("/",7);
String host=url.substring(start,end);
System.out.println(host);
}
}
- String类提供了split();split(String str) str是分隔符返回一个字符串数组
public class DemoString09 {
public static void main(String[] args) {
String str ="你好,益康特,我在这里学习Java";
String[] strArr = str.split(",");
System.out.println(strArr.length);
for(int i=0;i<strArr.length;i++){
System.out.println(strArr[i]);
}
}
}
- StringBulider 是可变字符串,建议采用StringBulider实现,这样性能会好一些;
- StringBuffer和StringBuilder的区别
(1) StringBuffer是线程安全的,同步处理,性能稍慢
(2) StringBuilder是线程不安全的,并发处理,性能稍快 - StringBulider类中提供了
append增加方法,用法:sb.append(“java”);
insert()减少方法,用法:sb.insert(4, “c##”);第一个变量表示插入位置,第二个变量指定的是插入指定的字符串
delete()删除方法,用法:sb.delete(int start,int end),start:删除指定字的起始位置,end:删除指定字符的结束位置,含头不含尾部
package day01;
/*
* StringBuffer和StringBuilder区别
* 1.StringBuffer是线程安全的,同步处理,性能稍慢
* 2.StringBuilder是线程不安全的,并发处理的,性能稍快
*
* 如果我们不考虑线程安全问题,则选择性能快的StringBuilder
*
*
* @since 始于JDK版本
* @see java.lang.StringBulider 参见
*
*/
public class DemoStringBulider {
/**
* 方法功能说明
* @param 参数
* @return ""
* @throws 抛出异常
*/
public String test(){
return "";
}
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
/*
* StringBulider类中提供了append增加方法
* insert()减少方法 delete()删除方法
*/
sb.append("java");
sb.append("php");
sb.append("C");
/*
* 把StringBulider转换成String类型,在StringBuilde类调用toString()方法
*/
String str = sb.toString();
System.out.println(str);
/*
* insert(int offset,String str)
* offset:插入位置(下标)
* str:插入指定的字符串
*/
sb.insert(4, "c##");
System.out.println(sb.toString());
/*
* 删除指定的字符串
* sb.delete(int start, int end)
* start:删除指定字符的起始位置
* end:删除指定字符串的结束位置
* 含头不含尾
*/
sb.delete(7, 10);
System.out.println(sb.toString());
StringBuilder sb2 =new StringBuilder();
sb2.append("你好").append("我很好").insert(2, "小丁").delete(4, 7);
System.out.println(sb2.toString());
StringBuffer s = new StringBuffer();
s.append("1").append("哈喽").insert(3, ",小哥哥").delete(0, 1);
System.out.println(s.toString());
}
}