Java上输出一个数组的时候,不可以直接输出

System.out.println(arr);

直接输出数据的名称会输出数组的内存地址。换句话说,他的输出是:

getClass().getName() + '@' + Integer.toHexString(hashCode())

toString()是Object类里的一个方法,所以默认java里所有类都继承了这个,所以默认所有对象都具备这个方法。

它通常只是为了方便输出,比如System.out.println(xx),括号里面的“xx”如果不是String类型的话,就自动调用xx的toString()方法

当我们直接输出数组名称的时候,会调用到toString(),然后「 [I@53d3d20b 」 这样的数据就被输出了,所以当我们想要可以按照我们的想法,不想使用for循环去打印这个数组,我们可以通过重写数组的toString()方法来实现我们所想。

     @Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1)
res.append(",");
}
res.append(']');
return res.toString();
}

当然,想使用这个方法需要重写整个数组的代码,所以我们可以写一个数组的泛型的代码:

package Array;

import java.util.Objects;

public class Array<E> {
private E[] data;
private int size; //构造函数,传入数组容量
public Array(int capacity) {
// data = new E[capacity];
data = (E[]) new Object[capacity];//强制类型转换
size = 0;
} public Array() {
this(10);
} public int getSize() {
return size;
} public int getCap() {
return data.length;
} public void addLast(E e) {
add(size, e);
} public void addFirst(E e) {
add(0, e);
} //是否包含元素e
public boolean contains(E e) {
for (int i = 0; i < size; i++) {
// if (data[i] == e) //引用比较
if (data[i].equals(e)) //值比较
return true;
}
return false;
} public int find(E e) {
for (int i = 0; i < size; i++) {
if (data[i].equals(e))
return i;
}
return -1;
} public void add(int index, E e) {
if (index < 0 || index > size)
throw new IllegalArgumentException("Add failed.index is not support.");
if (size == data.length)
resize(2 * data.length);
for (int i = size - 1; i >= index; i--)
data[i + 1] = data[i];
data[index] = e;
size++;
} //获得index索引位置的元素
E get(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index is not support!");
}
return data[index];
} void set(int index, E e) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index is not support!");
}
data[index] = e;
} //删除下标位置元素,并返回删除了什么元素
public E remove(int index) {
if (index < 0 || index >= size) {
throw new IllegalArgumentException("index is not support!");
}
E ret = data[index];
for (int i = index + 1; i < size; i++) {
data[i - 1] = data[i];
}
size--;
if (size == data.length/2)
resize(data.length/2);
return ret;
} public E removeFirst() {
return remove(0);
} public E removeLast() {
return remove(size - 1);
} //从数组中删除元素e
public boolean removeElement(E e) {
int index = find(e);
if (index != -1) {
remove(index);
return true;
} else {
return false;
}
} public void removeElementAll(int e) { } public int findAll(int e) {
return -1;
} @Override
public String toString() {
StringBuilder res = new StringBuilder();
res.append(String.format("Array:size= %d,cap = %d\n", size, data.length));
res.append('[');
for (int i = 0; i < size; i++) {
res.append(data[i]);
if (i != size - 1)
res.append(",");
}
res.append(']');
return res.toString();
} private void resize(int newCapacity) {
E[] newData = (E[]) new Object[newCapacity];
for (int i = 0; i < size; i++) {
newData[i] = data[i];
}
data = newData;
System.out.println("动态扩容了!");
}
}
												

关于toString()的一些事情的更多相关文章

  1. Java中常见的坑

    概述 Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头.如果你习惯了别的语言,你读Java 的代码很 ...

  2. JS中 toString() & valueOf()

    数据的转换 所有对象继承了两个转换方法: 第一个是toString(),它的作用是返回一个反映这个对象的字符串 第二个是valueOf(),它的作用是返回它相应的原始值 toString() toSt ...

  3. C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析

    前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...

  4. 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)

    java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...

  5. C#中string.Format()和ToString()格式化方法

    C#数字格式化输出是我们在编程中经常需要处理的事情,那么这里向你介绍了一些C#数字格式化输出的例子,这样就会方便你来选择和比较,什么方式是比较适合自己项目的. int a = 12345678; C# ...

  6. 使用ReflectionToStringBuilder实现toString方法

    使用ReflectionToStringBuilder实现toString方法 org.apache.commons.lang.builder.ReflectionToStringBuilder是co ...

  7. JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类

    JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...

  8. spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情

    <spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...

  9. 搞点事情,使用node搭建反向代理

    导语 最近有个需求,需要对业务管理后台的操作记录进行上报.一般这种上报需求都是又后台同学来做比较合适的.但是因为后台人力的原因.这个工作落到了我这个小前端的头上.这里记录下做这个需求踩的一些坑. 一. ...

随机推荐

  1. 小Q的棋盘 (贪心)

    小Q的棋盘 (贪心) 题目 洛谷传送门 做法 显然这是一棵树(这个就不多bb了,树的性质) 很容易发现一个性质,如果一条链走完,我们必须回头再走一次那条链(或一部分)才可以走到更多的点 所以为了减少这 ...

  2. CVE-2013-2094 porting to x86-32 分析

    /* * linux 2.6.37-3.8.8 - x86 * @rikiji * * requires System.map and /dev/ptmx * this: http://zmbs.ne ...

  3. C#面试 笔试题 五

    1.什么是受管制的代码? 答:unsafe:非托管代码.不经过CLR运行. 2.net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置. ...

  4. 攻防世界--no-strings-attached

    测试文件:https://adworld.xctf.org.cn/media/task/attachments/5d4117b968684b9483d0d4464e0a6fea 这道题要使用到gdb文 ...

  5. windows下nvm的安装及使用

    由于更新了npm版本之后导致npm的命令都会报错,一顿百度,明白了nvm可以管理node版本的,下面是操作过程: 如果在安装nvm之前已经下载了node 需要把node卸载!!! 需要把node卸载! ...

  6. linux网络子系统调优

  7. Kvm04 kvm虚拟机热迁移,可视化管理

    目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...

  8. Django组件——用户认证

    用户认证 一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1 .authentica ...

  9. 洛谷4206/NOI2005T4 聪聪和可可 期望DP+记忆化搜索

    题意:给出n个点m条边的无向图,两个主角聪聪和可可开始分别在S点和T点.聪聪想吃掉可可,每次由匆匆先行动后来可可行动.聪聪的行动是选他到可可的最短路上的点走最多两步(如果最短路有几条就选编号最小的走) ...

  10. VMware Tool的新手简单安装

    1.打开工具栏的虚拟机,点击安装VMware tool2.打开根目录的media文件夹,打开用户名命名的文件夹,复制VMxxx.tar.gz的压缩包3.粘贴到Home,4.在终端输入tar -zxvf ...