①starUML的使用
简单了解一下starUML的使用方法,我截取了两张图,可以更清晰明了–>
②list集合的增删改查
源代码如下:
package com.hemingxiang.list;
import java.util.ArrayList;
/**
* list集合容器的增删改查
* @author Administrator
*
*/
public class Demo1 {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
//新增
list.add("张三");
list.add("李四");
list.add("王五");
list.add("麻子");
//查询
System.out.println(list.get(1));
for (Object obj : list) {
System.out.println(obj);
}
//修改 下标从0开始所有修改了李四
list.set(1, "老六");
System.out.println("-------------------");
for (Object obj : list) {
System.out.println(obj);
}
//删除 根据下标删除 把老六删除了
Object r = list.remove(1);//返回值是删除的元素
// System.out.println(r);
System.out.println("-------------------");
for (Object obj : list) {
System.out.println(obj);
}
//根据对象删除 把王五删除了
Object rr = list.remove(1);//返回值是删除的元素
list.remove("王五");
System.out.println("-------------------");
for (Object obj : list) {
System.out.println(obj);
}
}
}
输出结果如下图:
③list三种遍历形式
源代码如下:
package com.hemingxiang.list;
import java.util.ArrayList;
import java.util.Iterator;
/**
* list三种遍历形式
* @author Administrator
*
*/
public class Demo2 {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
//新增
list.add("张三");
list.add("李四");
list.add("王五");
list.add("麻子");
//增强for循环
for (Object obj : list) {
System.out.println(obj);
}
System.out.println("-------------------");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
System.out.println("---------迭代器--------");
Iterator it = list.iterator();
//System.out.println(it.hasNext());//判断集合中是否有下一个
//System.out.println(it.next());//直接进入下一个
while(it.hasNext()) {//指针概念
System.out.println(it.next());
}
}
}
输出结果如下图:
④通过Linkedlist实现堆栈以及队列的容器
源代码如下:
package com.hemingxiang.list;
import java.util.LinkedList;
/**
* 通过Linkedlist实现堆栈以及队列的容器
* @author Administrator
*
*/
public class Demo3 {
public static void main(String[] args) {
Duilie du=new Duilie(new LinkedList<>());
du.push("张三");
du.push("李四");
du.push("王五");
du.push("麻子");
System.out.println(du.pop());
System.out.println(du.pop());
System.out.println(du.pop());
System.out.println(du.pop());
}
}
class Duilie{//队列 先进先出
private LinkedList ll;
public Duilie(LinkedList ll) {
super();
this.ll = ll;
}
//存
public void push(Object obj) {
ll.add(obj);
}
//取
public Object pop() {
return ll.remove();
}
}
class Duizhan{//堆栈 先进后出
private LinkedList ll;
public Duizhan(LinkedList ll) {
super();
this.ll = ll;
}
//存
public void push(Object obj) {
ll.add(obj);
}
//取
public Object pop() {
return ll.removeLast();
}
}
输出结果如下图:
⑤list集合如何进行优化
源代码如下:
package com.hemingxiang.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
/**
* list集合如何进行优化
* 当代码中出现了多次add操作,涉及到了list集合容量多次改变,这是十分耗性能的操作,
* 此时通过设定初始化容量,即可优化性能
*
* 数组长度是不可变的 list集合长度是可变的
* ①list集合底层的数据结构是数组
* ②增长引子0.5 初始容量10
* @author Administrator
*
*/
public class Demo4 {
public static void main(String[] args) throws Exception{
String[] arr=new String[10];
// arr[11]="zs";//报错 数组下标越界异常
// arr = new String[11];
// arr = new String[12];
// arr[12] = "zs";
ArrayList<Object> list = new ArrayList<>(100);
for (int i = 0; i < 200; i++) {
list.add(i);
getlen(list);
}
}
private static void getlen(ArrayList<Object> list) throws Exception {
Field f = list.getClass().getDeclaredField("elementData");
f.setAccessible(true);
Object[] elementData = (Object[]) f.get(list);
System.out.println("当前集合的元素个数:"+list.size()+";当前list集合的容量是:"+elementData.length);
}
}
输出结果如下图:
⑥list集合去重&底层原理
源代码如下:
package com.hemingxiang.list;
import java.util.ArrayList;
/**
* list集合去重,底层原理
* @author Administrator
*
*/
public class Demo5 {
public static void main(String[] args) {
ArrayList list=new ArrayList<>();
//新增
list.add(new Person("张三",18));
list.add(new Person("李四",20));
list.add(new Person("王五",24));
list.add(new Person("王五",24));
list.add(new Person("麻子",28));
System.out.println(list);//打印出来5个
//把重复内容去掉
ArrayList ls=new ArrayList<>();
for (Object obj : list) {
if(!ls.contains(obj)) {
ls.add(obj);
}
}
System.out.println(ls);//打印4个 去重后
}
public static void main2(String[] args) {
ArrayList list=new ArrayList<>();
//新增
list.add("张三");
list.add("李四");
list.add("王五");
list.add("王五");
list.add("麻子");
System.out.println(list);
//把重复内容去掉
ArrayList ls=new ArrayList<>();
for (Object obj : list) {
if(!ls.contains(obj)) {
ls.add(obj);
}
}
System.out.println(ls);
}
}
class Person{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
//结论:去重引用对象时,底层调用的是对象的equals方法
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
输出结果如下图:
初始版去重
在集合中new一个对象后判重复,需重写equals方法,方可判重成功。
最后一起看一个面试题案例
1,4,6,9,11,8 剔除该段数字中的奇数
结论,做集合元素剔除,不能够在原集合遍历的时候进行操作
错误代码:
ArrayList<String> list2 = new ArrayList<>();
list2.add("1");
list2.add("4");
list2.add("6");
list2.add("9");
list2.add("11");
list2.add("8");
for (String obj : list2) {
if(Integer.valueOf(obj) % 2 == 1) {
list2.remove(obj);
}
}
这样输出的结果为currentModifyException:当前改变异常 说明集合在遍历的时候不能去删除集合,否则的话fore
正确代码:
ArrayList<String> list2 = new ArrayList<>();
ArrayList<String> list3 = new ArrayList<>();
list2.add("1");
list2.add("4");
list2.add("6");
list2.add("9");
list2.add("11");
list2.add("8");
for (String obj : list2) {
if(Integer.valueOf(obj) % 2 == 1) {
list3.add(obj);
}
}
for (String s : list3) {
System.out.println(s);
}
最后输出结果聪明的人都知道啦!
1 9 11