数组作为一种引用类型,申请的空间在堆中
数组中的元素作为对象的属性,除此之外数组还包括一个成员属性 length, length 表示数组的长度
数组的长度在数组对象创建后就确定了,就无法再修改了
可以利用多态的思维,将数组定义成父类,则数组中可以存放子类,当然最大的父类是Object!!!!
public class Test {
public static void main(String[] args){
Object [] a = new Object[5];
a[0] = 1;
a[1] = 1.1;
a[2] = true;
a[3] = "123";
a[4] = '1';
System.out.println(Arrays.toString(a));//[1, 1.1, true, 123, 1]
}
}
数组内容的比较可以使用 equals()方法吗?
public class ArrayTest06
{
public static void main(String[] args)
{
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a.equals(b));//false
}
}
数组是引用类型,使用equals()方法调用的是Object的equals()方法,执行的依然是==,也就是地址比较。
解决方案:
public class ArrayEqualsTest07
{
public static boolean isEquals(int[] a, int[] b)
{
if( a == null || b == null )
{
return false;
}
if(a.length != b.length)
{
return false;
}
for(int i = 0; i < a.length; ++i )
{
if(a[i] != b[i])
{
return false;
}
}
return true;
}
public static void main(String[] args)
{
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(isEquals(a,b));
System.out.println(Arrays.equals(a,b));
}
}
1、数组长度不可变,那么数组怎么扩容呢?
2、数组扩容涉及到数组的拷贝,数组拷贝会耗费大量的资源。
3、数组怎么优化,怎么样可以提高效率?
public class ArrayTest08
{
public static void main(String[] args){
int[] src = {5,6,9,8,2,3,6,7,5,6,4,2,3,8,9};
int[] dest = {1,1,1,1,1,1,1,1,1};
//这里调用的是自己写的 arraycopy
//arraycopy(src,3,dest,1,4);
//调用 JDK 库中 System 类中提供的 arraycopy 方法
System.arraycopy(src,3,dest,1,4); //底层是 native 方式
//遍历
for(int i=0;i<dest.length;i++){
System.out.println(dest[i]);
}
}
/**
* 自定义的数组拷贝的方法
* @param src 原数组
* @param srcPos 原数组开始拷贝的下标
* @param dest 新数组
* @param destPos 新数组开始拷贝的下标
* @param length 拷贝的元素个数
*/
public static void arraycopy(int[] src,int srcPos,int[] dest,int destPos,int length){
for(int i=srcPos;i<srcPos+length;i++){
//dest[destPos] = src[i];
//destPos++;
dest[destPos++] = src[i];
}
}
}
不可以通过继承去重新定义方法,可以定义一个类,包含String类,然后再增强或者实现。
public class StringTest02 {
public static void main(String[] args) {
String s1 = "abc";//指向的常量池
String s2 = "abc";//指向的常量池
String s3 = new String("abc");//指向的是堆内存
System.out.println("s1==s2, " + (s1==s2));//true
System.out.println("s2==s3, " + (s2==s3));//false
System.out.println("s2 equlas s3," + (s2.equals(s3)));//true
}
}
定义String时,尽量使用双引号定义,这样可以节约空间,重复利用
因为 String 是不可变对象,如果多个字符串进行拼接,将会形成多个对象,这样可能会造成内存溢出,会
给垃圾回收带来工作量,如下面的应用最好不要用 String
线程安全 != 保证拼接顺序
StringBuffer的线程安全只是保证了在一次append()中不会有其他线程进入
为了保证线程安全,包装类都是不可变类型。
基本类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
除了 Boolean 和 Character 外,其它的包装类都有 valueOf()和 parseXXX 方法 ,同时都是number的子类
自动装箱和拆箱是JDK1.5之后提供的,方便基本类型与包装类之间的转换
String、 int、 Integer 之间的转换
public class Test {
public static void main(String[] args) {
//String + Integer
Integer a = new Integer("123");
String b = Integer.toString(123);
//String + int
int c = Integer.parseInt("123");
String d = String.valueOf(c);
//int + Integer
Integer e = 123;
int f = e.intValue();
}
}