关于toString()的一些事情
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()的一些事情的更多相关文章
- Java中常见的坑
概述 Java是门极简风格的语言,比其它语言相比,它故意保持较少的特性,不仅在有些不常见的情况下会出些奇奇怪怪的错误,即使很一般的情况下也有可能让人栽根头.如果你习惯了别的语言,你读Java 的代码很 ...
- JS中 toString() & valueOf()
数据的转换 所有对象继承了两个转换方法: 第一个是toString(),它的作用是返回一个反映这个对象的字符串 第二个是valueOf(),它的作用是返回它相应的原始值 toString() toSt ...
- C# 程序性能提升篇-1、装箱和拆箱,枚举的ToString浅析
前景提要: 编写程序时,也许你不经意间,就不知不觉的使程序代码,发生了装箱和拆箱,从而降低了效率,不要说就发生那么一次两次,如果说是程序中发生了循环.网络程序(不断请求处理的)等这些时候,减少装箱和拆 ...
- 【Java基础之Object类(一)】Java中Object类中的所有方法(toString、equals、hashCode、clone、finalize、wait和notify等)详解(转载)
java中的hashcode.equals和toString方法都是基类Object的方法. 首先说说toString方法,简单的总结了下API说明就是:返回该对象的字符串表示,信息应该是简明但易于读 ...
- C#中string.Format()和ToString()格式化方法
C#数字格式化输出是我们在编程中经常需要处理的事情,那么这里向你介绍了一些C#数字格式化输出的例子,这样就会方便你来选择和比较,什么方式是比较适合自己项目的. int a = 12345678; C# ...
- 使用ReflectionToStringBuilder实现toString方法
使用ReflectionToStringBuilder实现toString方法 org.apache.commons.lang.builder.ReflectionToStringBuilder是co ...
- JAVA之旅(九)——Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类
JAVA之旅(九)--Object类,equals,toString,getClass,内部类访问规则,静态内部类,内部类原则,匿名内部类 天天被一些琐事骚扰,学习还得继续 一.Object类 Obj ...
- spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情
<spring扩展点之三:Spring 的监听事件 ApplicationListener 和 ApplicationEvent 用法,在spring启动后做些事情> <服务网关zu ...
- 搞点事情,使用node搭建反向代理
导语 最近有个需求,需要对业务管理后台的操作记录进行上报.一般这种上报需求都是又后台同学来做比较合适的.但是因为后台人力的原因.这个工作落到了我这个小前端的头上.这里记录下做这个需求踩的一些坑. 一. ...
随机推荐
- 那些年很脑残的bugs
1.老师给了前端界面,我们用java写后台. 我改了表单form的action属性,让它跳到自己写的servlet上面去.自己在servlet里面对数据库一顿操作猛如虎,然后让servlet跳回原来页 ...
- Windows程序设计--(三)窗口与消息
3.1 窗口的创建 3.1.1 系统结构概述 所谓「Windows给程序发送消息」,是指Windows呼叫程序中的一个函数,该函数的参数描述了这个特定消息.这种位于Windows程序中的函数称为「窗口 ...
- go中字符串类型string的用法
示例 // 字符串类型string的用法 package main import ( "fmt" "unsafe" ) func main() { // 字符串 ...
- 【记录】mysql查询语句对于为null和为空字符串给出特定值处理
SELECT if(IFNULL(filedName,"指定字符串")="","指定字符串",filedName) '重命名的字符名' FR ...
- SELECT INTO - 从一个查询的结果中创建一个新表
SYNOPSIS SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [ ...
- SYSAUX表空间满,
step1. 确认到底是哪个段占用了sysaux空间: select segment_name,sum(bytes)/1024/1024 from dba_segments where tables ...
- canvas 操作像素 反相
代码实例: <!DOCTYPE html> <html> <head> <style> canvas{ background:#eee; } </ ...
- 线程池(ThreadPool)创建
线程池创建方式jdk1.5 Java通过Executors(jdk1.5并发包)提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活 ...
- eval函数让我忧伤
今天首次接触这个eval函数,让我忧伤了一把.我把当成字符串拼接,结果错得天远地远.大体情况是下面这句代码,一个劲的给我报NameError: name 'qinfeng' is not define ...
- shell脚本学习(7)sort
1 sort的格式 sort [options] [files] sort 参数 文件 2 参数 -t 用单个符char作为默认的字段分隔符, 默认字段分隔符是空白 参数-k 用来定义排序键值字段 ...