Java 进阶知识(七)

java 复制代码
package list;

import java.util.ArrayList;
import java.util.List;

/**
 * java.util.List接口
 * List继承自Collection
 * List的特点:可重复,并且有序,提供了一组可以
 * 通过下标操作元素的方法。
 * 
 * 常用实现类:
 * java.util.ArrayList:内部由数组实现,查询
 * 性能更好。
 * java.util.LinkedList:内部由链表实现,增删
 * 元素性能更好,尤其首尾增删元素。
 * 在对性能没有特别苛刻要求下,通常使用的是
 * ArrayList即可。
 * 
 * @author ta
 *
 */
public class GetSetDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("one");
		list.add("two");
		list.add("three");
		list.add("four");
		list.add("five");
		System.out.println(list);
		/*
		 * E get(int index)
		 * 获取给定下标对应的元素
		 */
		String str = list.get(1);
		System.out.println(str);
		//List可以用普通的for循环遍历
		for(int i=0;i<list.size();i++) {
			str = list.get(i);
			System.out.println(str);
		}
		
		/*
		 * E set(int index, E e)
		 * 将给定元素设置到指定位置,返回值为
		 * 原位置对应元素。所以set方法的意义是
		 * 替换元素操作
		 */
		//[one,2,three,four,five]
		String old = list.set(1, "2");
		System.out.println(list);
		System.out.println(old);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.List;

/**
 * 获取子集操作
 * List subLis(int start,int end)
 * 获取当前集合指定下标对应范围内的元素
 * @author ta
 *
 */
public class SubListDemo {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		for(int i=0;i<10;i++) {
			list.add(i);
		}
		System.out.println(list);
		
		List<Integer> subList = list.subList(3, 8);
		System.out.println(subList);
		/*
		 * 将子集每个元素扩大10倍
		 */
		for(int i=0;i<subList.size();i++) {
			subList.set(i,subList.get(i)*10);
		}
		System.out.println(subList);
		/*
		 * 操作子集就是对原集合对应元素的操作
		 */
		System.out.println(list);
		
		/*
		 * 将list集合中2-8删除
		 */
		list.subList(2, 9).clear();
		System.out.println(list);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.List;

/**
 * List提供了一对重载的add,remove方法
 * @author ta
 *
 */
public class AddRemoveDemo {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("one");
		list.add("two");
		list.add("three");
		list.add("four");
		list.add("five");
		System.out.println(list);
		/*
		 * void add(int index,E e)
		 * 将给定元素插入到指定位置
		 * 
		 * [one,2,two,three,four,five]
		 */
		list.add(1, "2");
		System.out.println(list);
		/*
		 * E remove(int index)
		 * 删除并返回给定位置对应的元素
		 * [one,2,three,four,five]
		 */
		String old = list.remove(2);
		System.out.println(list);
		System.out.println(old);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

/**
 * 集合转换为数组
 * 集合提供了一个方法:toArray,可以将当前
 * 集合转换为一个数组
 * @author ta
 *
 */
public class CollectionToArrayDemo {
	public static void main(String[] args) {
		Collection<String> c = new ArrayList<String>();
		c.add("one");
		c.add("two");
		c.add("three");
		c.add("four");
		System.out.println(c);
		
//		Object[] array = c.toArray();
		String[] array = c.toArray(new String[c.size()]);
		System.out.println(array.length);
		System.out.println(Arrays.toString(array));
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * 数组转换为List集合。
 * 通过数组的工具类:Arrays的静态方法asList
 * 可以将一个数组转换为一个List
 * 
 * @author ta
 *
 */
public class ArrayToListDemo {
	public static void main(String[] args) {
		String[] array = {"one","two","three","four"};
		
		List<String> list = Arrays.asList(array);
		System.out.println(list);
		/*
		 * 数组转换的集合对其元素操作就是对
		 * 原数组对应元素的操作
		 */
		list.set(1, "2");
		System.out.println(list);
		System.out.println("array:"+Arrays.toString(array));
		/*
		 * 由于数组是定长的,所以不支持集合
		 * 的增删操作,下面的操作会抛出异常
		 */
//		list.add("five");
	
		/*
		 * 所有的集合都提供了一个参数为Collection
		 * 的构造方法,作用是在创建当前集合的同时
		 * 包含给定集合中的所有元素
		 */
		List<String> list2 
			= new ArrayList<String>(list);

		list2.add("five");
		System.out.println(list2);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * 集合工具类:java.util.Collections
 * 其提供了一个静态方法:sort,可以对List集合
 * 进行自然排序(从小到大)
 * @author ta
 *
 */
public class SortListDemo {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Random random = new Random();
		for(int i=0;i<10;i++) {
			list.add(random.nextInt(100));
		}
		System.out.println(list);
		Collections.sort(list);
		System.out.println(list);
	}
}
java 复制代码
package list;
/**
 * 使用当前类实例作为集合元素,测试集合相关
 * 操作。
 * @author ta
 *
 */
public class Point implements Comparable<Point>{
	private int x;
	private int y;
	public Point(int x, int y) {
		super();
		this.x = x;
		this.y = y;
	}
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	public String toString() {
		return "("+x+","+y+")";
	}
	public boolean equals(Object obj) {
		if(obj == null) {
			return false;
		}
		if(obj == this) {
			return true;
		}
		if(obj instanceof Point) {
			Point p = (Point)obj;
			return this.x==p.x&&this.y==p.y;
		}
		return false;
	}
	/**
	 * 当一个类实现了Comparable接口后必须重写
	 * 方法:compareTo
	 * 该方法的作用是比较当前对象this与方法的
	 * 参数对象o之间的大小。
	 * 
	 * 返回值不关心具体取值,只关心取值范围
	 * 当返回值>0:当前对象大于参数对象(this>o)
	 * 当返回值<0:当前对象小于参数对象
	 * 当返回值=0:两个对象相等 
	 */
	public int compareTo(Point o) {
		int len = this.x*this.x+this.y*this.y;
		int olen = o.x*o.x+o.y*o.y;
		return len-olen;
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 排序自定义类型元素
 * @author ta
 *
 */
public class SortListDemo2 {
	public static void main(String[] args) {
		List<Point> list = new ArrayList<Point>();
		list.add(new Point(3,4));
		list.add(new Point(4,9));
		list.add(new Point(2,7));
		list.add(new Point(8,1));
		list.add(new Point(6,0));
		list.add(new Point(4,4));
		System.out.println(list);
		/*
		 * Collections的sort方法排序的集合要求
		 * 元素必须实现Comparable接口。
		 */
		Collections.sort(list);
		System.out.println(list);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 排序字符串
 * @author ta
 *
 */
public class SortListDemo3 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("小泽老师");
		list.add("传奇");
		list.add("苍老师");	
		System.out.println(list);
		/*
		 * String已经实现了Comparable接口
		 * 比较规则为按照每个字符的unicode编码
		 * 比较。
		 * 对于排序中文时,没有什么意义。
		 * 
		 * 对此,该sort方法的使用相对局限。
		 * 所以当:
		 * 排序自定义类型元素或java提供的已经实现
		 * 过Comparable接口的元素,但是比较方法不
		 * 满足我们排序需求时,都不应当使用下面的
		 * sort方法
		 * 
		 */
		Collections.sort(list);
		System.out.println(list);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Collections提供了一个重载的sort方法,该
 * 方法除了要求传入要排序的集合外,还要求再
 * 传入一个比较器(Comparator),该比较器可以
 * 定义一种比较规则,该sort方法会用这个比较
 * 规则对集合元素比较后进行排序。
 * 
 * @author ta
 *
 */
public class SortListDemo4 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		list.add("传奇");
		list.add("小泽老师");
		list.add("苍老师");
		System.out.println(list);
		/*
		 * 这种排序方法不要求集合元素必须实现Comparable
		 * 接口,对此在排序自定义元素时不对我们的代码
		 * 产生额外侵入,由于可以自定比较规则,对于像
		 * String这样已经实现类比较方法的可以做到按照
		 * 我们的比较规则排序。
		 * 开发中推荐中这种方式排序.
		 */
		Collections.sort(
		 list,new Comparator<String>() {
			public int compare(String o1, String o2){
				//按照字符多少比大小
				return o1.length()-o2.length();
			}
		});
		System.out.println(list);
	}
}
java 复制代码
package list;

import java.util.LinkedList;
import java.util.Queue;

/**
 * java.util.Queue
 * Queue接口继承自Collection。
 * 队列也可以保存一组元素,但是存取元素必须
 * 遵循先进先出模式。
 * 常用实现类:LinkedList
 * @author ta
 *
 */
public class QueueDemo {
	public static void main(String[] args) {
		Queue<String> queue = new LinkedList<String>();
		/*
		 * offer是入队操作,向队列末尾追加
		 * 元素
		 */
		queue.offer("one");
		queue.offer("two");
		queue.offer("three");
		queue.offer("four");
		queue.offer("five");
		queue.offer("six");
		System.out.println(queue);
		/*
		 * poll方法是出队操作
		 * 获取队首元素后该元素即从队列中
		 * 被删除
		 */
		String str = queue.poll();
		System.out.println(str);
		System.out.println(queue);
		/*
		 * peek是引用队首元素,元素不做出队
		 * 操作
		 */
		str = queue.peek();
		System.out.println(str);
		System.out.println(queue);
		
		
		/*
		 * 遍历队列
		 * 使用迭代器遍历,元素不会因此被队列
		 * 删除
		 * 
		 */
		for(String s : queue) {
			System.out.println(s);
		}
		System.out.println(queue);
		
		/*
		 * 使用poll方法遍历队列
		 */
		while(queue.size()>0) {
			String s = queue.poll();
			System.out.println(s);
		}
		System.out.println(queue);
	}
}
java 复制代码
package list;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 双端队列
 * java.util.Deque接口
 * Deque继承自Queue接口
 * 双端队列是指队列两端都可以做进出队操作。
 * 常用实现类:LinkedList
 * @author ta
 *
 */
public class DequeDemo {
	public static void main(String[] args) {
		Deque<String> deque = new LinkedList<String>();
		
		deque.offer("one");
		deque.offer("two");
		deque.offerFirst("three");
		deque.offerLast("four");
		
		System.out.println(deque);
		
		String str = deque.poll();
		System.out.println(str);
		System.out.println(deque);
		
		str = deque.pollFirst();
		System.out.println(str);
		System.out.println(deque);
		
		str = deque.pollLast();
		System.out.println(str);
		System.out.println(deque);
	}
}
java 复制代码
package list;

import java.util.Deque;
import java.util.LinkedList;

/**
 * 栈结构
 * 栈也可以保存一组元素,但是存取元素必须遵循
 * 先进后出原则。
 * Deque双端队列可以实现栈,并且为栈专门提供
 * 了两个方法:push,pop
 * 通常我们使用栈是为了实现"后退"这样等功能
 * @author ta
 *
 */
public class StackDemo {
	public static void main(String[] args) {
		Deque<String> stack = new LinkedList<String>();		
		stack.push("one");
		stack.push("two");
		stack.push("three");
		stack.push("four");
		stack.push("five");
		System.out.println(stack);
		
		String str = stack.pop();
		System.out.println(str);
		System.out.println(stack);
	}
}
java 复制代码
package list;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 集合有线程安全的实现。我们可以借助Collections
 * 将现有的集合转换为一个线程安全的。
 * @author ta
 *
 */
public class SyncDemo {
	public static void main(String[] args) {
		/*
		 * List中常用的实现类:
		 * ArrayList,LinkedList它们都不是
		 * 线程安全的。
		 */
		List<String> list = new ArrayList<String>();
		list.add("one");
		list.add("two");
		list.add("three");
		System.out.println(list);
		/*
		 * 将给定的集合转换为一个线程安全的
		 */
		list = Collections.synchronizedList(list);
		System.out.println(list);
		/*
		 * HashSet同样也不是线程安全的
		 */
		Set<String> set = new HashSet<String>(list);
		set = Collections.synchronizedSet(set);
		System.out.println(set);
		
		/*
		 * 文档上有说明一个事情:
		 * 即使是一个线程安全的集合,它也不同
		 * 迭代器遍历做互斥,所以这个操作要自行
		 * 维护。
		 */
		
		
		/*
		 * 队列也有并发安全的实现
		 * 阻塞队列
		 * BlockingQueue,BlockingDeque
		 * 阻塞队列内部使用双缓冲实现,在保证
		 * 并发安全的前提下解决了存取互斥问题
		 * 所以并发效率更好
		 */
		BlockingQueue<String> queue
			= new LinkedBlockingQueue<String>();
		
		queue.offer("one");
		try {
			queue.offer("two", 500, TimeUnit.MILLISECONDS);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
相关推荐
小马爱打代码1 小时前
Spring框架:介绍和快速入门
java·后端·spring
糖果店的幽灵1 小时前
LangChain 1.3 完全教程:从入门到精通-Part 7: Documents(文档处理)
java·python·langchain
Java_2017_csdn1 小时前
Java 策略模式(Strategy Pattern)-(三)
java·开发语言·servlet
颜进强1 小时前
Claude Code -16 文件引用与加载机制完整实践:从 CLAUDE.md 到 Skills 与 Subagents
前端·后端·ai编程
闪闪发光得欧1 小时前
agent工作模式之ReAct实战
后端
许彰午1 小时前
06_Java面向对象入门
java·开发语言·python
Java_2017_csdn1 小时前
Java 策略模式(Strategy Pattern)-(二)
java·开发语言·策略模式
摇滚侠1 小时前
CSDN AI 数字营销测评 营销组件
java
爱折腾的程序员1 小时前
Java 8 Stream 流常用操作:从入门到原理
后端