
在一个开发案例中,需要把一个 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最后获取的都是同一个对象等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)