Object类
java.lang.Object类是所有java类的最高层次父类,该类提供了面向对象编程技术的基本机制。
重要方法列表:
hashCode()
hashcode可以更快的查询到小的内存块分割线下是网络搜集整理(在具体的java编程思想已经很清楚了)
-------------------------------------------------------------------------------->
总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set。你知道它们的区别吗?前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。但是,如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了。也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。
于是,Java采用了哈希表的原理。哈希(Hash)实际上是个人名,由于他提出一哈希算法的概念,所以就以他的名字命名了。哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。如果详细讲解哈希算法,那需要更多的文章篇幅,我在这里就不介绍了。初学者可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。
这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
所以,Java对于eqauls方法和hashCode方法是这样规定的:
1、如果两个对象相同,那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同
上面说的对象相同指的是用eqauls方法比较。
-------------------------------------------------------------------------------------------------
在举一个形象的例子
我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。
那么。重写了equals(),为什么还要重写hashCode()呢?
想想,你要在一个桶里找东西,你必须先要找到这个桶,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊
扯的有点远了-------------------------------------------言归正传
public class Person{ private int age; public Person(int age){ this.age = age; } public void setAge(int age){ this.age = age; } public int getAge(){ return age; } }
------------------------------------------------------------------------------------也就是打印他的地址置是多少
public class TestHashCode{ public static void main(String[] args){ Person p1 = new Person(18); Person p2 = new Person(18); int handle1 = p1.hashCode(); System.out.println(handle1); System.out.println(Integer.toHexString(handle1)); System.out.println(p1); System.out.println("----------------"); System.out.println(p2.hashCode()); } }
输出------------------- 12677476 c17164 Person@c17164 ---------------- 33263331
toString()方法
equals()方法
finalize()方法
clone()方法
字符串相关类型
String类
StringBuffer类
StringBuffer类对象保存可修改的Unicode字符序列
构造方法:
主要功能方法:
StringBuilder类
JDK5.0以后引入,该类能过提供与StringBuffer相同的功能,二者区别:
StringTokenizer类
java.util.StringTokenizer类的功能是将当前字符串按照默认或指定的分隔符分解为多个片段
构造方法:
主要功能方法:
分解字符串的新方法
从JDK1.4开始,sun公司推荐开发者使用一种新的字符串的分解方式
public class TestStringSplit{ public static void main(String args[]){ String s = "阳光:沙滩:海浪:仙人掌"; String[] results = s.split(":"); for(String each: results) { System.out.println(each); } } }
输出------------------------------> 阳关 沙滩 海浪 仙人掌
日期相关类型
Date类
java.util.Date类用于表示特定的时间点,精确到毫秒,但不支持日期的国际化和分时区显示。
构造方法:
主要功能方法:
Calendar类
抽象类java.util.Calendar类提供了常规的日期修改功能和国际化支持
主要方法:
Locale类
java.util.Locale类描述特定的地理,政治/文化上的地区,Locale对象主要封装了"地区"和"语言种类"两方面的信息,通常用于在国际化/本地化程序中以地区/语言相关的方式显示日期、数字或文本信息等.
主要方法:
TimeZone类
java.util.TimeZone类描述时区信息
TimeZone被定义为抽象类,可以调用其静态方法getDefault()已获得类的实例。
其他方法:
GregorianCalendar类
Java.util.GregorianCalendar是Calendar的子类,该类提供了世界上大多数国家/地区使用的标准日历系统,并添加判断闰年的功能
主要方法:
DateFormat类
java.text.DateFormat类提供了将日期/时间信息进行格式化处理的功能..
主要方法:
SimpleDateFormat类
数学相关类型
Math类
java.lang.Math类提供常用数学功能和数学常量:
Random类
java.util.Random类是基于"线性同余"算法的一种伪随机数序列生成器,其主要功能方法包括:
BigInteger/BigDecimal
java.math包中定义的BigInteger和BigDecimal类型可以分别提供任意长度/精度的整数和浮点数运算功能。
BigInteger类主要方法:
public class TestBigInteger{ public static void main(String args[]){ BigInteger a = BigInteger.valueOf(43); BigInteger b = new BigInteger("12345678901234560000"); //Long c = new Long(12345678901234560000L); //超出范围 BigInteger c = a.add(b); System.out.println(c); System.out.println(a.multiply(b.subtract(BigInteger.valueOf(120)))); System.out.println(b.remainder(a)); System.out.println(b.divide(a)); System.out.println(b.pow(2)); System.out.println(b.compareTo(a)); } }
java.text.NumberFormat/DecomalFormat提供了将数字格式化为语言环境相关字符串以及逆向解析字符串为数字的功能
import java.util.Locale; import java.text.NumberFormat; public class TestNumberFormat{ public static void main(String args[]){ double d = 1234.56; NumberFormat nf0 = NumberFormat.getInstance(); NumberFormat nf1 = NumberFormat.getInstance(new Locale("zh","CN")); NumberFormat nf2 = NumberFormat.getInstance(new Locale("de","CH")); NumberFormat nf3 = NumberFormat.getInstance(new Locale("de","GE")); System.out.println("默认风格:" + nf0.format(d)); System.out.println("中国风格:" + nf1.format(d)); System.out.println("瑞士风格:" + nf2.format(d)); System.out.println("德国风格:" + nf3.format(d)); } }
import java.util.Locale; import java.text.NumberFormat; public class TestNumberFormat2{ public static void main(String args[]){ double d = 1234.56; NumberFormat nf1 = NumberFormat.getCurrencyInstance(new Locale("zh","CN")); NumberFormat nf2 = NumberFormat.getCurrencyInstance(new Locale("en","US")); NumberFormat nf3 = NumberFormat.getCurrencyInstance(new Locale("zh","HK")); System.out.println("中国货币:" + nf1.format(d)); System.out.println("美国货币:" + nf2.format(d)); System.out.println("香港货币:" + nf3.format(d)); NumberFormat nf4 = NumberFormat.getPercentInstance(); System.out.println(nf4.format(0.7483)); } }