第9章 工具类2020-02-26

常用Java包介绍

java.lang

Java语言包,包含String、StringBuffer、Integer、Math、System。

任何类中,该包中的类都会被自动导入。

java.util

包含一些实用的工具类( 包含list, calendar, date等类)

java.io

提供多种输入/输出功能的类。

java.net

提供网络应用功能的类。 

常用类

java.lang包下的类


java.util包下的类



Object介绍及方法

Object类是所有类的超类。

Object是Java语言中唯一一个没有父类的类。

一个类可以不是Object类的直接子类,但一定是Object类的子类,Java中的每一个类都是从Object扩展来的。

在Object类中定义的方法,在所有类中都可以使用。

public boolean equals(Object obj)

比较两个对象引用的值是否相等(比较哈希地址)

public int hashCode()

返回十进制整数,唯一标识一个对象

public String toString()

返回  类名@hashcode

Object类常用方法

public boolean equals(Object obj):

比较两个对象引用的值是否相等(比较地址)。指出调用该方法的对象是否与obj对象相等。即地址是否相等。

public int hashCode():

该方法返回对象的哈希码,哈希码是一个代表对象的十六进制整数,比作对象的身份证号。在程序运行期间,每次调用同一个对象的hashCode()返回的哈希码必定相同,但是多次执行同一个程序,程序的一次执行和下一次执行期间同一个对象的哈希码不一定相同。实际上默认的哈希码是将对象的内存地址通过某种转换得到的,所以不同对象会有不同的哈希码。

public String toString():

返回  类名@hashcode ;事实上返回这样的字符串没有什么实际的意义。一般子类都会覆盖该方法,让它返回有意义的文本。

equals()方法判断相等

理解equals()方法和==运算符的区别是非常重要的。

默认情况下(即没有被重写时)equals()只能比较引用类型,"=="既能比较引用类型又能比较基本类型。

equals()方法从Object类继承,即比较对象引用的值

一般都被子类方法覆盖,不再比较引用的值

"=="运算符:

比较基本数据类型:相当于算术等号

比较引用数据类型:比较引用的值,不能被覆盖。

通常情况,子类要重写equals( ),改变它的含义。所以有的类中equals( )是比较地址,有的类中该方法就不比较地址,具体的,就看子类新定义的该方法的规定。看看包装类中的equals()方法?

在java中有个规定:如果equals( )返回两个对象是相等的,那这两个对象上调用hashCode( )返回的整数必须相等。否则在使用Hash类型集合时就会产生错误。

Object o=new Object();

System.out.println(o.hashCode());

System.out.println(Integer.toHexString(o.hashCode()));//h码ashCode

System.out.println(o.getClass().getName());

System.out.println("人工:"+o.getClass().getName());

System.out.println(o);

System.out.println(o.toString());// 默认调用toString 方法

equals()方法判断相等

注意:覆盖equals( )方法同时,还要记得覆盖hashCode( )方法。需要说明,如果equals( )返回两个对象不等,它们的hashCode( )也可以返回相同的整数。但是最好让它们的hashCode( )返回不同的整数,这有利于提高Hash类型集合的性能。

重写equals方法时,一定要重写hashcode()方法吗?

hashcode的调用的条件:

想往map里面放一个类作为map的键值,这个类又是自己设计的;

虽然类不是自己写的,但是你修改了这个类的equals方法;

如果满足上述调用条件,就要注意重写hashcode方法。 这样 当你往map里放值得时候,系统会调用这个对象的.hashcode()方法来生成相应的hash值,来映射相应的对象。

如果同一个类的两个对象的属性值相等,那么他们的hashcode一定相等吗?

这个要看你具体如何实现你的hashcode,如果你希望他们的值一样hashcode也一样,你就可以这样实现。 但是hashcode的实现,一般要满足几个特征,比如 自反性,传递性什么的。 

课堂练习

编写一个商品类,包含品名和价格。创建商品对象,判断两个同名商品对象是否相同;判断两个同名同价格商品对象是否相同。

package com.neusoft.test1;

public class Goods {

private String gname;

private int price;

public Goods(String gname,int price) {

this.gname=gname;

this.price=price;

}

//如果两个对象判断相等则hashcode值一定相等

@Override

public boolean equals(Object obj) {

if(this== obj) {

return true;

}else {

if(this.gname.equals(((Goods)obj).gname) &&this.price==((Goods)obj).price) {

return true; //商品名 与价格名 相同

}

return false;

}

// TODO Auto-generated method stub

// return super.equals(obj);

}

@Override

public int hashCode() {

// String 类型 判断是否相等使用equals----》true 字符串相同

// 字符串相同 ------》hashcode值相同

return this.gname.hashCode()+price;

}

}

测试类

package com.neusoft.test1;

public class Test1 {

public static void main(String[] args) {

// TODO Auto-generated method stub

method2();

}

public static void method2() {

Goods g1= new Goods("鼠标",100);

Goods g2= new Goods("鼠标",100);

// Goods g2= g1;

Goods g3= new Goods("鼠标",200);

System.out.println("g1 hashcode:"+g1);//商品名与价格相同  g1.hashcode=g2.hashcode

System.out.println("g2 hashcode:"+g2);

System.out.println("g3 hashcode:"+g3);

System.out.println("g1.equals(g2):"+g1.equals(g2)); //商品名与价格相同,就是同一件商品g1.equals(g2)=true

System.out.println("g2.equals(g3):"+g2.equals(g3));

}

}

包装类

包装类简介

基本数据类型不是对象层次结构的组成部分。有时需要像处理对象一样处理这些基本数据类型,可通过相应的“包装类”来将其“包装”后使用。

基本数据类型和对应包装类:集合(引用数据类型)

*** char     int  数据类型喝包装类 不一样 

包装类常用方法和属性

整型最大值、最小值:


使用Character对字符判断


public static void method4() {

char c='A';

// 是否为小写字母

if(c>=97 &&c<=122) {

System.out.println(c+"是小写字母");

}else {

System.out.println(c+"不是小写字母");

}

Character c1='1';  //char 的包装类

if(Character.isLowerCase(c1)) {

System.out.println(c1+"是小写字母");

}else {

System.out.println(c1+"不是小写字母");

}



字符串与基本数据类型、包装类型转换图

***********

转换为包装类



例:

public static void method5() {

// 基本数据类型----》包装数据类型  1. new Integer(int)  *2.Integer.valueOf(a)

int a=10;

Integer a1=new Integer(a);

a1=Integer.valueOf(a);

// 包装数据类型-----》基本数据类型 xxxValue();

a=a1.intValue();

// 字符串---》包装数据类型  1.new Integer(s1) 2.Integer.valueOf(s1)

String s1="10";

Integer a2=new Integer(s1);

Integer a3=Integer.valueOf(s1);

// 包装数据类型---》字符串  a4.toString();

Integer a4=new Integer("11");

String s2=a4.toString();

// 字符串----》基本数据类型 Integer.parseInt(s3); String.valueOf(a6);

String s3="100";

int a5=Integer.parseInt(s3);

// 基本数据类型----》字符串    a6+""

int a6=10;

String s4=a6+"";

System.out.println(s4+1);

String s5=String.valueOf(a6);

System.out.println(s5+1);

}

自动拆装箱

自动的装箱和自动拆箱

在进行基本数据类型和对应的包装类转换时,系统将自动进行

JDK自从5.0版本后引入

方便程序的编写

public static void method6() {

// 自动装箱    基本数据类型----》包装数据类型

Integer i=10;

// 自动拆箱  包装数据类型----》基本数据类型

int a=i;

Integer[] arr= {1,2,3,4,5};

System.out.println(arr[0]);

System.out.println(arr[0].MAX_VALUE);

System.out.println(Integer.MAX_VALUE);

}

//推荐使用 System.out.println(Integer.MAX_VALUE);

public static void method7() {

// 基本数据类型

int a1 = 128;

int a2 = 128;

System.out.println(a1 == a2); //true

Integer b1 = 128; //*** 127(常量池) |  128(会新分配空间) 

Integer b2 = 128;

System.out.println(b1 == b2); //true

// Integer c1 = new Integer(10);

// Integer c2 = new Integer(10);

// System.out.println(c1 == c2); //false

//    BigDecimal

}


字符串类

字符串是我们在编程中最常使用的一种数据类型,它的表现形式可以分为两种:

String

StringBuffer。

字符串不属于8种基本的数据类型,而是一种引用类型。

String对象代表一组不可改变的Unicode字符序列,对它的任何修改实际上又产生一个新的字符串,String类对象的内容一旦被初始化就不能再改变。

StringBuffer对象代表一组可改变的Unicode字符序列。

String类是final类型的类。

String的创建

String的创建:有两种方式:

静态方式(常用)。像是给变量直接赋值一样来使用。如:String s1 = “abc”; String s2 = “abc”;

动态方式。动态的内存分配,使用new运算符。如:String s3= new String(“abc”); String s4= new String(“abc”);

两种方式创建的字符串区别:

使用静态方式创建的字符串,在方法区的常量池中只会产生唯一一个字符串对象,使用该方式产生同样一个字符串时,内存中不再开辟另外一块空间,而是两个引用变量指向同一个字符串对象。

使用动态方式创建的字符串,在堆内存中会产生出不同的对象。


public static void method8() {

String a="abc";

String b="abc";

System.out.println("a==b:"+(a==b));

String c=new String("abc");

System.out.println("c==a:"+(c==a));

String d=new String("abc");

System.out.println("c==d:"+(c==d));

}

//    a==b:true

// c==a:false

// c==d:false

// new 就是在堆内存创建了一个空间


String类构造方法

public static void method9() {

// 将字符数组----》字符串  new String(carr);

char[] carr= {'你','好','j','a','v','a'};

String s=new String(carr,1,2);

String s=new String(carr);

System.out.println(s);

}


String对象的创建

连接操作符

连接操作符“+”,可以将其它各种类型的数据转换成字符串,并前后连接成新的字符串

public static void method10() {

String a="abc";

String b="kkk";

System.out.println(10+10+a+b); // 20abckkk

System.out.println(10+a+b+10);//10abckkk10

System.out.println(a+b+10+10);//abckkk1010

}

字符串类特点

String类的特点:.

任何一个String对象在创建之后都不能对它的内容作出任何改变(immutable)

连接、获得子串和改变大小写等操作,如果返回值同原字符串不同,实际上是产生了一个新的String对象

在程序的任何地方,相同的字符串字面常量都是同一个对象

String类重置了equals方法,用于比较两个字符串的内容

public static void method11() {

String a1="abc";

String a2="abc";

System.out.println(a1==a2);  //true

String a3="abcabc"; //常量池中

System.out.println(a3==(a1+a2)); //false

String a4="abc"+"abc";  // 赋值运算从右向左

System.out.println(a3==a4);  //true 

System.out.println(a4==(a1+a2)); //false a3==a4 

String a5="abc"+new String("abc"); //新分配一个空间

System.out.println(a3==a5); // false

System.out.println(a5==(a1+a2));  //false

String a6=new String("abc")+new String("abc");

System.out.println(a3==a6); //false

System.out.println(a6==(a1+a2)); //false

String a7=new String("abcabc");

System.out.println(a7==a3); // false

System.out.println(a7==(a1+a2)); //false

}

String对象的创建


public class Test2 {

public static void main(String[] args) throws Exception {

// TODO Auto-generated method stub

method12();

}

public static void method12() throws Exception {

byte[] barr=new byte[10];

String a="中";

// String----》byte arr

barr=a.getBytes("utf-8");

for(byte b:barr) {

System.out.println(b);

}

// byte arr---->String

String s=new String(barr,"utf-8");

System.out.println(s);

// utf-8 -28,-72,-83

// gbk   -42  -48

}

String类的转换


public static void method13() throws Exception {

// string--->byte[]

String a="中国";

byte[] b1=a.getBytes("gbk");

byte[] b2=a.getBytes("utf-8");

// byte[]--->string

String s1=new String(b1,"gbk");

String s11=new String(b1);

String s2=new String(b2,"utf-8");

String s21=new String (b2);// gbk  乱码

System.out.println(s1);

System.out.println(s11);

System.out.println(s2);

System.out.println(s21);

// String --->char[]

char[] carr=a.toCharArray();

for(char c:carr) {

System.out.println(c);

}

// char[] ---->String

String s3=new String(carr);

System.out.println(s3);

}

String类中常用的方法




public static void method14() {

// 大小写问题

// toUpperCase( ) 小写

//      toLowerCase( )  大写

String  s="ABCdefg";

String s1=s.toLowerCase();

System.out.println(s1);

String s2=s.toUpperCase();

System.out.println(s2);

System.out.println(s.indexOf('d'));//3

//去掉两端空格 

String s3="  fsadf  ";

String s4=s3.trim();

System.out.println(s4);

System.out.println(s4.concat("kkkk"));

// s.substring(m, n) 从下表 m开始截取    截取 n-m个字符 

System.out.println(s.substring(2, 5)); //

String s5="tom,jerry,scott,king";

String[] s5arr=s5.split(","); //分割符

for(String sn:s5arr) {

System.out.println(sn);

}

String s6="TomAndJerry.doc";

if(s6.endsWith(".AVI")) {

System.out.println(s6+"是高清视频格式");

}else {

System.out.println(s6+"不是高清视频格式");

}

String s7="坤坤  i  fuck you ";

System.out.println(s7.replace("fuck", "*"));

}

课堂演示

三位数数字转化字符串补零,如:数字1转化后为“001”

public static void method15() {

// 输入 1~999 如果不足三位补全成为3位  如:10---》010    1---》001

Scanner sc=new Scanner(System.in);

int a=sc.nextInt();

String result="";

if(a<10) {

result="00"+a;

}else if(a<100) {

result="0"+a;

}else {

result=a+"";

}

System.out.println(result);

}

StringBuffer类

StringBuffer类用于内容可以改变的字符串

可以使用StringBuffer来对字符串的内容进行动态操作,不会产生额外的对象

public static void method16() {

// 缓冲字符串,可以高效的拼接字符串

//StringBuilder 比StringBuffer 效率高

// StringBuilder  快

// StringBuffer  慢

// 二者使用方式相同 

// *********************线程安全

// StringBuilder 线程不安全

// StringBuffer 线程安全

StringBuffer sb=new StringBuffer("aaa");

sb.append("bbbb");  //添加

sb.append("cccc");  //添加

System.out.println(sb.toString());

String a="aaa";

a=a+"bbbb";

a+="cccc";

StringBuilder sb1=new StringBuilder("aaaa");

sb1.append("bbbb");

sb1.append("cccc");

System.out.println(sb1.toString());

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,254评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,875评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,682评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,896评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,015评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,152评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,208评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,962评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,388评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,700评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,867评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,551评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,186评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,901评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,689评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,757评论 2 351

推荐阅读更多精彩内容