12-系统常用类一

一、帮助文档

  • 学会查询API文档
    • API(Application Programming Interface)
      • 应用程序编程接口
    • Java API
      • Java提供的类,这些类将底层实现封装起来;
      • 使用类,不需要关心如何实现,只关心怎么用
  • 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正则表达式

正则表达式:定义了字符串的模式。通过模式匹配实现对字符的 查询,提取,替换,分割等,从而简化对字符的处理。


情景(主要功能):

  1. 数据的有效性验证:电话号码的判断、身份证号的判断、密码验证
  2. 替换文本:
  3. 查询文本

正则表达式实例:一个字符串其实是一个简单的正则表达式。

java.util.regex 包主要包括以下三个类:

pattern类:编译regexp正则表达式

matcher类:查找字符串是否与正则表达式匹配。

需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

PatternSyntaxException是一个非强制异常类,表示正则表达式的语法错误;

  1. ""的作用: 转义符,在String中使用。正则表达式中插入一个正常的 \ ,则需要写入 \ \
  2. "+"的作用: 一个或多个 之前的表达式
  3. 量词表示一个正则表达式在匹配的过程中的模式:
    • 贪婪型 一般的匹配模式总是贪婪型的,除非被设置了其他选项。贪婪表达式会为所有可能的匹配来尽可能的匹配,也就是匹配最多的字符串。
    • 勉强型 用问号来制定,勉强表达式会尽可能少的匹配,也就是匹配最少的字符串。
    • 占有型 这种类型是java中特有的

字符

\t 制表符TAB; \n 换行符; \r 回车; \f 换页;

限定符

字符类

逻辑操作符

边界匹配符

拓展:MyEcipse的断点调试功能的使用

  • Run 运行; Debug 调试

  • 如何查看程序执行流程
    • F5:单步进入(进入某个方法中)
    • F6:单步退出(程序一步步的执行下去)
    • F7:回到原先的断点位置。
    • F8:跳到下一个断点。如果没有下一个断点,程序运行结束。

设定断点:双击

  • 移除断点:在断点上再双击

跳过所有的断点:

  • 在断点界面,选择Run--->Skip All BreakPoints

移除所有的断点:

  • 在断点界面,选择Run--->Remove All BreakPoints