Javaオブジェクトクラス
Java Object クラスはすべてのクラスの親クラスです。つまり、すべての Java クラスは Object を継承し、サブクラスは Object のすべてのメソッドを使用できます。
Object クラスは java.lang パッケージ内にあり、コンパイル時に自動的にインポートされます。クラスを作成するときに、親クラスを明示的に継承しない場合は、自動的に Object を継承し、Object のサブクラスになります。
よく使われるクラスの重要なメソッド
- public String toString() は、
オブジェクトの文字列表現を返します
。 例:
public class Test {
public static void main(String[] args) {
Person person = new Person();
//调用person对象的方法toString()
String s = person.toString();
//com.yls.demo1.Person@1b6d3586 这是对象在内存中的“地址”
System.out.println(s);
//com.yls.demo1.Person@1b6d3586
System.out.println(person);
//得出结论 输出语句中必须(默认)调用toString()方法
//无权更改,sun公司规定死的
//输出语句System.out.println(对象)调用对象的toString()
//System.out.println(对象)==System.out.println(对象.toString())
}
}
実際の開発では、通常、親クラスの toString() メソッドが書き換えられ、デフォルトのオブジェクト アドレス表現の代わりに独自の文字列表現が作成されます。
- 親クラスの toString() メソッドをオーバーライドします。
public class Person {
/**
* 重写父类的方法toString
* 返回字符串
* @return
* 重写方法的目标:方法中,返回类中成员变量的值
*/
private String name;
private int age;
public Person(){
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString(){
return name +":" + age;
}
}
public class Test {
public static void main(String[] args) {
Person person = new Person("李四",25);
//调用person对象的方法toString()
String s = person.toString();
//李四:25
System.out.println(s);
//李四:25
System.out.println(person);
}
}
- booleanquals(Object obj) は
2 つのオブジェクトが等しいかどうかを比較します。Java は、任意のオブジェクトが
オブジェクト クラス メソッドとソース コードに等しいとみなします。
public boolean equals(Object obj) {
return (this == obj);
}
//this指调用者,obj指传入的Object对象参数
デフォルトでは、オブジェクトのメモリ アドレスが比較されます
が、一般的なオブジェクトのアドレスは比較できないため、オブジェクトの独自の比較形式を確立するには、equals メソッドを書き直す必要があります。例は次のとおりです
。
@Override
public boolean equals(Object obj){
//健壮性判断1,如果obj的值为null,比较的另一个对象不存在
if (obj == null) {
return false;
}
//健壮性判断2,判断this和obj是不是一个对象,如果是就直接返回true
if(this == obj){
return true;
}
//这里涉及一个多态的问题,
//obj应该向下转型为Person才可以调用age
//同时需注意安全性判断
if (obj instanceof Person) {
Person p = (Person) obj;
return this.age == p.age;
}
//不是Person 没有可比性
return false;
}
Person person = new Person("李四",25);
Person person1 = new Person("王二", 25);
boolean b = person.equals(person1);
System.out.println(b); //true
文字列文字列クラス
java.lang.Object
java.lang.String
実装されているすべてのインタフェース:
Serializable 、 CharSequence 、 Comparable < String >
Object クラスを継承し、3 つのインタフェースを実装します。文字列オブジェクトは定数です。一度作成すると変更できません。
「 " と書くだけです。 String クラスのオブジェクト
stringの実装原理
Java には string データ型は存在せず、その実装原理は、
char[] 配列で表される "abc" が実際には char[] ch = {'a', 'b', 'c' であるというものです。
JDK9 バージョン以降は、メモリを節約するために char 配列がバイト配列になることを示します。JDK8
以前はすべて char 配列です。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[]; //成员变量char数组
......
配列の前の修飾子 Final は最終配列を示し、そのアドレスが確立されると、スレッド セーフのためにロック (定数) されます。
文字列定数のプロパティ
public static void main(String[] args) {
String a = "abc";
String s = new String("abc"); //new对象新开一片堆,与a String对象中的数组地址不一样
System.out.println(a == s); //false
System.out.println("---------------");
/**
* s1保存的是String对象
* s2 = "hello" 和s1中的字符串在内存中的数组表现是一样的 ,JVM为了节约内存两者共用
* s1的地址赋值给s2
*/
String s1 = "hello";
String s2 = "hello";
System.out.println(s1==s2); //true
System.out.println("---------------");
/**
* s3 和 s4都是变量,变量在编译的时候,javac不确定变量的计算结果是什么
* 运行的时候jvm会为s3+s4的结果新开内存空间
*/
String s3 = "hhh";
String s4 = "ooo";
String s5 ="hhhooo";
System.out.println(s5 ==(s3+s4)); //false
System.out.println("---------------");
/**
* "hhh" "ooo" 是常量,值在编译期间就已经确定
* 运行时期不会建立新的内存空间
*/
System.out.println(s5==("hhh"+"ooo"));//true
}
文字列コンストラクター
-
String(byte[] bytes)
プラットフォームのデフォルトの文字セットを使用して、指定されたバイト配列をデコードすることにより、新しい String を構築します。 -
文字列 (byte[] バイト、int オフセット、int 長)
バイト配列は、プラットフォームのデフォルトの文字セットを使用して文字列に変換されます。パラメーター off は配列の先頭を表し、len は変換の数を表します。 -
String(byte[] bytes, String charsetName)
charsetName は自分で指定できるコード表です。たとえば、
アイデアでは GBK GBK コードを指定します。英語と区別するために、
負の値 2 バイトは中国語の文字を意味します
utf-8 は 3 バイトで漢字を表します
public static void Byte2string(){
/**
* String(byte[] bytes)
* 通过使用平台的默认字符集解码指定的字节数组来构造新的 String
* wiodows 中文版 默认字符集是GBK ,idea启动时为jvm添加启动参数会把默认字符集改为UTF-8
*/
byte[] b ={
97,98,99};
String s = new String(b);
System.out.println(s); //abc
//数组的一部分转换为字符串
//从索引1开始,两个字符
String s1 = new String(b,1,2);
System.out.println(s1);//bc
}
public static void main(String[] args) {
Byte2string();
}
バイト配列のみがエンコーディング テーブルに関連し、他には何も関連しません。
-
String(char[] value) は
配列を文字列に変換します -
文字列 (char[] 値、int オフセット、int 長)
配列は文字列に変換されます。パラメータ off は配列の先頭を表し、len は変換の数を表します。
public static void Char2string(){
//构造方法,数组转为字符串
char ch [] ={
'a','b','c','q'};
String s = new String(ch);
System.out.println(s);//abcq
//数组转为字符串转一部分
String s1 = new String(ch, 1, 2);
System.out.println(s1);//bc
}
Stringクラスの共通メソッド
Stringクラスの判定メソッド
- booleanquals(Object anObject)
この文字列を指定されたオブジェクトと比較します。 - booleanqualsIgnoreCase(String anotherString) は、
大文字と小文字を区別せずに、この String を他の String と比較します。 - boolean startingWith(String str) は、
文字列が別の文字列で始まるかどうかを判断し、別の文字列で始まる場合は true を返します。 - boolean opensWith(String str) は、
文字列が別の文字列で終わるかどうかを判断し、別の文字列で終わる場合は true を返します。 - boolean contains(CharSequence s)
この文字列に指定された一連の char 値が含まれている場合にのみ true を返します。 - boolean isEmpty() は
文字列の長さが 0 かどうかを判断し、0 の場合にのみ true を返します。
/**boolean equals(Object anObject)
* 字符串直接的比较
* String继承自Object,重写父类方法
*/
boolean b = "abcd".equalsIgnoreCase("ABCD");
boolean c = "abcd".equals("abcD");
boolean d = "Hello,world".startsWith("Hello");
boolean e = "world,Hello".endsWith("Hello");
boolean f = "Hello fine".contains("fi");
boolean ff = "Hello fine".contains("if");
System.out.println(b); //true
System.out.println(c); //false
System.out.println(d); //ture
System.out.println(e); //true
System.out.println(f); //true
System.out.println(ff); //false
sunで書き換えられたequalsメソッドは以下の通り
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
Stringクラスを取得するメソッド、戻り値は必ずしも必要ではありません
- int length() は文字列の長さ、文字列内の文字数を返します。
- char charAt(int index) は、指定されたインデックスにある単一の文字を返します。
- int IndexOf(String str) は、指定された文字列、つまり現在の文字列内で最初に出現する文字列のインデックスを返します。
- int lastindexOf(String str) は、指定された文字列、つまり現在の文字列内で最後に出現する文字列のインデックスを返します。
- String substring(int start, int end) は文字列をインターセプトし、パラメーターは開始インデックスと終了インデックスを示します。インターセプトには開始インデックスが含まれますが、終了インデックスは含まれません。
//int length()返回字符串长度,字符串中字符的个数
int length = "abcde".length();
System.out.println(length);// 5
//char charAt(int index) 返回指定索引上的单个字符
char chr = "hedfgg".charAt(3);
System.out.println(chr); //f
//int indexOf(String str)返回指定的字符串,在当前字符串中第一次出现的索引
int index = "hello word so smart".indexOf("s");
System.out.println(index);//11
//以s第一次出现为准
int index1 = "hello word so smart".indexOf("so");
System.out.println(index1);//11
//int lastindexOf(String str)返回指定的字符串,在当前字符串中最后一次出现的索引
int index2 = "hello word so smart".lastIndexOf(" ");
System.out.println(index2);//13
//String substring(int start,int end)截取字符串,参数表示开始和结束索引,其中截取包含开始索引,不包含结束索引
String str = "hello world"; //是锁死的字面量”hello world”
String str1 = str.substring(2,5); //如果不赋值的化仍然是原str ,需要赋值新的字符串
System.out.println(str1);//llo
System.out.println(str.substring(2,5));//llo
Stringクラスの比較メソッド
- public int CompareTo(String anotherString)
2 つの文字列を辞書順 (自然順序) で比較します。比較は、文字列内の各文字の Unicode 値に基づいて行われます。
/**
* int compareTo(String anotherString) 按字典顺序(自然顺序)比较两个字符串
*/
String str1 = "abcdef";
String str2 = "abdefg";
String str3 = "abcdef";
String str4 = "abcdeg";
/**
* 返回值是int
* 返回值为负,调用者小
* 返回值为正,调用者大
* 返回值为0,一样大
*/
int i = str1.compareTo(str2);
int j = str1.compareTo(str3);
int k = str1.compareTo(str4);
System.out.println(i); //-1 底层是数组,数组中一个一个的比较 c<d为负,后边就不比了
System.out.println(j); //0 一个一个的比较,都相同 返回0
System.out.println(k); //-1 f<g为负
String クラスのメソッド、スペースの削除、置換、切り取り
- String Trim() は文字列の両側のスペースを削除しますが、中央のスペースは削除しません
- String replace(String oldString, String newString) は文字列を置き換えます
- String []split("rule string") は文字列を切り取ります
// String trim() 去掉字符串两边的空格,中间的空格不去掉
String str =" aa c bb d ";
String s = str.trim();
System.out.println(s); //aa c bb d
//String []split("规则字符串") 对字符串进行切割
String str1Split ="aa,bb,cc,dd";
String[] strings = str1Split.split(",");
for(int i =0; i< strings.length;i++){
System.out.println(strings[i]); // aa bb cc dd
}
//String replace(String oldString,String newString)替换字符串
String strReplace = "how are you ?";
String replace = strReplace.replace("o", "ee");
System.out.println(replace); //heew are yeeu ?
Stringクラスの正規表現関連
-
文字クラス:
[abc]
文字列のこの位置は abc のみです[^abc]
文字列のこの位置を abc にすることはできません[a-zA-Z]
文字列のこの位置は 52 文字の文字である必要があります[^a-zA-Z]
文字列のこの位置は文字、52 文字であってはなりません
-
数値クラス:
[0-9]
文字列のこの位置には数値のみを指定できます[^0-9]
文字列のこの位置に数値を指定することはできません[\d]
に相当[0-9]
[\D]
に相当[^0-9]
-
事前定義された文字:
- . はすべての文字に一致します
[\d]
に相当[0-9]
[\D]
に相当[^0-9]
[\w]
数字、文字、アンダースコアを含むテキスト文字[a-zA-Z0-9_]
[\W]
テキスト文字。数字、文字、アンダースコアを含めることはできません[^a-zA-Z0-9_]
-
数量指定子:
- X{m} 文字 X は、{3} に m 回のみ出現できます
- X{m,} 文字 X は少なくとも m 回出現します
- X{m,n} 文字 X は m 回以上、n 回以下出現します。
- X? 文字 X は 1 回出現するか、まったく出現しません
- X* X この文字は 0 回以上出現します
- X+ X この文字は少なくとも 1 回出現します (1 回以上出現します)
文字列の正規一致チェック
- boolenmatches(String regex) は、
この文字列が指定された正規表現と一致するかどうかを示します。
一致が成功した場合は true を返し、失敗した場合は false を返します。
例:
/**
* 检查邮箱
* 规则需求 :
* @ 前面 : 可以是字母,数字,_
* @ 后面 : 数字,字母 sina qq 126 1393 yahoo gmail
* . 固定 : com cn org edu gov 字母
*/
public static void stringMethod2(){
String email = "[email protected]";
// "[a-zA-Z0-9] == [\\w] \\两个\其中一个代表转义"
//"[\\w]+" 表示[\w] 匹配一次或多次
//(\\.[a-z]+)+ 表示(\\.[a-z]+)这个匹配组匹配一次或多次 比如.com.cn
String reg = "[\\w]+@[a-z0-9]+(\\.[a-z]+)+";
boolean b = email.matches(reg);
System.out.println(b);
}
/**
* 正则表达式检查手机号是否合法
* 规则需求
* 开头必须是1,长度固定11
* 第二位3 4 5 6 7 8 9
* 第三位 必须是都是数字
*/
public static void stringMethod(){
String tel = "13800138000";
//定义正则的规则,也是字符串
String regex = "1[3459678][0-9]{9}";
//正则规则,和字符串校验
//String类的方法 matches()
boolean b = tel.matches(regex);
System.out.println(b);
}
- String[] Split(String regex)
この文字列を、指定された正規表現に一致するものに分割します。
public static void stringMethod3(){
String str = "as123d387654w5465fasfr234567sa";
String[] strings = str.split("\\d+");
for (int i = 0; i < strings.length; i++) {
System.out.println(strings[i]);
} //as d w fasfr sa
System.out.println("================");
String ip = "192.....168.....35.121";
String[] ipArray = ip.split("\\.+");
for (int i = 0; i < ipArray.length; i++) {
System.out.println(ipArray[i]);
}// 192 168 35 121
}
- String replaceAll(String regex, String replace)
指定された正規表現に一致するこの文字列の各部分文字列を指定された置換で置き換えます。 - String replaceFirst(String regex, String replace)
指定された正規表現に一致するこの文字列の最初の部分文字列を指定された置換で置き換えます。
public static void stringMethod4(){
String str = "as123d387654w5465fasfr234567sa";
//字符串中的所有数组,换成#
String repString = str.replaceAll("\\d+","#");
System.out.println(repString);//as#d#w#fasfr#sa
String first = str.replaceFirst("\\d+","#");
System.out.println(first);//as#d387654w5465fasfr234567sa
}
String Builder
プログラムの開発では、文字列の連結が頻繁に発生します。直接的な方法は、"+" 記号を使用して String の直接結合を実現することです。ただし、このメソッドは実行されるたびに String オブジェクトを作成します。非効率的で時間がかかり、スペースの無駄です。この問題は StringBuilder クラスを使用することで回避できます
public Final class StringBuilder
extends Object は
Serializable を実装しており、CharSequence
は可変文字列 (文字配列) です。このクラスは StringBuffer による API を提供しますが、同期は保証されません。
オブジェクト作成時の StringBuilder の配列の初期化長は 16 文字です
StringBuilder は配列を自動的に展開し、新しい配列が実現され、元の配列の要素が新しい配列にコピーされます。
結論: 文字列操作をどのように実行しても、StringBuilder 内に存在する配列は常に 1 つだけです。
StringBuilder クラスは、高速に実行されるスレッドアンセーフなクラスです。
StringBuffer はスレッドセーフなクラスで、実行速度が遅く、マルチスレッド プログラムで使用されます。
2 つのクラスの構築メソッドは他のメソッドとまったく同じです。
StringBuilder builder = new StringBuilder(20);
builder.append("helo");
System.out.println(builder); //helo
builder.insert(3,"world");
System.out.println(builder);//helworldo
StringBuilder builder1 = new StringBuilder(16);
System.out.println(builder1.append("hello").append("world").append(" ").append("over"));// helloworld over