概述: String类代表字符串
特点:
Java程序中的所有字符串字面值(如 “abc”) 都作为此类的实例(对象)实现
String s = "abc";
"abc" 就是对象 , String是对象的类型 , s是对象名
凡是带双引号的 , 都是String的对象
字符串是常量 , 它们的值在创建后不可更改
String s = "abc";
s += "de"; - > 产生了新对象
String对象是不可变的 , 所以可以共享
String s1 = "abc";
String s2 = "abc";
System.out.println(s1==s2); //true
String()
String() -> 利用String的空参构造 , 创建String对象
String(String original)
String(String original) -> 利用String有参构造,创建String对象,传递String类型的参数
String(char[] original)
String(char[] original) -> 根据char数组创建String对象
String(byte[] bytes)
`**[String](../../java/lang/String.html#String(byte[]))**(byte[] bytes)`
注意 : 平台指的是 操作系统
操作系统默认字符集 : GBK
GBK : 一个中文占2个字节
utf-8 : 一个中文占3个字节
1.String(char[] value,int offset,int count)
String(char[] value,int offset,int count) ->将字符数组一部分转成String
value:要转的数组
offset:从数组的哪个索引开始转
count:转多少个
char[] chars1 = new char[]{'a','b','c','d','e','f'};
String s7 = new String(chars1,2,4);
System.out.println(s7); //cdef
2.String(byte[] bytes, int offset, int length)
String(byte[] bytes, int offset, int length)->将字节数组一部分转成String
bytes:要转的数组
offset:从数组的哪个索引开始转
length:转多少个
byte[] bytes = new byte[]{97,98,99,100,101,102};
String s8 = new String(bytes,1,3);
System.out.println(s8);
public class Demo03String {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abc");
System.out.println(s1==s2);//true
System.out.println(s1==s3);//false
System.out.println(s2==s3);//false
}
}
问题: String s = new String("abc")->共创建了几个对象?
1个或者2个
a.如果new对象之前abc已经创建出来了,那么String s = new String("abc")就创建了一个
b.如果new对象之前abc没有创建出来,那么String s = new String("abc")会创建2个
public class Demo04String {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
String s4 = "hello"+"world"; //helloworld
String s5 = s1+"world"; //helloworld
String s6 = s1+s2; //helloworld
System.out.println(s3==s4);//true
System.out.println(s3==s5);//false
System.out.println(s3==s6);//false
}
}
字符串拼接:
1.等号右边如果是字符串字面值,不会产生新对象
2.等号右边如果有变量参与拼接,会产生新对象
boolean equals(String s) ->比较字符串内容
boolean equalsIngoreCase(String s) ->比较字符串内容,忽略大小写
public class Test {
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1.equals(s2)); //true
String s3 = "AbC";
System.out.println(s1.equalsIgnoreCase(s3)); //true
}
}
已知用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示
步骤:
1.定义两个字符串分别代表已经注册过的用户名和密码:
String username = "root";
String password = "1234"
2.创建Scanner对象,调用next方法输入用户名和密码
3.比较,如果用户名和密码都一样,登录成功,否则登录失败
public class LoginTest {
public static void main(String[] args) {
String username = "root";
String password = "1234";
Scanner sc = new Scanner(System.in);
for (int i = 0; i < 3; i++) {
System.out.print("请输入账户名:");
String name = sc.next();
System.out.print("请输入密码:");
String pwd = sc.next();
if(username.equals(name) && password.equals(pwd)){
System.out.println("登录成功");
break;
}else{
if(i==2){
System.out.println("账号冻结");
}else{
System.out.println("登录失败");
}
}
}
sc.close();
}
}
注意 : 比较字符串在开发中的实际使用注意事项:我们应该将确定的字符串放到前面,将不确定字符串变量放到后面,防空指针
如果对象为null , 再去点方法, 就会出现NullPointerException
我们应该将确定的字符串放到前面
将不确定字符串变量放到后面
这样就可以避免空指针异常
工具类 Objects java.util.Objects
方法: 判断两个对象是否相等
调用: Objects.equals(Object obj1 , Object obj2);
public static boolean equals(Object obj1,Object obj2){ return (a==b) || ((a!=null) && a.equals(b)); }
public class LoginTest { public static void main(String[] args) { String username = "root"; String password = "1234"; Scanner sc = new Scanner(System.in); for (int i = 0; i < 3; i++) { System.out.print("请输入账户名:"); String name = sc.next(); System.out.print("请输入密码:"); String pwd = sc.next(); if(Objects.equals(username,name)&&Objects.equals(password,pwd)) { System.out.println("登录成功"); break; }else{ if(i==2){ System.out.println("账号冻结"); }else{ System.out.println("登录失败"); } } } sc.close(); } }
遍历字符串
public class Bianli {
public static void main(String[] args) {
String s1 = "abcdefg";
for (int i = 0; i < s1.length(); i++) {
System.out.print(s1.charAt(i)+" ");
}
}
}
public int length():返回字符串的长度
public String concat(String str):将指定的字符串str拼接到原字符串末尾
char charAt(int index):返回指定索引处的char值
int indexOf(String str):获取的是指定字符串在原字符串中第一次出现的索引值
String substring(int beginIndex):返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动
String substring(int beginIndex, int endIndex) :返回一个子字符串,从beginIndex到endIndex截取 字符串, 含beginIndex,不含endIndex
public class Test {
public static void main(String[] args) {
String s1 = "abcdefg";
//获取字符串的长度
System.out.println("s1.length() = " + s1.length()); //7
//将指定的字符串拼接到老串的末尾
System.out.println("s1.concat(\"hijk\") = " + s1.concat("hijk")); //abcdefghijk
//返回指定索引处的char值
System.out.println("s1.charAt(3) = " + s1.charAt(3)); //d
//获取的是指定字符串在老串中第一次出现的索引位置
System.out.println("s1.indexOf(\"de\") = " + s1.indexOf("de")); //3
//返回一个子字符串,从beginIndex开始截取字符串到字符串末尾,老串不动
System.out.println("s1.substring(2) = " + s1.substring(2)); //cdefg
//返回一个子字符串,从beginIndex到endIndex截取字符串, 含beginIndex,不含endIndex
System.out.println("s1.substring(2,5) = " + s1.substring(2, 5)); //cde
}
}
char[] toCharArray()-> 将字符串转成char数组
byte[] getBytes() -> 将字符串转成byte数组
String replace(CharSequence c1,CharSequence c2)->替换
CharSequence->是String的一个接口
扩展:
byte[] getBytes(String charsetName)-> 按照指定编码将字符串转成byte数组
public class Test {
public static void main(String[] args) throws UnsupportedEncodingException {
String s1 = "abcdefg";
//char[] toCharArray()-> 将字符串转成char数组
char[] chars = s1.toCharArray();
for (int i = 0; i < chars.length; i++) {
System.out.print(chars[i]+" ");
}
System.out.println();
System.out.println("------------------");
//byte[] getBytes() -> 将字符串转成byte数组
byte[] bytes = s1.getBytes();
for (int i = 0; i < bytes.length; i++) {
System.out.print(bytes[i] + " ");
}
System.out.println();
System.out.println("------------------");
//String replace(CharSequence c1,CharSequence c2)->替换
// CharSequence->是String的一个接口
String replace1 = s1.replace("bcd","mn");
System.out.println(replace1);
//byte[] getBytes(String charsetName)-> 按照指定编码将字符串转成byte数组
byte[] bytes1 = "你好".getBytes();
for (int i = 0; i < bytes1.length; i++) {
System.out.print(bytes1[i]+" ");
}
System.out.println();
byte[] bytes2 = "你好".getBytes("gbk");
for (int i = 0; i < bytes2.length; i++) {
System.out.print(bytes1[i]+" ");
}
}
}
键盘录入一个字符串,统计该字符串中大写字母字符,小写字母字符,数字字符出现的次数(不考虑其他字符)
步骤:
1.创建Scanner对象,调用next方法录入一个字符串
2.定义三个变量,分别统计大写字母,小写字母,数字个数
int big = 0;
int small = 0;
int number = 0
3.遍历字符串,将字符串中的每一个字符都获取出来
4.判断,如果是大写,big++
a.大写字母ASCII码值: 65-90
假如B->ASCII码值66,在65-90之间,证明是大写字母
5.如果是小写,small++
a.小写字母ASCII码值: 97-122
假如b->ASCII码值:98,在97-122之间,证明是小写字母
6.如果是数字,number++
a.数字ASCII码值:48-57
假如1->ASCII码值:49 -> 在48-57之间,证明是数字
7.输出
public class exercise04 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int big = 0;
int small = 0;
int number = 0;
System.out.print("请输入一个字符串:");
String str = sc.next();
char[] chars = str.toCharArray();
for (int i = 0; i < chars.length; i++) {
int num = chars[i];
if(num >= 'A' && num <= 'Z'){
big++;
}
if(num >= 'a' && num <= 'z'){
small++;
}
if(num >= '0' && num <= '9'){
number++;
}
}
System.out.println("big = " + big);
System.out.println("small = " + small);
System.out.println("number = " + number);
sc.close();
}
}
String[] split(String regex):按照指定规则分割字符串,返回String数组
public class exercise_split {
public static void main(String[] args) {
String s1 = "abc-d-e-fg";
String[] arr = s1.split("-");
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
}
1.boolean contains(String s) - > 判断调用者字符串是否包含指定的串儿
2.boolean endsWith(String s) - > 判断调用者字符串是否是以指定字符串结尾
3.boolean startsWith(String s) - > 判断调用者字符串是否是以指定字符串开头
4.String toLowerCase() - > 将所有字母变为小写
5.String toUpperCase() - > 将所有字母转为大写
6.String trim() - > 去除字符串两端的空格
public class String_extend {
public static void main(String[] args) {
String s1 = "abcdefg";
//1.boolean contains(String s) - > 判断调用者字符串是否包含指定的串儿
System.out.println("s1.concat(\"fg\") = " + s1.concat("fg"));
//2.boolean endsWith(String s) - > 判断调用者字符串是否是以指定字符串结尾
System.out.println("s1.endsWith(\"fg\") = " + s1.endsWith("fg"));
//3.boolean startsWith(String s) - > 判断调用者字符串是否是以指定字符串开头
System.out.println("s1.startsWith(\"ab\") = " + s1.startsWith("ab"));
//4.String toLowerCase() - > 将所有字母变为小写
System.out.println("\"Application\".toLowerCase() = " + "Application".toLowerCase());
//5.String toUpperCase() - > 将所有字母转为大写
System.out.println("\"Application\".toUpperCase() = " + "Application".toUpperCase());
//6.String trim() - > 去除字符串两端的空格
String s2 = " dwt haha c de ";
System.out.println(s2);
System.out.println(s2.trim());
String replace = s2.replace(" ", "");
System.out.println(replace);
}
}
1.概述:一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步(线程不安全,效率高)
2.作用:主要作用是字符串拼接
3.问题:
a.刚讲完String,String也能做字符串拼接,直接用+即可,但是为啥要用StringBuilder去拼接呢?
b.原因:
String每拼接一次,就会产生新的字符串对象,就会在堆内存中开辟一个空间,如果拼接次数多了,比较占用内存,效率比较低
StringBuilder,底层自带一个缓冲区,拼接字符串之后都会在此缓冲区中保存,在拼接的过程中,不会随意产生新对象,比较节省内存
4.StringBuilder的特点:
a.底层自带缓冲区,此缓冲区为没有被final修饰的char数组(jdk8之后是byte数组),默认长度为16
b.如果超出了数组长度,数组会自动扩容
创建一个指定长度的新数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
c.每次扩容2倍+2
1.构造:
StringBuilder()
StringBuilder(String str)
public class Exercise {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("b");
System.out.println("sb = " + sb);
StringBuilder sb1 = new StringBuilder("abc");
sb1.append("def");
System.out.println("sb1 = " + sb1);
}
}
常用:
StringBuilder append(任意类型数据) -> 字符串拼接,返回的是StringBuilder自己
StringBuilder reverse()-> 字符串翻转,返回的是StringBuilder自己
String toString() -> 将StringBuilder转成String -> 用StringBuilder拼字符串是为了快,节省内存空间,那么拼完之后我们后续可能会处理拼接好的字符串,所以我们需要将StringBuilder转成String,才能调用String中的方法去处理拼接好的字符串
public class Exercise01 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("a");
//StringBuilder append(任意类型数据) -> 字符串拼接,返回的是StringBuilder自己
sb = sb.append("dc").append("ef"); //链式调用
System.out.println("sb = " + sb);
//StringBuilder reverse()-> 字符串翻转,返回的是StringBuilder自己
sb.reverse();
System.out.println("sb = " + sb);
// String toString() -> 将StringBuilder转成String
String s = sb.toString();
System.out.println("s.length() = " + s.length());
}
}
练习:键盘录入一个字符串,判断此字符串是否为"回文内容"
比如: 上海自来水来自海上 abcba
public class Huiwen {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入:");
String message = sc.next();
StringBuilder sb = new StringBuilder(message);
sb.reverse();
String s = sb.toString();
if (s.equals(message)){
System.out.println("是回文数");
}else {
System.out.println("不是回文");
}
sc.close();
}
}
定义一个数组,以[元素1, 元素2, 元素3..]的形式输出,用StringBuilder拼接
public class Exercise2 {
public static void main(String[] args) {
String[] arr = {"a", "b", "c", "d"};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
}
System.out.println("sb = " + sb);
}
}