1 package cn.demo.jdk5;
2
3 import java.util.ArrayList;
4 import java.util.Arrays;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.LinkedList;
8 import java.util.List;
9 import java.util.Map;
10 import java.util.Set;
11 import java.util.TreeSet;
12 import java.util.Map.Entry;
13
14 import org.junit.Test;
15
16 public class GenericTest {
17 @Test
18 public void demo11() {
19 List<?> list = new ArrayList<String>(); // ? 代表任意类型
20 // list.add("aaa");
21 // list.add(111);
22 // 当使用通配符后,不要使用类型相关方法
23
24 List<? extends String> list2 = new ArrayList<String>();
25
26 List<? extends Number> list3 = new ArrayList<Integer>();
27
28 List<? super String> list4 = new ArrayList<Object>();
29 }
30
31 @Test
32 public void demo10() {
33 // 打印数组中所有元素内容
34 List<String> list = new LinkedList<String>();
35
36 list.add("aaa");
37 list.add("bbb");
38 list.add("ccc");
39 print(list);
40
41 List<Integer> list2 = new LinkedList<Integer>();
42
43 list2.add(111);
44 list2.add(222);
45 list2.add(333);
46
47 print(list2);
48 }
49
50 // ? 代表任意类型
51 public void print(List<?> list) { // 泛型类型 可以是任何类型 --- 泛型通配符
52 for (Object string : list) {
53 System.out.println(string);
54 }
55 }
56
57 @Test
58 public void demo9() {
59 // 测试 泛型类 使用
60 /*
61 * 在创建工具类对象时,使用泛型String, 这个工具类对象完成对String数组 倒序和 交换
62 */
63 ArraysUtils<String> arraysUtils = new ArraysUtils<String>();
64 String[] arr1 = { "aaa", "bbb", "ccc", "ddd" };
65 // 交换位置
66 arraysUtils.changePosition(arr1, 1, 3);
67 System.out.println(Arrays.toString(arr1));
68
69 // 倒序
70 arraysUtils.reverse(arr1);
71 System.out.println(Arrays.toString(arr1));
72 }
73
74 @Test
75 public void demo8() {
76 // 将数组元素 倒序
77 String[] arr1 = { "aaa", "bbb", "ccc", "ddd" }; // ddd ccc bbb aaa
78 reverse(arr1);
79 System.out.println(Arrays.toString(arr1));
80
81 Integer[] arr2 = { 1, 2, 3, 4, 5 }; // 倒序
82 reverse(arr2);
83 System.out.println(Arrays.toString(arr2));
84
85 }
86
87 // 将数组倒序
88 public <T> void reverse(T[] arr) {
89 /*
90 * 只需要遍历数组前一半元素,和后一半元素 对应元素 交换位置
91 */
92 for (int i = 0; i < arr.length / 2; i++) {
93 // String first = arr[i];
94 // String second = arr[arr.length - 1 - i];
95 T temp = arr[i];
96 arr[i] = arr[arr.length - 1 - i];
97 arr[arr.length - 1 - i] = temp;
98 }
99 }
100
101 @Test
102 public void demo7() {
103 Integer[] arr1 = new Integer[] { 1, 2, 3, 4, 5 };
104 // 交换数组 两个指定位置元素 将2,4 交换位置
105 changePosition(arr1, 1, 3); // 使用泛型方法 参数必须是对象类型
106
107 System.out.println(Arrays.toString(arr1));
108
109 String[] arr2 = new String[] { "aaa", "bbb", "ccc", "ddd" };
110 // 交换 aaa和 ccc的位置
111 changePosition(arr2, 0, 2);
112
113 System.out.println(Arrays.toString(arr2));
114
115 }
116
117 // 使用泛型 编写交换数组通用方法,类型可以String 可以 int --- 通过类型
118 public <T> void changePosition(T[] arr, int index1, int index2) {
119 T temp = arr[index1];
120 arr[index1] = arr[index2];
121 arr[index2] = temp;
122 }
123
124 // public void changePosition(String[] arr, int index1, int index2) {
125 // String temp = arr[index1];
126 // arr[index1] = arr[index2];
127 // arr[index2] = temp;
128 // }
129 //
130 // // 传递数组 传递数组引用地址 ---- 不需要返回值
131 // public void changePosition(int[] arr, int index1, int index2) {
132 // int temp = arr[index1];// 将第一个元素保存到temp
133 // arr[index1] = arr[index2]; // 将第二个元素值 赋值 给第一个元素
134 // arr[index2] = temp; // 将temp的值 保存第二个元素
135 // }
136
137 @Test
138 public void demo6() {
139 List<Integer> ints = new LinkedList<Integer>(); // 第一句 泛型 两端 一样的
140 // List<Number> nums = new LinkedList<Integer>(); // 第二句 Number是
141 // Integer的父类型 ,表达式两端泛型不一致,会导致编译错误
142
143 }
144
145 @Test
146 public void demo5() {
147 // 使用类型安全的Map -- 因为map是一个键值对结构,执行两个类型泛型
148 Map<String, String> map = new HashMap<String, String>();
149
150 map.put("aaa", "111");
151 map.put("bbb", "222");
152
153 // 因为使用了泛型,所以key和value类型都必须为String
154
155 // 取出map元素 ----- 两种
156 // 第一种 通过 Map 的 keySet进行遍历
157 Set<String> keys = map.keySet(); // 获得key集合
158 for (String key : keys) {
159 System.out.println(key + ":" + map.get(key));
160 }
161 System.out.println("-------------------------");
162
163 // 第二种 通过 map的 entrySet ---- 获得每一个键值对
164 Set<Map.Entry<String, String>> entrySet = map.entrySet(); // 每一个元素
165 // 就是一个键值对
166 for (Entry<String, String> entry : entrySet) {
167 // 通过 entry的 getKey和getValue获得每一个键和值
168 System.out.println(entry.getKey() + ":" + entry.getValue());
169 }
170
171 }
172
173 @Test
174 public void demo4() {
175 // 使用类型安全Set
176 Set<String> set = new TreeSet<String>();
177
178 set.add("asd");
179 set.add("fdf");
180 set.add("bxc");
181 // 因为使用泛型 只能添加String类型元素
182
183 // 取出Set元素 --- 两种 因为Set是无序的,所以比List少一种遍历方法
184 // 第一种 继承 Collection 所以使用 Iterator 遍历
185 Iterator<String> iterator = set.iterator();
186 while (iterator.hasNext()) {
187 String s = iterator.next();
188 System.out.println(s);
189 }
190 System.out.println("------------------------");
191 // 第二种 JDK5 引入 foreach 可以使用foreach 遍历 Set
192 for (String s : set) {
193 System.out.println(s);
194 }
195
196 }
197
198 @Test
199 public void demo3() {
200 // 使用类型安全List
201 List<String> list = new LinkedList<String>();
202
203 list.add("aaa");
204 list.add("bbb");
205 list.add("ccc");
206 // 因为使用泛型,只能将list添加 String类型 元素
207
208 // 遍历List --- 三种
209 // 第一种 因为List是有序的(存入顺序和取出顺序一样) 通过 size 和 get方法进行遍历
210 for (int i = 0; i < list.size(); i++) {
211 String s = list.get(i);
212 System.out.println(s);
213 }
214 System.out.println("---------------------------------------------");
215 // 第二种 因为List 继承 Collection 接口 ,通过 Collection的iterator进行遍历
216 Iterator<String> iterator = list.iterator();
217 // 遍历iterator 通过 迭代器 hasNext 和 next 方法进行遍历
218 while (iterator.hasNext()) {
219 String s = iterator.next();
220 System.out.println(s);
221 }
222 System.out.println("---------------------------------------------");
223
224 // 第三种 JDK5 引入 foreach循环 结构 ,通过foreach结构 遍历 list
225 for (String s : list) {
226 System.out.println(s);
227 }
228 System.out.println("----------------------------------------------");
229 }
230
231 @Test
232 public void demo2() {
233 // 应用泛型 集合
234 List<String> list = new ArrayList<String>(); // 这个list中只能存放 String 类型数据
235 // list.add(123); // 只能添加Strring
236 list.add("abc");
237 list.add("def");
238
239 // 取出集合数据
240 for (int i = 0; i < list.size(); i++) {
241 String s = list.get(i);
242 System.out.println(s.toUpperCase());
243 }
244 }
245
246 @Test
247 public void demo1() {
248 // JDK5 之前 集合对象
249 List list = new ArrayList();
250 // 因为没有泛型类型检查,添加对象可以是任意类型
251 list.add("abc");
252 list.add(123);
253
254 // 操作集合中对象,遍历集合 将数据取出来 通过 size()方法和 get(index)方法 遍历 list 集合
255 for (int i = 0; i < list.size(); i++) {
256 // 取出对象时,数据类型丢失了
257 Object o = list.get(i);
258 // 操作 String 方法 ---- 强制将数据转换 相应类型
259 String s = (String) o;
260 System.out.println(s.toUpperCase());
261 }
262 }
263
264 // public static void main(String[] args) {
265 // // 应用泛型 集合
266 // List<String> list = new ArrayList<String>(); // 这个list中只能存放 String 类型数据
267 // // list.add(123); // 只能添加Strring
268 // list.add("abc");
269 // list.add("def");
270 //
271 // // 取出集合数据
272 // for (int i = 0; i < list.size(); i++) {
273 // String s = list.get(i);
274 // System.out.println(s.toUpperCase());
275 // }
276 // }
277 }