java的数组和String
1.hashCode
Object中的方法
public native int hashCode();
带有native关键字的方法调用的是底层C++的dll文件
这种方法我们在工具中看不到具体的实现,当然也可以去其他地方找相关的实现代码。
hashCode()它是一个对象在堆中的内存地址经过hash算法计算之后又进行了进制的转换得出的结果.返回值是int
问题:如果两个对象的hashCode()值一样,说明什么问题?是同一个对象
hashCode()方法有什么用?
因为hashCode()方法计算的对象是内存地址,内存地址对于一个对象来讲是惟一的,所以hashCode()算法算出来的也是唯一值。因此这个方法可以判断:
1. 一个对象是否存在。
2. 一个对象与另一个对象是否是同一个对象。
3. 两个对象的hashCode值比较的话,就相当于引用之间使用"==",只能比较地址,不能比较值。
public class Main{
public static void main(String[] args){
Main a1 = new Main();
Main a2 = a1;
System.out.println(a1.hashCode());
System.out.println(a2.hashCode());
}
}
460141958
460141958
2.数组
是一种引用数据类型
基础数据类型:byte short int long float double boolean char
除去这8种之外,全是引用类型
//什么是引用类型? 类型 变量名,这个变量名指向的是一块内存空间,我们说它就是引用类型。
//A a = 内存地址; 这种形式就是引用类型。java当中,只有两种类型,基础数据类型和引用类型
//引用类型所指向的内存地址实际是对象(常量、static修饰的变量)的内存地址。
特点:
- 每个数组元素的数据类型都是相同的,在数组声明时定义
- 内存中数组的各个元素都是连续有序的
- 所有元素共用一个数组名,利用数组名和下表唯一的确定数组中各个元素的位置
数组需要经过声明、分配内存和赋值后才能被使用
声明:declare 在java中只能声明一个变量,也就是说没有给这个变量赋初始值。
定义:define 在java中,定义一个变量,就是给变量赋值的过程
// 在java中,基础数据类型都是传值
// 引用数据都是传引用(这里的传:实参和形参之间的传递方式,方法的返回值返回的方式)
// java做好了封装,引用类型都是传递的都是引用。返回值类型也都是引用,没有返回过值。
2.1创建数组
数组被创建以后,每个数组元素都将获得与定义的数据类型相应大小的内存,同时自动用数据类型的默认值初始化所有的数组元素
- 整型:0
- 实型:0.0f 或 0.0D
- 字符型:’ \0 ’
- 类对象:null
创建数组后,数组的大小是无法改变的,如果想要数组扩容,那就只能用一个更大的数组去装
2. 2数组的类型
基础数据类型的数组:int[] a;这意味着,a所指向的数组中保存的是int类型的数据
引用类型的数组:Person[] p;这意味着,p所指向的数组中保存的是Person类型的对象的引用
2.3两种初始化方式的差别
- 静态初始化是在已知数组元素值的时候,可以直接静态初始化。
- 静态初始的时候,实际上是根据{}中的值的个数来分配了数组的内存空间
- 动态初始化的时候,实际上是根据new int[初始化大小]中的初始化大小的值来分配内存空间
- 动态初始化是指,后续可以给数组中的元素进行赋值。
- 如果是静态初始化,一开始初始化的时候在{}中没有给值,如果在后续赋值,会抛出Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 0。数组索引越界异常。为什么?因为静态初始化的时候,JVM会根据{}中的值的个数在堆中给数组分配大小。
- 这也说明一个问题,一旦数组的大小被确定之后,是不能改变的。
int[] a = new int[3];
a[3]=100;
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
int[] arr = {};
arr[0] = 1;
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException:
- 数组一旦被创建,其大小就固定了,无论静态的还是动态的。大小是固定的。数组的大小是不可以被改变的。也就是说length值已经被确立了。我们可以想象,这个length属性一定被final修饰。
写几道题练练手
1.判断是否为回文
public class Main{
public static void main(String[] args) {
Scanner str = new Scanner(System.in);
String s = str.nextLine();
if(judge(s))
System.out.println("Yes");
else
System.out.println("No");
}
public static boolean judge (String s){
int i = 0;
char[] charArray = s.toCharArray();
while (i < s.length()/2){
if(charArray[i]!=charArray[s.length()-i-1])
return false;
i++;
}
return true;
}
}
用一个布尔类型的方法来判断是否为回文
运用了toCharArray()方法将字符串转化为字符数组
2.冒泡排序法
public class Main{
public static void main(String[] args) {
Scanner str = new Scanner(System.in);
int n = str.nextInt();
int x[] = new int[n];
for(int i=0;i<n;i++) {
x[i] = str.nextInt();
}
for(int i = 0;i<n;i++)
for(int j=0;j<n-i-1;j++)
{
if(x[j]>x[j+1])
{
int t = x[j];
x[j] = x[j+1];
x[j+1] = t;
}
}
for(int i =0;i<n;i++)
System.out.println(x[i]);
}
}