protected Object clone()
标记接口:没有任何抽象方法的接口称为标记接口。
CloneNotSupportedException
异常名称:克隆不支持异常
产生原因:需要克隆的对象没有实现Cloneable接口
Student s1=new Student(“老王”,40);
Student s2=s1;——多个引用指向同一个堆区空间
Object s1clone=s1.clone();——在堆区复制一个对象,会创建一个新的堆区空间。
protected void finalize()
当垃圾回收器确定对象成为垃圾对象时,由对象的垃圾回收器调用此方法,用于垃圾回收,但是什么时候回收不确定。
Student s=new Student(“老王”,40);
s.finalize();
String类 【精通】
一:string类的概述:字符串的本质就是字符数组,也称为字符序列。
二:字符串常量在方法区的常量池开辟空间。
三:string常量创建后,地址是不可变的,但内容可以共享。
String str = “hello”;<!----此时在常量池开辟一个空间存储“hello”>
str += “world”;<!----此时会在常量池开辟一个新的空间存储"helloworld",而不会覆盖掉原来的空间>
System.out.println(str);<!----此时指向的是新空间,旧连接断掉。>
String s1 ="aaa";
String s2 ="bbb";
String S3 ="aaabbb";
String s4 =s1+s2;
System.out.println(s3 == s4); // false
String s = new String("abc");
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s == s1); // false
System.out.println(s == s2); // false
System.out.println(s1 == s2); // false
String hello = "hello";
String hel = "hel";
String lo = "lo";
System.out.println(hello == "hel" + "lo"); // true
System.out.println(hello == "hel" + lo); // false
String的构造方法
public String()
public String(String original)
public String(char[] value)<!----将字符数组转换成字符串>
public String(char[] value, int index, int count)<!----将一部分字符数组转成字符串(index开始位置,count长度)>
public String(byte[] bytes)<!----将字节数组转换成字符串>
public String(byte[] bytes, int offset, int length)<!----将一部分字节数组转换成字符串(offset开始位置,length长度)>
public class StringDemo02 {
public static void main(String[] args) {
String s = new String();
System.out.println("s: " + s);
String s2 = new String("abc");
System.out.println("s: " + s2);
// 重点: 将字符数组转换成字符串
String s3 = new String(new char[] {'a','b','c'});
System.out.println("s: " + s3);
// 重点: 将字符数组的一部分转换成字符串
char[] chs = {'H', 'e', 'l', 'l', 'o'};
String s4 = new String(chs, 2, 3);
System.out.println("s: " + s4);
// 重点: 将字字节数组的一部分转换成字符串
byte[] bys = {97,98,99,100};
String s5 = new String(bys);
System.out.println("s: " + s5);
}
}
字符串的常见方法(一)
char charAt(int index)
int indexOf(int ch)
int indexOf(String str)
int indexOf(int ch, int fromIndex)<!----int ch要查找的字符, fromindex开始查找的位置>
int indexof(String str, int fromIndex)<!----str要查找的字符串>
int lastIndexof(int ch)<!----从右往左找>
int lastIndexOf(int ch, int fromIndex)
int lastindexof(String str, int fromIndex)
String substring(int start)<!----截取字符串,从start位置开始截取到末尾>
String substring(int start, int end)<!----截取字符串,从start开始截取到end>
int length()
public class StringDemo03 {
public static void main(String[] args) {
String s = "HelloWorldJavaWorld";
System.out.println("length: " + s.length());
// 获取字符串某个索引对应的字符 char charAt(int index)
for (int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
System.out.println(ch);
}
// 通过某个字符返回该字符在字符串中的索引: int indexOf(int ch)
System.out.println(s.indexOf('H'));
// 通过某个字符串返回该字符串在源字符串中的索引: int indexOf(String str)
System.out.println(s.indexOf("World"));
// 从fromIndex位置开始从左往右搜索, 第一次出现字符ch的索引
// int indexOf(int ch,int fromIndex)
System.out.println(s.indexOf('l', 4));
// int indexOf(String str,int fromIndex)
System.out.println(s.indexOf("World", 9));
// int lastIndexOf(String str,int fromIndex)
// fromIndex开始从右边往左边搜索,第一次出现字符串str的索引
System.out.println(s.lastIndexOf("World", 10));
// String substring(int start) 截取字符串 从start开始截取到末尾
System.out.println(s.substring(s.lastIndexOf("World", s.length())));
// "HelloWorldJavaWorld"
System.out.println(s.substring(s.indexOf('J'), s.lastIndexOf('W')));
}
}
字符串的常见方法(二)
boolean isEmpty():判断字符串是否为空。
boolean equals(Object obj):将此字符串的内容与指定的对象比较,区分大小写。
boolean equalsIgnoreCase(String str):将此 String 与另一个 String 比较,忽略大小写。
boolean contains(String str):判断字符串中是否包含方法传入的字符串。
boolean startsWith(String str):判断字符串是否以某个指定的字符串开头。
boolean endsWith(String str):判断字符串是否以某个指定的字符串结尾。
public class StringDemo04 {
public static void main(String[] args) {
String s = "HelloWorldAndroid";
// System.out.println(s.isEmpty());
// String s1 = "";
// String s2 = new String("");
// String s3 = null;
//
// System.out.println(s1.isEmpty()); // true
// System.out.println(s2.isEmpty()); // true
// System.out.println(s3.isEmpty()); // false
System.out.println("Hello".equalsIgnoreCase("HELLO"));
// "" + H + "" + e + "" + l + "" + l + "" + o + ""
System.out.println("Hello".contains(""));
System.out.println("http://www.baidu.com".startsWith("http://"));
System.out.println("HelloWorld.java".endsWith(".java"));
System.out.println(s.startsWith(""));
System.out.println(s.endsWith(""));
}
}
字符串的常见方法(三)
byte[] getBytes() :将字符串转化为字节数组。
char[] toCharArray(): 将字符串转化为字符数组。
static String valueOf(char[] chs): 返回 char 数组参数的字符串表示形式。
static String valueOf(int i) :返回 int 参数的字符串表示形式。
String toLowerCase() :将此 String 中的所有字符都转换为小写。
String toUpperCase() :将此 String 中的所有字符都转换为大写。
String concat(String str): 将指定字符串连接到此字符串的结尾。
重点的四个方法:【IO流 字符流 字节流】
将字符数组转换成字符串
将字节数组转换成字符串
将字符串转换成字节数组
将字符串转换成字符数组
public class StringDemo05 {
public static void main(String[] args) {
String s = "HelloWorld";
byte[] bys = s.getBytes();
System.out.println(Arrays.toString(bys));
char[] chs = s.toCharArray();
System.out.println(Arrays.toString(chs));
String s2 = String.valueOf(false);
System.out.println(s2);
System.out.println(String.valueOf(10));
// System.out.println(10.0 + "");
System.out.println(String.valueOf(new Object()));
System.out.println(s.toLowerCase());
// 后期在写sql语句的时候,数据库会将所有的sql语句转换为大写
System.out.println(s.toUpperCase());
System.out.println(s.concat("Android"));
}
}
字符串的常见方法(四)
String replace(char old,char new) :替换功能。
String replace(String old,String new) :替换功能。
String trim():去除字符串两空格。
int compareTo(String str) :按字典顺序比较两个字符串。
int compareToIgnoreCase(String str):按字典顺序比较两个字符串,忽略大小写。
public String[] split(String regex):用分界符将字符串分割并组成新的字符串数组。
public class StringDemo06 {
public static void main(String[] args) {
String s = "HelloWorld";
System.out.println(s.replace("Hello", "good"));
System.out.println(s.replace('H', 'K'));
String s2 = " Great World ";
System.out.println(s2.trim() + "============");
// int compareTo(String str)
/*
* 该方法是后面用来比较任意两个对象的一个方法,这个方法来自于 Comparable接口
* 返回的整数是一个int类型
* 后期我们会详细讲解为什么返回int类型
*
* 正数: 表示大于
* 0: 表示相等
* 负数: 表示小于
* s3.compareTo(s4)
* 后期学习集合的时候有大用处
* "abce"
* public int compareTo(String anotherString) {
int len1 = this.value.length; "abcd" 4
int len2 = anotherString.value.length; 4
int lim = Math.min(len1, len2); 4
char v1[] = this.value; "abcd"
char v2[] = anotherString.value; "abcd"
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
*/
String s3 = "abcd";
String s4 = "abce";
System.out.println(s3.compareTo(s4));
System.out.println(s4.compareTo(s3));
System.out.println(s3.compareTo(s3));
// 我们无需实现中文的比较,系统针对文本提供了相应的工具类
Collator c = Collator.getInstance(Locale.CHINESE);
int cmp = c.compare("李四", "李四");
System.out.println(cmp);
System.out.println("HelloWorld".compareToIgnoreCase("HELLOWORLD"));
String s5 = "Hello=World=Java";
String[] strs = s5.split("=");
System.out.println(Arrays.toString(strs));
}
}
字符串的常见方法(五)
字符串中的其他方法:
static String format(Locale l, String format, Object… args)
static String format(String format, Object… args)
Object… 的本质是 Object[] args %n %d %s %c %b %f
static String join(CharSequence delimiter, CharSequence… elements) <!----delimiter(分隔符,分界符)>
当一个方法的形参希望我们传入的是CharSequence接口的时候,实际希望我们传入的是接口的实现类。
当一个方法希望传入的是CharSequence… elements的时候,本质是一个数组 CharSequence[];
这个数组的每一个元素是CharSequence类型,每一个元素也可以是CharSequence的实现类
public class StringDemo07 {
public static void main(String[] args) {
Object[] arguments = {"张三", 18, "打篮球"};
String formatStr = String.format("大家好我叫做%s,我今年%d,我的兴趣爱好是%s", arguments);
System.out.println(formatStr);
String join = String.join("+", "Hello","World","Java");
System.out.println(join);
}
}
StringBuffer和StringBuilder
StringBuffer 和SringBuilder 和String的区别:
String每次拼接字符串都会在方法区的常量池中开启新的空间。
而StringBuffer 和SringBuilder的增删改则会在原来创建的空间上更新替换。
增:
StringBuffer append (String str)
StringBuffer insert (int offset, String str) <!----在位置(offset)前面插入字符串(str)>
删:
StringBuffer deleteCharAt(int index)<!----删除index位置的字符>
StringBuffer delete (int start, int end);<!----左闭右开>
改:
public StringBuffer replace (int start, int end, String str)
其他功能:
public StringBuffer reverse()<!----倒置>
public String substring (int start)
public String substring (int start, int end)
public class StringBuilderDemo02 {
public static void main(String[] args) {
StringBuffer sb = new StringBuffer("Hello");
System.out.println(sb); // Hello
StringBuffer sb2 = sb.append("World");
System.out.println("sb:" + sb); // HelloWorld
System.out.println("sb2:" + sb2); // HelloWorld
sb.append(false).append('c').append(2.5).append(new Object());
System.out.println(sb);//HelloWorldfalsec2.5java.lang.Object@15db9742
sb.insert(sb.indexOf("f"), "Java");
System.out.println(sb);//HelloWorldJavafalsec2.5java.lang.Object@15db9742
sb.deleteCharAt(sb.indexOf("c"));
System.out.println(sb);//HelloWorldJavafalse2.5java.lang.Object@15db9742
sb.delete(sb.indexOf("J"), sb.indexOf("4"));
System.out.println(sb);//HelloWorld42
sb.replace(sb.indexOf("4"), sb.length(), "Good");
System.out.println(sb);//HelloWorldGood
sb.reverse();
System.out.println(sb);//dooGdlroWolleH
sb.reverse();
System.out.println(sb);//HelloWorldGood
// sb.substring(sb.indexOf("W"));
System.out.println(sb.substring(sb.indexOf("W")));//HelloWorldGood
System.out.println(isPalindromic(1001));//true(正着读与倒着读是否一样?)
}
public static boolean isPalindromic(int num) {
return new StringBuilder(String.valueOf(num)).reverse().toString().equals(String.valueOf(num));
}
}
正则表达式
字符类:匹配单个字符
a:表示匹配字母a
\\:表示匹配转义字符“\”
\t:匹配转义字符“\t”
\n:匹配转义字符“\n”
注意:java中用\\t表示\t。
范围类:匹配里面的任意一个字符
[abc]:表示可以是a,也可以是b或者是c。
[^abc]:表示不是a,b,c中的任何一个。
[a-zA-Z]:表示全部字母中的任何一个都可以。
[0-9]:表示全部数字中的任何以一个都可以。
预定义类:
.:表示任意的一位字符。
\d:表示任意的一位数字,等价于[0-9]
\D:表示任意的一位非数字,等价于[^0-9]
\w:表示任意的一位字母、数字、_,等价于[a-zA-Z0-9]
\W:表示任意的一位非字母、数字、_,等价于[^a-zA-Z0-9]
\s:表示任意的一位空格,例如“\n”,"\t"等。
\S:表示任意的一位非空格。
边界类:(边界匹配)
^:表示行的开头(一组正则的开始)。
$:表示行的结尾(一组正则的结束)。
\b:表示单词与非单词之间的位置。
注:一般我们都用\b来进行获取,
例如:String str=",呵呵,";
String rex="\\b呵呵\\b";
输出结果:呵呵
\B:表示单词与单词之间的位置或者非单词与非单词之间的位置。
注:\B一般也是用来进行获取的
例如:String str=",和呵呵,";
String rex="\\B呵\\B";
输出结果:呵
数量类:之前的所有正则都只是表示一位,若想表示多位,则需要数量来表示。
?:表示出现0次或1次。
*:表示出现0次,1次或多次。
+:表示出现1次或多次。
{n}:表示正好出现n次。
{n,}:表示出现n次以上。
{n,m}:表示出现n~m次之间。
逻辑表示:与、或、非
正则表达式A正则表示B:表示表达式A之后紧跟着表达式B。
正则表达式A|正则表达式B:表示表达式A或者表达式B,二者任意一个出现都可以。
(正则表达式):将多个子表达式合成一个表示,作为一组出现。
正则操作类:Pattern(正则模式)和Matcher(匹配)
Pattern类常用方法:
pubic static Pattern compile(String regex)
public Matcher matcher (CharSequence input)
public String[] split( CharSequence input)
注意:
Pattern没有提供构造方法,所以要取得Pattern类实例,则I必须调用compile()方法
Matcher类常用方法
public boolean matches( )
public String replaceAll( String replacement)
public boolean find( )
pubic String group( int group)
public class RegexDemo{
public static void main(String[] args) {
String str ="101";
String regex="\\d+";
Pattern pat =Pattern.compile(regex);
Matcher mat =pat.matcher(str);
System.out.println(mat.matches());
}
}
运行结果:true