
12-系统常用类一
12-系统常用类一
一、帮助文档
- 学会查询API文档
- API(Application Programming Interface)
- 应用程序编程接口
- Java API
- Java提供的类,这些类将底层实现封装起来;
- 使用类,不需要关心如何实现,只关心怎么用
- API(Application Programming Interface)
- JDK安装目录下的src.zip系统类源码
java.io --(输出输出流的包)
java.lang --(系统常用类的包__不需要导包)
——System\String\Object..
java.util --(常用工具类的包)
java.math --(大数字对象的操作包)
java.sql --(Java跟数据库交互的包)
java.net --(Java网络包)
- 学会网上查询
- 编程的规范性
二、系统常用类java.lang
Object类
Java中所有类都直接或间接的继承自Object。
常用方法
- 返回对象的字符串表示形式,内容是对象所在物理地址,一般用于返回JavaBean对象的属性内容,需要重写toString()
- 重写对象toString() 为了更直观了解对象信息
- 对象与对象是否相等,用于判断物理地址是否相等,所以如果要判断两个对象是否相等,需要重写对象的equals()方法
- == 与equals()区别:
- ==是一个比较运算符,基本数据类型比较的是值,而引用数据类型比较的是地址值
- equals()是方法,只能比较引用数据类型,如果没有重写则与== 没有区别。
- 对象判断相等,默认具有相同属性的对象为逻辑上的同一个对象。
hashCode():返回对象的哈希码值
finalize() :用于垃圾回收
IDE 工具 一般都有重写快捷键, eclipse中 alt+shift+s
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
// if (getClass() != obj.getClass())
// return false;
//不同对象时,先判断对象的下溯是否为该类
if(obj instanceof Student) {
Student other = (Student) obj;
if (age != other.age)
return false;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}else
return false;
}
字符串类
参考资料:https://www.runoob.com/java/java-string.html
-
字符串是一连串字符的序列,由字符数组构成。
-
在Java中备当作对象来处理,程序中用到的字符串可以分为两大类:
- **String:**创建字符串后不可二次更改,是常量;
- **StringBuffer / StringBuilder:**是创建后允许修改其字符串内容
-
Java.lang.String类是一个特殊的类。常量区,值不能改变。
-
是唯一一个不需new就可以直接用的对象。
//声明和初始化
//初始化:
//1)直接用
String str1 ="abce";
//是一种非常特殊的形式,和new有本质的区别.
//它是在常量池中而不是象new一样放在压缩堆中
//JVM会在常量池中先查找有有没有一个值为"abcd"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指点向了同一对象,如果没有,则在常量池中新创建一个"abcd",下一次如果有String str2 = "abcd";又会将str2指向"abcd"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.
//以下代码的两者的区别
String str1 = ""; //长度为0的字符串.
String str2 = "null";
String str5 = "null"; //str5地址与str2 地址是一样的
String str3 = null;
//2)构造函数初始化 String str = new String("构造器初始化")
String str = new String("构造器初始化");//和其它任何对象一样.每调用一次就产生一个对象。只到它们调用intern()方法时才会产生上面那种效果.
String str4 = new String("null");//str4地址与str2 地址是不一样的
//返回指定索引处的 char 值。
charAt(int index);
//字符串连接一般用 +号,不是在原字符上更改,而是先copy再与新的字符串进行合并形成新的字符串。
concat(String str);
//测试此字符串是否以指定的后缀/前缀结束。
endsWith(String suffix); startsWith(String suffix);
//转换大小写
toLowerCase(); 或 toUpperCase();
//不区分大小写
equalsIgnoreCase();
//字符串查找
indexOf();//从左往右
lastIndexOf();//从右往左
String substring(int beginIndex); //返回截取内容
String substring(int beginIndex, int endIndex);//返回截取内容
String replace(char oldChar, char newChar);//返回替换后的内容
String replaceAll(String regex, String replacement) //返回批量替换后的内容
String[] split(String regex);//返回分割后的字符串数组,其中regex为正则表达式
int length(); //返回字符串长度
String trim();//返回字符串的副本,忽略前导空白和尾部空白
equals()
==
compareTo(String anotherString);
/**
* 字符串的用法由两种,
* 1)其区别在于:用赋值方式 直接使用,是将字符串内容 放置在Java中的常量池中,而不是通过new方式在堆中开辟内存存放;
* 2)过程: jvm会先去常量池中寻找是否存在值为"福建国科"的对象。
* 若有,则直接赋给str1引用;若不存在,则在常量池中新建一个"福建国科";
* 下一次如果有String s ="福建国科";又会将s2指向"福建国科"这个对象.
* 所以,当用直接赋值方式声明的字符串,只要值相等,任何多个引用都指向同一对象;
* 而通过new方式的 则和普通类类型一样 每个new出来的对象实体都不是同一个对象.
*
* 通过比较可以看出
* @author wyn
*
*/
public class TestString {
public static void main(String[] args) {
//直接用
String str1 ="福建国科";
//new+构造函数
String str2 =new String("福建国科福建国科");
//常用方法:
int a =str1.length(); //获取长度
System.out.println("获取字符串长度length():"+a);
char c1 = str1.charAt(2);//获取字符串索引所在的字符
System.out.println("获取字符串索引所在的字符charAt():"+c1);
str1=str1.concat(str2); //连接,将指定字符串连到此字符串的结尾
System.out.println("将指定字符串连到此字符串的结尾concat():"+str1);
boolean b= str1.startsWith("福建");
boolean b2= str1.endsWith("福建");
System.out.println("判断是否以指定前缀/后缀结尾startsWith()/endsWith():"+b+","+b2);
String ABC= "abc".toUpperCase();
String abc= "ABC".toLowerCase();
System.out.println("转换大小写toUpperCase()/toLowerCase():"+ABC+","+abc);
System.out.println(str1);
System.out.println("查找在字符串中第一个给定的字符所在索引:"+str1.indexOf('国'));
System.out.println("查找在字符串中最后一个给定的字符所在索引:"+str1.lastIndexOf('国'));
System.out.println("从指定索引位置开始截取: "+str1.substring(2));
System.out.println("替换指定的内容 replace(): " + str1.replace('福',' '));
System.out.println("分割,指定分隔的内容,返回字符串数组:"+str1.split(" "));
String str3 = " 国科信息科技 ";
System.out.println("省略头尾空格trim():" +str3.trim() );
String str4 =new String("福建国科福建国科");
String str5 =new String("福建国科福建国科");
String str6 =new String("福建国科");
String str7 ="福建国科";
String str8 ="福建国科";
System.out.println("==比较:"+ (str4 == str5) + ",equals比较:"+str4.equals(str5));
System.out.println("==比较:"+ (str6 == str7) + ",equals比较:"+str6.equals(str7));
System.out.println("==比较:"+ (str7 == str8) + ",equals比较:"+str7.equals(str8));
}
}
参考资料:https://www.runoob.com/java/java-stringbuffer.html
线程安全的,可被同步访问,即多个线程可以同步使用。
String 的字符串缓冲区,但不能修改。但是通过调用append或者insert来改变StringBuffer的内容与长度。
StringBuffer() //构造一个其中不带字符的字符串缓冲区,其初始容量为 16 个字符
StringBuffer(String str) //构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
StringBuffer(int capacity) //构造一个不带字符,但具有指定初始容量的字符串缓冲区
非线程安全的,不能同步访问,速度优势,多数情况推荐使用。与StringBuffer功能完全相同的类。但是StringBuilder是非线程同步的。因此速度比StringBuffer来的快。
/**
* 1.StringBuffer 和 StringBuilder 可以对字符串进行修改,并且不产生新的未使用的对象.
* 2.StringBuffer字符串缓冲,是线程安全的,但是访问速度相对慢
* 1)通过append()对字符串进行修改
* StringBuilder动态字符串,不是线程安全的(不能同步访问),速度较快,多数情况下推荐使用
* 3.除了一些方法是独有的,剩下的一些方法用法和String兼容
* @author wyn
*
*/
public class TestStringB {
public static void main(String args[]) {
//线程安全
StringBuffer sBuffer = new StringBuffer("福建国科");
sBuffer.append("www");
sBuffer.append(".goktech");
sBuffer.append(".cn");
System.out.println(sBuffer);
//用其反转形式取代
sBuffer.reverse();
System.out.println(sBuffer);
//移除字符串中的字符
sBuffer.delete(0,2);
System.out.println(sBuffer);
//指定范围,给定字符串替换字符串中的内容
sBuffer.replace(0,12,"www.goktech.cn");
System.out.println(sBuffer);
//int型的字符串表示形式插入此字符串
sBuffer.insert(1,12);
System.out.println(sBuffer);
StringBuilder sBuilder = new StringBuilder("福建国科");
sBuilder.append("软件");
sBuilder.append("教学");
System.out.println(sBuilder);
}
}
字符串其实可以直接用String类自带的正则表达式校验,主要方法:
String str = "www.goktech.cn福建国科";
String regexp = "\\w+.\\D*";
System.out.println( str.matches(regexp) );
也可以用专门的正则表达式类来匹配。---> java.util 包中的 专门用来处理正则表达式的类
三、系统工具类java.util
regex正则表达式
正则表达式:定义了字符串的模式。通过模式匹配实现对字符的 查询,提取,替换,分割等,从而简化对字符的处理。
情景(主要功能):
- 数据的有效性验证:电话号码的判断、身份证号的判断、密码验证
- 替换文本:
- 查询文本
正则表达式实例:一个字符串其实是一个简单的正则表达式。
java.util.regex 包主要包括以下三个类:
pattern类:编译regexp正则表达式
matcher类:查找字符串是否与正则表达式匹配。
需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。
PatternSyntaxException是一个非强制异常类,表示正则表达式的语法错误;
- ""的作用: 转义符,在String中使用。正则表达式中插入一个正常的 \ ,则需要写入 \ \
- "+"的作用: 一个或多个 之前的表达式
- 量词表示一个正则表达式在匹配的过程中的模式:
- 贪婪型 一般的匹配模式总是贪婪型的,除非被设置了其他选项。贪婪表达式会为所有可能的匹配来尽可能的匹配,也就是匹配最多的字符串。
- 勉强型 用问号来制定,勉强表达式会尽可能少的匹配,也就是匹配最少的字符串。
- 占有型 这种类型是java中特有的
-
字符
\t 制表符TAB; \n 换行符; \r 回车; \f 换页;
限定符
字符类
逻辑操作符
边界匹配符
拓展:MyEcipse的断点调试功能的使用
- Run 运行; Debug 调试
- 如何查看程序执行流程
- F5:单步进入(进入某个方法中)
- F6:单步退出(程序一步步的执行下去)
- F7:回到原先的断点位置。
- F8:跳到下一个断点。如果没有下一个断点,程序运行结束。
设定断点:双击
- 移除断点:在断点上再双击
跳过所有的断点:
- 在断点界面,选择Run--->Skip All BreakPoints
移除所有的断点:
- 在断点界面,选择Run--->Remove All BreakPoints