----------- android培训、java培训、期待与您交流! ------------
数组(Array)和集合(Collection)的关系:
相同:都是装数据的容器。
不同:数组里装的是固定长度的任意类型数据。集合的元素只能是对象,而不能是基本数据类型。
数组和集合互转:
数组转为集合:用Arrays.asList();将数组转成List集合。如果数组中的元素都是对象,则转为集合后,数组中的元素就直接转成集合中的元素;如果是基本数据类型的数组,则将整个数组当成对象(此时类型是数组类型)存入集合中。
集合转为数组:Collection.toArray();
集合总述:
/*
* 为什么会出现集合?
* 答:数据多了用对象封装,对象多了用集合封装。
*
* 为什么会出现那么多的集合容器?
* 答:因为每个集合容器对对象的存储方式(即数据结构)不一样。
*
* 1、add(Object obj),参数类型为Object以便于接收任意类型对象
* 2、集合中存储的都是对象的引用(对象首地址)
*
* 迭代器:取出元素的方式
* 就是那夹玩具用的夹子。
*
* Collection
* List:元素的存取是有序的,元素可以重复 :因为该体系 有索引
* ArrayList: 底层使用的是数组结构,特点:查询快,增删稍慢,线程不同步
* LinkedList: 底层使用的是链表数据结构,特点:增删快,查询稍慢,线程不同步
* Vector: 底层是数组结构,线程同步,被ArrayList替代了。
* 若多线程,可以自己加锁,也可以交给jvm处理(给它一个不安全,返回一个安全的)
*
* Set:元素的存取是无序的(存入和取出的顺序不一定一致),元素不可以重复
* HashSet: 底层使用的是哈唏表,线程不同步
* HashSet如何保证元素的唯一性?
* 先判断hashCode再判断equals
* 注意:对于判断元素是否存在以及删除元素等操作,先判断的是元素的hashCode再比较equals
* TreeSet: 可以对Set集合中的元素进行排序(一般是自然顺序或叫默认顺序)
* 底层使用的是二叉树,线程不同步
* TreeSet如何保证元素唯一性?
* compareTo()方法return 0;
*
* TreeSet第一种排序方式:让元素自身具备比较性,定义比较方法(元素类自身实现Comparable接口,实现它的compareTo(Object obj)方法)
* TreeSet第一种排序方式:让集合具备比较性,定义比较器(实现Comparator接口,覆盖compare()),再将比较器传递给TreeSet集合的构造函数
* 当两种排序都存在时,以比较器为主
*
* 排序时,当主要条件相同时,一定要判断次要条件。
*/
import java.util.*;
public class CollectionDemo {
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("Hello");
c.add("java");
c.add(97);
c.add(true);
c.add('a');
/*Iterator it = c.iterator(); //获取迭代器,用于取出集合中的元素
int i = 0;
while(it.hasNext()) { //遍历集合
System.out.println("Iterator:.." + ++i + "..." + it.next());
}*/
//用for循环,由于it定义在局部,循环结束,会释放内存空间
for(Iterator it = c.iterator(); it.hasNext();) {
System.out.println(it.next());
}
}
public static void quJiaoJi_Method() {
Collection c1 = new ArrayList();
c1.add("Hello");
c1.add("java");
c1.add(97);
c1.add(true);
c1.add('a');
Collection c2 = new ArrayList();
c2.add("Hello");
c2.add("java");
c2.add(65);
c2.add(false);
c2.add('a');
//boolean b = c2.retainAll(c1); //取交集,c2中只保留和c1中相同的元素
c2.removeAll(c1); //去交集,c2中只保留和c1中不同的元素
System.out.println(c2);
//System.out.println(b);
System.out.println(c1);
}
public static void base_Method() {
Collection c = new ArrayList();
//1、添加
c.add("Hello");
c.add("java");
c.add(97);
c.add(true);
c.add('a');
System.out.println("原集合:" + c);
//2、查
System.out.println("集合中元素个数 : " + c.size()); //打印集合元素个数
String s = "java";
System.out.println("是否包含java :" + c.contains(s)); //是否包含某个元素
//3、删除
//c.clear(); //清空集合内的元素
c.remove(true); //移除集合中的某个元素
System.out.println("移除后:"+ c);
}
}
List集合:
import java.util.*;
/*
* List集合判断元素是否相同,依据的是元素的equals方法
*
* List特有方法:凡是能操作角标的方法
* 增:void add(int index, E element)
boolean addAll(int index, Collection<? extends E> c)
* 删:E remove(int index)
* 改:E set(int index, E element)
* 查:E get(int index)
* ListIterator<E> listIterator(int index)
List<E> subList(int fromIndex, int toIndex)
List集合特有的迭代器。ListIterator是Iterator的子接口
* 在迭代时,不能通过集合对象的方法来操作集合中的元素,会发生ConcurrentModificationException异常
* 所以在迭代过程中,只能使用迭代器的方法操作元素,但Iterator的方法只有删、取出、判断,如果要进行其它
* 操作如添加、修改等,就需要使用其子接口ListIterator来实现。
*
* 该接口只能通过List集合的listIterator()方法获取。
*
*/
public class ListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList();
al.add("Hello");
al.add("java");
al.add(97);
al.add(true);
al.add('a');
System.out.println("原集合:" + al);
//演示列表迭代器
ListIterator li = al.listIterator();
System.out.println(li.hasNext()); //true
System.out.println(li.hasPrevious()); //false
while(li.hasNext()) {
Object obj = li.next();
if(obj.equals("java")) {
li.add("world"); //用列表迭代器向集合中添加元素
}
}
System.out.println(al);
System.out.println(li.hasNext()); //true
System.out.println(li.hasPrevious()); //true
}
public static void method() {
ArrayList al = new ArrayList();
al.add("Hello");
al.add("java");
al.add(97);
al.add(true);
al.add('a');
System.out.println("原集合:" + al);
al.add(3, "你好"); //在指定位置插入元素
System.out.println(al);
al.remove(2); //删除指定位置上的元素
System.out.println(al);
al.set(4, "world"); //修改指定位置上的元素
System.out.println(al);
String s = (String)al.get(1); //获取指定位置上的元素
System.out.println(s);
List list = al.subList(2, 5); //获取子List
System.out.println("subList:" + list);
//获取所有元素,方式一:
for(int x=0; x<al.size(); x++) {
System.out.println("size方式:........" + al.get(x));
}
//获取所有元素,方式二:
for(Iterator it = al.iterator(); it.hasNext();) {
System.out.println("iterator方式:_______________" + it.next());
}
}
}
LindedList的特有方法:
/*
* LindedList特有方法:
* void addFirst(E e)
* void addLast(E e)
*
* E getFirst() //获取元素,元素不删除。若集合中没有元素会抛出异常NoSuchElementException
* E getLast()
*
* E removeFirst() //获取元素,并且将元素删除。若集合中没有元素会抛出异常NoSuchElementException
* E removeLast()
*
* JDK1.6出现的替代方法:
* boolean offerFirst(E e)
* boolean offerLast(E e)
*
* E peekFirst() //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。
* E peekLast()
*
* E pollFirst() //获取并移除此列表的第一个元素;如果此列表为空,则返回 null。
* E pollLast()
*/
import java.util.*;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList link = new LinkedList();
link.addFirst("java01");
link.addFirst("java02");
link.addFirst("java03");
link.addFirst("java04");
System.out.println(link); //[java04, java03, java02, java01]
while(!link.isEmpty()) { //不用迭代获取所有元素
System.out.println(link.removeFirst());
}
}
}
Vector的枚举:
(现已很少用到)Vector已被ArrayList替代,若要同步,可在代码中添加同步,还可以用Collections的工具类完成同步功能。
/*
* 枚举就是Vector特有的取出方式
*
* 枚举和迭代是一样的,而枚举的名称及方法名都过长 ,所以被迭代器取代了。
*/
import java.util.*;
public class VectorDemo {
public static void main(String[] args) {
Vector v = new Vector();
v.add("java1");
v.add("java2");
v.add("java3");
v.add("java4");
for(Enumeration er = v.elements(); er.hasMoreElements();) {
System.out.println(er.nextElement());
}
}
}
HashSet中Person对象的hashCode计算方法int hashCode() {return name.hashCode() + age*39}
TreeSet的自然排序:
import java.util.*;
/*
* Set集合功能和Collection一致
*
* TreeSet存储自定义对象,要求对象类要实现Comparable接口,实现它的compareTo(Object obj)方法
* */
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> ts = new TreeSet<Student>();
ts.add(new Student("张三", 23));
ts.add(new Student("李四", 20));
ts.add(new Student("李二", 20));
ts.add(new Student("王五", 25));
for(Iterator it = ts.iterator(); it.hasNext();) {
System.out.println(it.next());
}
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public int compareTo(Student s) {
// if(!(obj instanceof Student))
// throw new RuntimeException("不是学生");
// Student s = (Student)obj;
if(this.age == s.age)
return this.name.compareTo(s.name);
return this.age-s.age;
}
public String toString() {
return this.name + "...." + this.age;
}
}
元素用二叉树怎么存入的怎么取出?(即存入顺序和取出顺序一致)
答:元素类实现Comparable接口的compareTo()时直接返回1。(存入时全往右边放,取出时即为存入的顺序,从小往大取,被称为自然顺序)
泛型:详见http://blog.csdn.net/wyl530274554/article/details/7764757
Map集合的键值对:
/*
* Map集合:存储键值对。一对一对往里存。并且要保证唯一性。
*
* 何时使用Map集合? 当数据之间存在映射关系时。
*
* 1,添加
* void putAll(Map<? extends K,? extends V> m)
* V put(K key, V value) //第二个相同存入会覆盖第一个,并返回第一个的“值”
* 2,删除
* V remove(Object key)
* void clear()
* 3,判断
* boolean isEmpty()
* boolean containsKey(Object key)
* boolean containsValue(Object value)
* 4,获取
* V get(Object key)
* int size()
* Collection<V> values() //获取集合中的所有的“值”,并以Collection<>返回
*
* Set<K> keySet() //可将所有键存入Set中,迭代出后,用get()方法得到所有的值。
* Set<Map.Entry<K,V>> entrySet()
*
* Map
* Hashtable:底层是哈唏表,不能存入null键和null值。线程同步。效率低
* HashMap:底层是哈唏表,允许使用null键和null值。线程不同步。效率高
* TreeMap:底层是二叉树,线程不同步,可以对Map集合的键排序。
*
* 和Set很像,其实Set集合的底层用的就是Map中的方法
*
* Map中用作键的对象必须实现hashCode和equals方法。
*
* Map集合中元素取出原理:将Map集合转成Set集合,再用迭代器取出。
* */
import java.util.*;
public class MapDemo {
public static void main(String[] args) {
Map<String, Integer> mp = new HashMap<String, Integer>();
mp.put("zhangsan", 20);
mp.put("lisi", 25);
mp.put("wangwu", 23);
mp.put("qingliu", 20);
/*System.out.println(mp);
System.out.println(mp.remove("lisi"));
System.out.println(mp);*/
//1、用keySet()方式取出 :将键集存入Set集合中
Set<String> keySet = mp.keySet();
for(Iterator<String> it = keySet.iterator(); it.hasNext();) {
String key = it.next();
int value = mp.get(key);
System.out.println(key+"...keySet...."+value);
}
//2、用entrySet(()方式取出 :将映射关系存入Set集合中,这个关系的类型就是:Map.Entry
Set<Map.Entry<String, Integer>> entrySet = mp.entrySet();
for(Iterator<Map.Entry<String, Integer>> it = entrySet.iterator(); it.hasNext();) {
Map.Entry<String, Integer> me = it.next();
String key = me.getKey();
int value = me.getValue();
System.out.println(key + "_______________entrySet______________" + value);
}
}
}
Map集合按值排序示例:
思路:
1、将Map中的映射关系存入Set,即mp.entry();
2、将得到的Set集合转成List
3、用Collections工具对List按指定比较进行排序
/*统计字符串”abadcdffbaeba”中每个字符出现了多少次,按次数排序并输出。
例如:c : 1,e : 1,d : 2,f : 2,b : 3,a : 4
*/
import java.util.*;
public class CharCount{
public static void main(String[] args) {
String str = "abadcdffbaeba";
System.out.println("按指定格式输出:" + charcount(str));//c:1,e:1,d:2,f:2,b:3,a:4
}
public static String charcount(String str) {
char[] chs = str.toCharArray();//String ---> char[]
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
//从char[]中找键,从Map集合中找值;字符作为键,出现的次数作为值存入Map集合中
for(char ch : chs) {
Integer value = tm.get(ch);
if(value == null) {
tm.put(ch, 1);
}
else {
tm.put(ch, ++value);
}
}
System.out.println("自然排序:"+tm);//{a=4, b=3, c=1, d=2, e=1, f=2}
//按值排序:1、将映射关系对象存入Set集合中,并用Set构成List集合。2、用工具Collections对List按比较器进行排序
List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(tm.entrySet());
Collections.sort(list, new CharCountComparator());
System.out.println("按值排序:"+list);//[c=1, e=1, d=2, f=2, b=3, a=4]
//按指定格式输出:c : 1,e : 1,d : 2,f : 2,b : 3,a : 4
//用迭代器取出list中映射关系,并将键值按指定格式存入StringBuilder中
StringBuilder sb = new StringBuilder();
for(Iterator<Map.Entry<Character, Integer>> it = list.iterator();it.hasNext();) {
Map.Entry<Character, Integer> me = it.next();
char key = me.getKey();
int value = me.getValue();
if(!it.hasNext())
sb.append(key + ":" + value);
else sb.append(key + ":" + value + ",");
}
return sb.toString();
}
}
//比较器
class CharCountComparator implements Comparator<Map.Entry<Character, Integer>>
{
//将映射关系先按value比较,若value相同,再按key比较
public int compare(Map.Entry<Character, Integer> me1, Map.Entry<Character, Integer> me2) {
if(me1.getValue() == me2.getValue())
return me1.getKey().compareTo(me2.getKey());
return me1.getValue() - me2.getValue();
}
}
集合的工具类Collections:
import java.util.*;
public class CollectionsDemo {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("abcdf");
list.add("ebf");
list.add("tree");
list.add("ebf");
list.add("bcdf");
list.add("af");
System.out.println("原List集合:" + list);
Collections.sort(list); //对list集合排序,按自然顺序;还可以传比较器。
System.out.println("自然排序后:" + list);
/*Collections.fill(list, "Hello"); //用指定元素替换所有元素
System.out.println(list);*/
int i = Collections.binarySearch(list, "af");
System.out.println("“af”在哪? " + i);
String s = Collections.max(list);
System.out.println("最大的元素是:" + s);
Collections.replaceAll(list, "ebf", "Hello");
System.out.println("替换后:" + list);
Collections.reverse(list);
System.out.println("反转后:" + list);
Collections.swap(list, 2, 5);
System.out.println("交换后:" + list);
//static <T> Comparator<T> reverseOrder(Comparator<T> cmp) //★★强行逆转比较器
//static <T> Collection<T> synchronizedCollection(Collection<T> c) //★★非同步变成同步
Collections.shuffle(list); //将List集合中的元素随机排序。比如:洗牌
System.out.println(list);
}
}
Properties集合:
是Hashtable的子类,具备Map集合的特点。它里面的键值对都是字符串。
Properties 可保存在流中或从流中加载。是集合和IO流技术相结合的集合容器。
可以用于键值对形式的配置文件。
此类是线程安全的。
该集合的常用方法:
import java.util.*;
import java.io.*;
public class PropertiesDemo {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
//添加元素
prop.setProperty("李四", "20");
System.out.println(prop.setProperty("张三", "21"));
//打印设置时返回的值(属性列表中指定键的旧值,如果没有值,则为 null。)
System.out.println(prop.setProperty("李四", "23"));
//打印设置后的集合
System.out.println(prop);
//获取元素,以键找值
System.out.println(prop.getProperty("张三"));
//集合中的键集
Set<String> set = prop.stringPropertyNames();
System.out.println(set);//[张三, 李四]
//读取配置文件(用相对路径时,放本项目下),将硬盘上的文件加载到了内存中
FileReader fr = new FileReader("Properties.config");
Properties prop2 = new Properties();
prop2.load(fr);
//System.out.println(prop2);
prop2.list(System.out);
//向内存中的集合中添加元素后存入相应的文件中
prop2.setProperty("wyl", "35");
BufferedWriter fw = new BufferedWriter(new FileWriter("Properties.config"));
prop2.store(fw, "This is newer");
prop2.list(System.out);
}
}
演示软件试用次数限制:
建立配置文件,记录使用的次数
import java.util.*;
import java.io.*;
public class RunCount {
public static void main(String[] args) throws Exception {
//创建流对象关联配置文件
File file = new File("count.properties");
if(!file.exists())
file.createNewFile();
FileInputStream fis = new FileInputStream(file);
//创建Properties对象,用于操作配置文件
Properties prop = new Properties();
//将流中数据加载到集合当中
prop.load(fis);
String value = prop.getProperty("time");//获取使用次数
int count = 0;
if(value != null) {
count = Integer.parseInt(value);//String-->int
//如果软件使用次数达到5次,则提示用户试用期快到
if(count>=5) {
System.out.println("使用次数已到!");
return;
}
}
count++;//使用一次count自增
prop.setProperty("time", count+"");//信息存入集合中
FileOutputStream fos = new FileOutputStream(file);
prop.store(fos, "");//集合中的数据存入硬盘的文件中
fos.close();
fis.close();
}
}
----------------------- android培训、java培训、期待与您交流! ----------------------
详情请查看: