常用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());
}