| String (char[] value) | 指定された文字に基づいてオブジェクトを作成します。配列# ########### 栗をあげる:
public static void main(String[] args){
String s1 =new String();//创建空字符串
String s2 = new String("张三")//创建一个内容为张三的字符串
char[] charArray = new char[]{'A','B','C'};
String s3 = new String(charArray);
System.out.println(s1);
System.out.println(s2);
System.out.println(s3);
}
ログイン後にコピー
Sring クラスの一般的に使用されるメソッド:
Basic文字列操作:
public static void main(String[] args) {
String s ="abcdefhckoj";//声明字符串
System.out.println("字符串的长度为:"+s.length());//获取字符串长度, 即字符个数
System.out.println("字符串第一个字符:"+s.charAt(0));
System.out.println("字符c第一次出现的位置:"+s.indexOf('c'));
System.out.println("字符c最后一次出现的位置:"+s.lastIndexOf('c'));
}
ログイン後にコピー
文字列と配列間の変換:
public class Demo{
public static void main(String[] args){
String s = "abcdesgs";//声明一个字符串
System.out.println("将此字符串装换为数组");
char [] charArray = s.toCharArray();//字符串转换为字符数组。
System.out.println("[);
for(int i=0;i,charArray.length;i++){
if(i !=charArray.length-1);
Syetem.out.println(charArray[i]+",");
//判断是否是数组最后一个元素,如果不是则在后面添逗号码
}else{
//否则 数组最后一个元素不加逗号。
Syetem.out.println(charArray[i]+"]");
}
}
Syetem.out.println("将Int 类型转换为String 类型:" +String.valueOf(20));
}
}
ログイン後にコピー
文字列判定操作:
public static void main(String[] args) {
String str1 = "abcdsg";//声明一个字符串
String str2 = "adc";
System.out.println("判断是否以字符串abc开头:"+str1.startsWith("abc"));
System.out.println("判断是否以字符串sg结尾:"+str1.endsWith("sg"));
System.out.println("判断是否包含字符串ds:"+str2.contains("ds"));
System.out.println("判断是否为空:"+str1.isEmpty());
System.out.println("判断两个字符串是否相等"+str1.equals(str2));
ログイン後にコピー
文字列のインターセプトと分割
String クラスは文字列のインターセプトと分割を提供します。 、substring() メソッドは文字列の一部をインターセプトするために使用され、split() メソッドは特定の文字に従って文字列を分割できます。
package com.project.demo;
public class Test {
public static void main(String[] args) {
String string = "张三-李四-王五";
//截取字符串
System.out.println("从第4个字符截取到最后:"+string.substring(3));
System.out.println("从第3个字符截取到第6:"+string.substring(2,6));
// 字符串分割
System.out.println("分割后的字符串数组元素依次是: ");
String[] stringArray =string.split("-");//通过- 字符为标志,将其分割为字符串数组
for(int i =0;i<stringArray.length;i++) {
if(i != stringArray.length-1 ) {
System.out.println(stringArray[i]+",");
}else {
System.out.println(stringArray[i]);
System.out.println(string.length());
}
}
}
}
ログイン後にコピー
スペースの削除と置換操作:
package com.project.demo;
public class Test {
public static void main(String[] args) {
String string = " hello word ";
//字符串替换操作
System.out.println("将word 替换成java :"+string.replace("word", "java"));
//字符串去空操作
System.out.println("去除字符串两端的空格:"+ string.trim());
System.out.println("去除字符串中所有空格: "+string.replace(" ", ""));
System.out.println("将小写转换为大写 : " + string.toUpperCase());
}
}
ログイン後にコピー
注意すべき点の 1 つは、文字列が特定の文字を使用していることです。文字列内の文字にアクセスするときに、文字のインデックスが存在しない場合、StringIndexOutOfBoundsException(String subscript out-of-boundsException) が発生します。
StringBuffer:
文字列の変更を容易にするために、 JDK は StringBuffer クラス (文字バッファとも呼ばれます) を提供します。 StringBuffer クラスと String クラスの最大の違いは、文字の追加または削除時に StringBuffer が可変であることです。 StringBufferオブジェクトが生成されます。
API の StringBuffer の一般的なメソッドを見てみましょう:
インタビュー中に、String、StringBuffer、StringBuilder の違いについてよく質問されます??
簡単に言うと、、String 文字列定数 StringBuffer 文字列変数 (スレッド セーフ) StringBuilder 文字列変数 (非スレッド セーフ) String 型と StringBuffer 型の主なパフォーマンスの違いは、String が不変オブジェクトであるため、String 型が変更されるたびに、実際には新しい String オブジェクトを生成し、その新しい String オブジェクトへのポインタを指すのと同じことになります。したがって、頻繁に内容を変更する文字列には String を使用しないことをお勧めします。なぜなら、オブジェクトが生成されるたびにシステムのパフォーマンスに影響が出るからです。特に、メモリ内に参照されていないオブジェクトが多すぎると、JVM の GC が動作し始め、速度が確実に遅くなります。
StringBuffer クラスを使用する場合、新しいオブジェクトを生成してオブジェクト参照を変更するのではなく、各結果は StringBuffer オブジェクト自体を操作します。したがって、一般に、特に文字列オブジェクトが頻繁に変更される場合には、StringBuffer を使用することをお勧めします。一部の特殊なケースでは、String オブジェクトの文字列連結は、実際には JVM によって StringBuffer オブジェクトの連結として解釈されるため、このような場合、String オブジェクトの速度が StringBuffer オブジェクトの速度よりも遅くなることはなく、特に次の文字列オブジェクトはこのうち、String の効率は StringBuffer よりもはるかに高速です。とてもうれしいです。String S1 オブジェクトの生成速度が速すぎることに気づき、驚きました。現時点では、StringBuffer には速度の点でまったく利点がありません。実際、これは JVM のトリックであり、この String S1 = “This is just a” “simple” “test” は実際には次のようになります。もちろん、多くの時間をかける必要はありません。
しかし、ここで注意すべき点は、文字列が別の String オブジェクトからのものである場合、速度はそれほど速くないということです。たとえば:
String S2 = “This is only a”; String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
ログイン後にコピー
这时候 JVM 会规规矩矩的按照原来的方式去做 在大部分情况下 StringBuffer > String StringBuffer Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。 可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。 StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer java.lang.StringBuilde java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
基本数据类型包装类:
何为包装类?
在java.lang包中有各种原生类相对应的类, 称作数值包装类。 这些类的名称, 大部分均以各原生类类型第一个字母换成大写的方式来命名 。简单的说就是将数据装换为对象,来应用更多的方法。
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
char | Chracter |
float | Float |
double | Double |
包装类和基本数据类型在进行转换时,引入了装箱和拆箱的概念,其中装箱是指将基本数据类型的值转为引用数据类型, 反之, 拆箱是指将引用数据类型的对象转为基本数据类型。
举个栗子:
方式一: 通过new关键字
Integer in = new Integer(5);
方式二: 直接赋值
Integer in = 5;
ログイン後にコピー
构造函数可将原生数据类型数值或代表数值的字符串转换成一数值包装对象。
如: 在Double类中的构造函数
Double(double value)
Double(String s)
例:
Double tax=Double(8332349823.234);
ログイン後にコピー
在数值包装类中所定义的方法, 最常用到的就是一些用来做字符串与数值间转换的方法。比如:
static float parseFloat(String s)
static Float valueof(String s)
static String toString(float f)
在使用包装类的时候我们需要注意一些问题.
1、 包装类都重写了Object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值;
2、 除了Character外, 包装类都有parseXXX(String s)的静态方法,将字符串转换为对应的基本类型的数据。 参数s不能为null, 而且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错;
3、 除了Character外,包装类都有valueOf(String s)方法,可以根据String类型的参数创建包装类对象, 但参数字符串s不能为null,而且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过, 但运行时也会报错