一、访问控制修饰符
1、private:仅对本类可见
2、public:对外部完全可见
3、protected:对本包与所有子类可见
4、对本包可见,不需要修饰符
二、hashCode方法
散列码(hash Code)是由对象导出的一个整型值
公式如下:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
String类使用以下算法计算散列码
int hash = 0;
String Str;
for (int i = 0;i<Str.length();i++)
hash = 31*hash +Str.charAt(i);
//charAt(int index)返回index索引处的字符
hashCode方法定义在Object类,每一个对象都有一个默认的散列码,其值由对象的存储地址得出。
三、toString方法
toString方法是object中一个重要的方法,它会返回表示对象值的一个字符串。
例1、以数组为例
import cn.edu.abc.corejava.*;
import java.util.Arrays;
public class hello_world{
public static void main(String[] args){
int[] A ={1,2,3};
String S = Arrays.toString(A);
System.out.println(Arrays.toString(A)+"\n"+S.length());
}
}
注意:字符串长度为9,而不是7,因为元素之间用逗号和空格(“, ”)分割。
多维数组可以利用Arrays.deepToString方法
四、泛型数组列表
一般来说,数组必须在编译时确定整个数组的大小,难以动态的更改数组。使用Java中的另一个类,名为ArraysList,其类似与数组,但在添加或删除元素时,它能够自动的调整数组容量。
需要注意的一点是:<>中不能为基本数据类型
声明:
1、ArrayList<类名> 类对象名 = new ArrayList<类名>();
2、var 类对象名 = new ArrayList<类名>();//Java10中
方法:
- ArrayList<E>() //构造一个空数组列表
- ArrayList<E>(int initialCapacity) //构造一个指定容量的空数组列表
- boolean add(E obj) //在数组列表的末尾追加一个元素,永远返回ture
- int size() //返回列表中的元素个数
- void trimToSize() //将数组列表存储容量削减到当前大小
访问数组列表元素的方法:
- E set(int index,E obj) //将值obj放在指定的索引位置,返回之前的内容
- E get(int index) //得到指定索引位置存储的值
- void add(int index,E obj) //后移元素从而将obj插入到指定的索引位置
- E remove(int index) //删除指定位置的元素,并将后面的所有元素前移,返回删除的元素
注意:数组列表声明时的容量与数组大小(size()方法)的区别,实际元素个数不同实际元素个数可能超过容量。初始构造的数组列表的size为0。
import java.util.*;
public class AA12_21 {
public static void main(String args[])
{
var list = new ArrayList<Employee>(10);
while(list.size()<17)
{
var x = new Employee("员工"+list.size());
list.add(x);
}
System.out.println(list);
System.out.println(list.get(16).getName());
}
}
虽然构造的list的容量为10,初始时size为0,add追加1个元素后list.size()=1,最终size值为17,即list中有17个元素。注意:list.get()、set()索引从0开始。
五、对象包装器与自动装箱
有时候需将int等基本数据类型转换为对象。所有的基本类型都有一个对应的类。
(1)、包装器
如Integer对应int,而这些类(Integer)被称为包装器(wrapper)。
包装器类是不可改变的,即一旦构造的包装器,就不允许更改包装在其中的值。同时,包装器类是final,因此无法派生其子类。
//因为其<>中无法使用基本数据类型,所有要使用包装器
var list = new ArrayList<Integer>();
应当注意:由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远低于int[]数组。
(2)、自动装箱
虽然数值被包装在对象中,但可以使用add的方法,向ArrayList<Integer>添加int类型的元素
自动装箱:
list.add(3);
将自动的变换成
list.add(Ineger.valueOf(3));
形如以上的变换方式称为自动装箱。
当将一个Integer对象赋给int值时,将会自动拆箱
自动拆箱:
int n = list.get(i);
转换为
int n = list.get(i).valueOf();
需要强调的是:装箱与拆箱只是编译器的工作,而不是虚拟机。编译器在生成类的字节码时会插入必要的方法调用。虚拟机只是执行这些字节码。
使用数值包装器的好处是,可以将一个数字字符转换为数值。
//将字符串转换为整形
int x = Integer.parseInt(s);
int x = Integer.valueOf(s);
//将整形转换为字符串
String s = Integer.toString(x);
String s = Integer.valueOf(x);
这里的parseInt与Integer对象没有任何关系,parseInt是一个静态方法。而Integer是放置该方法的好地方。
六、参数数量可变的方法
Java使用省略号来声明可变参数。“...”是Java代码中的一部分,它表明这个方法可以接收任意数量的变量。
double n = (max(1,2,3,4,5,6,7,88));
public static double max(double...value)
{
double x = Double.NEGATIVE_INFINITY;//负无穷
for(double element:value)
if(element>x)
x = element;
return x;
}
七、枚举类
使用关键字enum定义枚举类。
public enum Size{SMALL,MEDIUM,LARGER};
//这个声明定义的类型是个类,刚好有三个实例,不能构造新的对象
比较两个枚举类的值时,使用"=="比较,并不需要调用equals。
如果需要的话,可以为枚举类型增加构造器、方法、字段。枚举的构造器总是是私有的,构造器只能在构造枚举常量时调用。在构造器前的修饰符private可以省略。
public enum Size
{
SMALL("S"),MEDIUM("M"),LARGER("L");//调用构造器构造的三个枚举常量
private String abb;
private Size(String abb)//私有
{
this.abb = abb;
}
public String getAbb()
{
return abb;
}
}
所有枚举类都是Enum的子类,他们继承了这个类的许多方法:
values方法:返回一个包含全部枚举值的数组。
static Enum valueOf(Class enumClass,String name):返回给定类中指定名字的枚举常量。
String toString():返回枚举常量名。
int ordinal():返回枚举常量在enum声明的位置,位置从0开始。
int compareTo(E other):如果枚举类出现在other之前,返回一个负整数,若this==other,返回0,否则返回一个正整数。枚举常量的出现次序在enum声明中指出。
Size.SMALL.toString(); //返回字符串“SMALL”
Size s = Enum.valueOf(Size.class,"SMALL"); //将s设置成Size.SMALL
Size[] values = Size.values(); //返回一个包含一个枚举值的数组Size.SMALL...
Size.SMALL.ordinal(); //返回SMALL常量的位置0