Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧

Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧,第1张

在一个开发案例中,需要把一个 Object 对象转换为 List<Object> 对象。这个 Object 对象本质上是 Arrays$ArrayList ,也就是 Arrays 类内部的 ArrayList 类。$ 是类与它的内部类之间的表示分隔符。

Java 中可以通过 xxxgetClass()getName() 的方式得到一个对象所对应的类全名。

如果这个内部类是 public,那么我们可以通过点分法来进行显式转换,形如: (ArraysArrayList) xxx。可惜的是这个 ArrayList 类是 private,所以不能直接进行显式转换。

ArrayList 类提供了三种构造函数,其中的 ArrayList(Collection< extends E> c) ,接受一个 Collection 作为入参,来初始化所创建的 ArrayList 对象:

按照这个思路,我们可以把这个 Object 先显式转换为 Collection,然后在传入 ArrayList 类。因为 Arrays$ArrayList 本身也实现了 Collection 类:

最终转换方法是: new ArrayList<>((Collection) params) 。

[Java中Arrays详解] >

user 如果在while外实例化,始终只有一个user 对象,

User u = new User();中栈内存中始终只有一个变量u,无论这个u接收了多少个user对象,这个u只能指向一个堆内存中的user实例对象,所以只有一个。

package sync;

import javautil;

public class L4_1 {

public static void main(String[] args) {

ArrayList<Xs> aa1 = new ArrayList<Xs>();

Systemoutprintln("大小为" + aa1size());

Xs xs1=new Xs("悟空",15,90);

Xs xs2 = new Xs("八戒", 13, 70);

Xs xs3 = new Xs("沙僧", 14, 75);

Xs xs4 = new Xs("小白龙", 20, 80);

aa1add(xs1);// add是一个添加的方法

aa1add(xs2);// 添加一个对象

aa1add(xs3);

aa1add(1, xs4);

Systemoutprintln("大小为" + aa1size());// aa1size()有多少个对象//

//aa1remove(1);// 删除1号对象

for(int i=0;i<aa1size();i++){

Systemoutprintln(aa1get(i));

}

}

}

class Xs {

private String xingming;

private int xuehao;

private int chengji;

Xs(String xingming, int xuehao, int chengji) {

thisxingming = xingming;

thischengji = chengji;

thisxuehao = xuehao;

}

public String getXingming() {

return xingming;

}

public int getXuehao() {

return xuehao;

}

public int getChengji() {

return chengji;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return xingming+","+xuehao+","+chengji;

}

}

ps:变量名最好用英文有明确的意思,看着太别扭了。

package test;

import javabeansIntrospectionException;

import javabeansPropertyDescriptor;

import javalangreflectInvocationTargetException;

import javalangreflectMethod;

import javautilArrayList;

import javautilArrays;

import javautilIterator;

public class AList extends ArrayList<A> {

/

  

 /

private static final long serialVersionUID = -5626405721508120479L;

public A getSubject(String name, Object value)

throws IllegalAccessException, IllegalArgumentException,

InvocationTargetException, IntrospectionException {

A[] result = getSubjects(name, value);

if (resultlength <= 0)

return null;

else

return result[0];

}

public A[] getSubjects(String name, Object value)

throws IntrospectionException, IllegalAccessException,

IllegalArgumentException, InvocationTargetException {

PropertyDescriptor pd = new PropertyDescriptor(name, Aclass);

Method getter = pdgetReadMethod();

Iterator<A> it = thisiterator();

A[] result = new A[0];

while (ithasNext()) {

A obj = itnext();

Object theValue = getterinvoke(obj);

if (theValue != null && theValueequals(value)) {

result = ArrayscopyOf(result, resultlength + 1);

result[resultlength - 1] = obj;

}

}

return result;

}

public static void main(String[] args) throws IllegalAccessException,

IllegalArgumentException, InvocationTargetException,

IntrospectionException {

AList al = new AList();

A a = new A("张三");

asetAge(18);

asetGender("男");

asetSchool("XX大学");

A b = new A("李四");

bsetAge(20);

bsetGender("男");

bsetSchool("XX大学");

A c = new A("王五");

csetAge(18);

csetGender("女");

csetSchool("XX大学");

aladd(a);

aladd(b);

aladd(c);

Systemoutprintln(ArraystoString(algetSubjects("name", "张三")));

Systemoutprintln(ArraystoString(algetSubjects("age", 18)));

Systemoutprintln(ArraystoString(algetSubjects("gender", "男")));

Systemoutprintln(ArraystoString(algetSubjects("school", "XX大学")));

// [A [name=张三, age=18, gender=男]]

// [A [name=张三, age=18, gender=男], A [name=王五, age=18, gender=女]]

// [A [name=张三, age=18, gender=男], A [name=李四, age=20, gender=男]]

// [A [name=张三, age=18, gender=男], A [name=李四, age=20, gender=男], A [name=王五, age=18, gender=女]]

}

}

class A {

private String name;

private int age;

private String gender;

private String school;

public String getSchool() {

return school;

}

public void setSchool(String school) {

thisschool = school;

}

public A(String name) {

super();

thisname = name;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

thisgender = gender;

}

public int getAge() {

return age;

}

public void setAge(int age) {

thisage = age;

}

public String getName() {

return name;

}

public void setName(String name) {

thisname = name;

}

@Override

public String toString() {

return "A [name=" + name + ", age=" + age + ", gender=" + gender + "]";

}

}

一个List对象也无非是一个对象,在Map里存取放置都是一种方式,如果你确定取出来的是某类的对象,直接转型就可以了:

List c = (List)bget("a");

在JDK15以上提供了泛型,能够更好地控制类型,减少强行转型的次数。比如我们如果知道这些List里的元素永远是String的话,你就可以写

List<String> a = new ArrayList<String>;

HashMap<String,List<String>> b =new HashMap<String,List<String>>();

bput("a",a);

List<String> c = bget("a");

最后一步不需要强行转型,而且如果在bput("a",a);这一步如果你想往b里面放一个不是List<String>的东西,或者使用的key不是一个String,编译器就会抗议。

泛型学起来有一定难度,尤其是一些高级用法,写起来有时会觉得繁琐,但是我认为物有所值,能够帮助我们在编译期发现不少潜在问题,写出代码更强健。

ArrayList用法:

ArrayList是接口List的实现类,所以推荐以List接口来使用。

1、创建ArrayList的List接口

例:

List books = new ArrayList();

Java支持泛形后,创建的同时可以指定元素的类型。

例:

Class Book {

}

List<Book> books = new ArrayList<Book>();

为避免容器自动扩容的次数而影响性能,可以指定创建时的元素大小。

例:

// 创建可容纳100个Book对象的ArrayList,超过100个将自动扩容

List<Book> books = new ArrayList<Book>(100);

2、添加元素

添加在末尾

例:

Book book1 = new Book();

Book book2 = new Book();

Book book3 = new Book();

booksadd(book1);

booksadd(book2);

booksadd(book3);

添加在指定索引处

例:

// 虽然加book1后直接加book3了,但book2是被加在索引1的地方

// 所以效果同上,是book1、book2、book3的顺序

booksadd(book1);

booksadd(book3);

booksadd(1, book2);

3、 获取ArrayList中元素的个数

例:

int count = bookssize();

4、读取元素

利用普通的for循环:

例:

for (int i = 0; i < bookssize(); i++ {

Book newBook = booksget(i);

// 不带泛形的注意要转型

Book book = (Book) booksget(i);

Systemoutprintln(bookgetName());

}

利用for循环的新特性:

例:

for (Book book : books) {

// 用book就能访问了

Systemoutprintln(bookgetName());

}

利用枚举:

例:

Iterator<Book> iter = booksiterator();

while (iterhasNext()) {

Book book = iternext();

Systemoutprintln(bookgetName());

}

5、移除元素

移除指定索引处的元素

例:

booksremove(0); // 移除book1

booksremove(1); // 移除book2

booksremove(2); // 移除book3

移除指定对象的所在元素

例:

Book delBook = booksget(1);

booksremove(delBook); // 移除book2

移除所有元素

例:

booksclear();

6、判断ArrayList是否为空(没有元素)

原方法:

if (booksisEmpty()) {

}

直接判断大小:

if (bookssize() == 0) {

}

7、判断ArrayList中是否已经存在了某对象

例:

// 判断是否已经存在book2对象

if (bookscontains(book2)) { // 已经存在

}

8、根据对象反查询它的索引位置

从前住后查询,反回第一个符合条件的位置

例:

listindexOf(book2); // 查询book2对象的索引位置

从后住前查询,反回第一个符合条件的位置

例:

listlastIndexOf(book2); // 查询book2对象的索引位置

以上这些掌握后,基本就没问题了。

以上就是关于Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧全部的内容,包括:Arrays$ArrayList 的 Object 对象转换为 List<Object> 对象的技巧、取出List中的对象的属性值,该怎么取、arraylist中add方法,我写的方法返回值是arrylist,但是发现arraylist最后获取的都是同一个对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9349965.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存