javase_12(集合+时间对象)

javase_12(集合+时间对象)

Map集合


1.Map存储了一系列键值的映射关系
2.Map集合需要保证键的唯一性
3.可以通过键获取到值,反之则不能
4.Map集合存储元素使用put(key,valus)方法.
5.遍历Map集合的两种遍历方式
a)通过KeySet方法返回由键组成的集合,迭代集合里面的元素拿到所有的键再通过get方法根据键来获取值
b)通过entrySet方法返回键所映射的关系组成的集合,迭代该集合就拿到一个键值映射的关系,再通过getKey获取到键,再通过getValue()方法获取到值


HashMap
线程不安全,存储速度快,允许存放null键,null值
通过HashSet保持键的唯一性

Hashtable
线程安全,存储速度慢,不允许存放null键与null值

TreeMap
通过二叉树的原理保证了键的唯一性
对键进行了排序,排序原理与SetMap相同.
(如果想要使用这个方法,必须要冲构造方法里面重写Comparator 或者从对象所属的类继承Comparator实现这个接口)

Properties
Hashtable的子类,所以是线程安全的.
用于读写配置文件,一般配置项等号两边都是String,所以集合中的两个列保存的都是String类型的数据.
这个集合中只能存String,所以不能使用泛型.


/*JavaAPI总结:application programming interface应用程序编程接口 sun公司提供给我们用的程序
一、String、StringBuffer、StringBuilder
1、String类是字符串常量
2、String池:String s = "abc" 和String s = new String("abc")的区别
3、String类的常用方法:charAt、indexOf、toCharArray、substring、split、compareTo、equals
4、StringBuffer:字符串容器,长度可变,一般用于字符串的增减删的操作。reverse方法反向
String s = "abc"; s = s + "xxx";//String长度不可变,因为是常量
5、StringBuilder线程不安全,StringBuffer线程安全

二、集合类
|-Iterable:实现增强for循环
|--Collection:单列,按照一种或多种规则来存储一系列元素
|---List:有序,允许有重复元素
|----AbstractList:抽象类,实现了iterator方法。
|-----ArrayList:数组实现,查找块,增删慢
|-----Vector:和ArrayList一样,只是线程安全
|-----LinkedList:链表实现,查找慢,增删块
|---Set:无序,不允许有重复元素
|----HashSet:通过哈希算法保证元素不重复,对象要正确重写equals和hashCode方法
|----HashTable:同上,但是线程安全
|----TreeSet:通过树状结构保证元素不重复,两种方式
1、按照元素的自然顺序进行排序,前提是元素具备比较功能,实现了Comparable接口的compareTo方法
2、在构造TreeSet实例时,传入一个比较器,实现Comparator接口的compare方法

|-Map:保存的是键值对应关系,其中键不允许有重复,可以通过keySet方法拿到一个包含所有键的Set
再调用get(key)方法通过键拿到value
|--HashMap:通过HashSet的原理保证键不重复。
|--TreeMap:通过TreeSet的原理保证键不重复
|--Properties:用于读取配置文件,不需要声明泛型,因为键和值都只能为String类型。
list方法将集合中的配置项输出到一个打印流
load方法将一个输入流中的配置项存到集合中
Jdk1.5新特性泛型,减少集合存元素时错误发生的几率。
Jdk1.5出现Iterable,为了实现增强for循环 for(元素类型 变量:集合或数组)

工具类:
Collections:集合工具类,sort、binarySearch、reverse
Arrays:数组工具类,sort。。。。


三、包装类
1、Integer x = 0;x = x + 1; 装箱-拆箱-装箱(jdk1.5)
2、Interger.parseInt(String)将字符串转为int型

四、System类
1、System类的常用方法:gc()垃圾回收、exit(0)终止程序、currentTimeMillis()获得自1970年1月1日零时
以来的毫秒数、getProperty方法获得系统属性。
2、两个静态成员变量:in和out
in:标准输入流,InputStreamReader类型
out:标准打印流,PrintStream类型

五、Runtime类
表示运行时,exec方法,在后台新开启一个窗口运行命令,是当前窗口的子窗口,继承所有窗口属性

六、日期对象
1、Date:大部分方法已过时,用new Date()创建日期对象表示当前时间
2、DateFormat:将日期格式化,抽象类
DateFormat df = DateFormat.getInstance(); String dateStr = df.format(new Date);
3、Calendar对象:
Calendar c = Calendar.getInstance();
可以将类中定义的常量当做参数传入get和set方法来获得和设置时间。
add方法,增加时间值,具体增加哪一项,就看传入的常量,调用完此方法,时间对象就被改变了。
*/

面试题目总结:

一、请说说ArrayList、Vector和LinkedList的区别
这三者都是单列集合Collection下List集合的实现类,所以他们的共同点,元素有序,允许重复元素
不同点:
ArrayList和Vector底层都是数组实现,这样的实现注定查找快、增删慢
ArrayList和Vector的区别在于线程安全问题,Vector支持线程同步,是线程访问安全的,而ArrayList线程不安全
LinkedList底层是链表结构,查找元素慢、增删元素速度快,线程不安全。

二、请说说HashSet原理,并写程序证明
HashSet在存元素时,会调用对象的hashCode方法计算出存储位置,然后和该位置上所有的元素进行equals比较,
如果该位置没有其他元素或者比较的结果都为false就存进去,否则就不存。
这样的原理注定了元素是按照哈希值来找存储位置,所有无序,而且可以保证无重复元素
我们在往HashSet集合存储元素时,对象应该正确重写Object类的hashCode和equals方法
正因为这样的原理,HashSet集合是非常高效的。
比如,要查找集合中是否包含某个对象,首先计算对象的hashCode,折算出位置号,到该位置上去找就可以了,而不用和所有的元素都比较一遍

三、Collection和Collections的区别
两者没有任何关系
Collection是单列集合的父接口,JDK1.5中定义了Iterable接口作为Collection父类,为了实现增强for循环
Collections是工具类,提供了关于集合的常用操作,例如,排序、二分法查找、反转元素等

 

  1 Collections 的应用:
  2 
  3 1.
  4 package com.javami.kudyMap;
  5 import java.util.ArrayList;
  6 import java.util.Collections;
  7 import java.util.Comparator;
  8 import java.util.List;
  9 public class ColletionsTest {
 10     public static void main(String[]args)
 11     {
 12         /*
 13          * Collections工具类:提供关于集合的常用操作.
 14          */
 15         ArrayList<String> al = new ArrayList<String>();
 16         al.add("ab");
 17         al.add("aadc");
 18         al.add("aaa");
 19         al.add("hgdfakjg");
 20         al.add("xhyns");
 21         al.add("yyiouop");
 22         al.add("qq");
 23         al.add("zdff");
 24         
 25         /*
 26         for(String s : al)
 27             System.out.println(s+" ");
 28         */
 29         
 30         /*Collections.sort(al);  //list是一个接口  父类型的应用可以指向子类型的对象..
 31         for(String s : al)
 32             System.out.println(s+" ");*/
 33         Collections.sort(al, new StringComparator());
 34         /*
 35          * 第一种方法 : 通过比较器来对比排序   可以在构造方法里面.
 36          * 或者在对象里面实现这个比较器.当new 这个实现接口.它会自动调用比较器的方法进行比较
 37         */
 38         System.out.println("通过StringComparator()方法已经排序好-----");
 39         for(String s : al)
 40             System.out.print(s+" ");
 41         /*
 42          * 使用了API里面的方法!
 43         //binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 
 44         int pos = Collections.binarySearch(al,"aaa",new StringComparator());
 45         System.out.println(pos);//因为我们需要通过比较才可以!
 46         */
 47         int pos = MyCollections.binarySearch(al,"dasdas",new StringComparator());
 48         System.out.println(pos);
 49     }
 50     
 51 }
 52 
 53 /*
 54  * 比较器: 先比较  长短,再比较顺序
 55  */
 56 class StringComparator implements Comparator<String>
 57 {
 58 
 59     @Override
 60     public int compare(String s1, String s2)
 61     {
 62         //首先比较长度,再按照字典顺序
 63         int num = s1.length()- s2.length();
 64         if(num !=0)
 65             return num;
 66         return s1.compareTo(s2);
 67         
 68     }
 69     
 70 }
 71 
 72 //实现一个二分查找
 73 class MyCollections
 74 {
 75     private MyCollections(){}//私有化
 76     public static<T> int binarySearch(List<T> l,T key,Comparator<T> com)
 77     {
 78         int min = 0;
 79         int max = l.size()-1;
 80         int mid = 0;
 81         while(max >=min)
 82         {
 83             mid = (min+max) / 2;
 84             //判断比较器里面有没有!
 85             if(com.compare(key,l.get(mid))>0)//找到集合位置的值
 86                 min = mid+1;
 87             else if(com.compare(key, l.get(mid))<0)
 88                 max = mid-1;
 89             else
 90                 return mid;
 91         }
 92         
 93         //判断mid位置的元素和key的大小
 94         if(com.compare(key, l.get(mid))>0)
 95             return -mid-2;
 96         return -mid-1;
 97             
 98     }
 99 }
100 
101 2.必须要通过比较器比较才能实现二分查找:
102 
103 package com.javami.kudyAPI;
104 import java.util.ArrayList;
105 import java.util.Collections;
106 import java.util.Comparator;
107 
108 public class Test {
109     public static void main(String[]args)
110     {
111         ArrayList<String> al = new ArrayList<String>();
112         al.add("as");
113         al.add("scx");
114         al.add("dsad");
115         al.add("hellsda");
116         al.add("dsazxc");
117         al.add("dascxxc");
118         //在通过二分查找之前我们要经过排序'
119         System.out.println("还没有排序之前");
120         for(String s : al)
121             System.out.print(s+" ");
122         
123         
124         //第二部 : 当你调用二分查找之后.会调用比较器进行比较.是经过排序后的才可以进行二分查找
125         //比较器一定要传过来
126         int num = Collections.binarySearch(al, "dsaas",new Comparator<String>(){
127 
128             @Override
129             public int compare(String s1, String s2) {
130                 int num = s1.length() - s2.length();//比较长度
131                 if(num != 0)
132                     return num;
133                 return s1.compareTo(s2); //按字典顺序排
134             }
135             
136         });
137         System.out.println(num+1);
138     }
139 }
140 
141 
142 日期的应用:
143 
144 package com.javami.kudyAPI;
145 import java.util.Calendar;
146 public class CalendarTest {
147 
148     /**
149      * @param args
150      */
151 
152     public static void main(String[] args)
153     {
154         Calendar calendar = Calendar.getInstance();
155         printCalendar(calendar);
156         int nums = getDayNum(2012);
157         System.out.println(nums);
158         
159         //----------------
160         Calendar startDay = Calendar.getInstance();//获取当前的日历
161         Calendar finishDay = getFinishDay(startDay);
162         int num = finishDay.get(Calendar.DAY_OF_YEAR) - calendar.get(Calendar.DAY_OF_YEAR);
163         System.out.println(num+"天数");
164     }
165     
166     //计算出某年的2月份有多少天
167     public static int getDayNum(int year)
168     {
169         //1.获取一个日历
170         Calendar calendar = Calendar.getInstance();
171         
172         /*
173          * set(int year, int month, int date) 
174           设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
175          */
176         calendar.set(year,2,1); //2月份其实就是中国的三月
177         //日历字段  DAY_OF_YEAR获取到年中的月份  , -1  其实就是2月份
178         calendar.add(Calendar.DAY_OF_YEAR,-1);
179         return calendar.get(Calendar.DAY_OF_MONTH); //获取到二月份的天数
180     }
181     
182     //一个项目做100天,周末休息,五一和十一各休息一天,今天开始做,哪天完工
183     //一个项目做100天,周末休息,五一和十一各休息一天,今天开始做,哪天完工
184     public static Calendar getFinishDay(Calendar c) {
185         for(int i=0; i<100; i++) {
186             
187             //如果是星期六或者星期天(get 和 set 的字段数字,指示一个星期中的某天。)
188             if(c.get(Calendar.DAY_OF_WEEK)==1||c.get(Calendar.DAY_OF_WEEK)==7)
189                 i--;
190             //(get 和 set 的字段数字,指示一个月中的某天。)
191             else if(c.get(c.DAY_OF_MONTH)==1&&(c.get(c.MONTH)==4||c.get(c.MONTH)==9))
192                 i--;
193             c.add(Calendar.DAY_OF_YEAR, 1);
194         }
195         return c;
196     }
197     //代表是一个时间
198     public static void printCalendar(Calendar calendar)
199     {
200         int year = calendar.get(calendar.YEAR); //
201         int month = calendar.get(calendar.MONTH); //
202         int day = calendar.get(calendar.WEEK_OF_MONTH);//
203         int week = calendar.get(calendar.DAY_OF_WEEK);//星期
204         int hour = calendar.get(calendar.HOUR_OF_DAY); //时间
205         int minute = calendar.get(calendar.MINUTE);//
206             
207         String StringWeek = null;
208         switch(week)
209         {
210         
211             case 1:
212                     StringWeek = "星期天";
213                     break;
214             case 2:
215                     StringWeek = "星期一";
216                     break;
217             case 3:
218                     StringWeek = "星期二";
219                     break;
220             case 4:
221                     StringWeek = "星期三";
222                     break;
223             case 5:
224                     StringWeek = "星期四";
225                     break;
226             case 6:
227                     StringWeek = "星期五";
228                     break;
229             case 7:
230                     StringWeek = "星期六";
231                     break;
232         }
233         //并接成字符串
234         String str = ""+year+"-"+(month+1)+"-"+day+"-"+week+"-"+hour+"-"+minute;
235         System.out.println(str);
236     }
237 
238 
239 }

你可能感兴趣的:(javase_12(集合+时间对象))