package com.atguigu.genericclass.define;
class Student{
private String name;
private T score;
public Student() {
super();
}
public Student(String name, T score) {
super();
this.name = name;
this.score = score;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public T getScore() {
return score;
}
public void setScore(T score) {
this.score = score;
}
@Override
public String toString() {
return "姓名:" + name + ", 成绩:" + score;
}
}
public class TestStudent {
public static void main(String[] args) {
//语文老师使用时:
Student stu1 = new Student("张三", "良好");
//数学老师使用时:
//Student stu2 = new Student("张三", 90.5);//错误,必须是引用数据类型
Student stu2 = new Student("张三", 90.5);
//英语老师使用时:
Student stu3 = new Student("张三", 'C');
//错误的指定
//Student
练习2:
定义个泛型类 DAO,在其中定义一个Map 成员变量,Map 的键为 String 类型,值为 T 类型。
分别创建以下方法:
public void save(String id,T entity): 保存 T 类型的对象到 Map 成员变量中
public T get(String id):从 map 中获取 id 对应的对象
public void update(String id,T entity):替换 map 中key为id的内容,改为 entity 对象
public List list():返回 map 中存放的所有 T 对象
public void delete(String id):删除指定 id 对象
定义一个 User 类:
该类包含:private成员变量(int类型) id,age;(String 类型)name。
定义一个测试类:
创建 DAO 类的对象, 分别调用其 save、get、update、list、delete 方法来操作 User 对象,
使用 Junit 单元测试类进行测试。
代码实现:
/**
* @author 尚硅谷-宋红康
* @create 8:45
*/
public class DAO {
private Map map ;
{
map = new HashMap();
}
//保存 T 类型的对象到 Map 成员变量中
public void save(String id,T entity){
if(!map.containsKey(id)){
map.put(id,entity);
}
}
//从 map 中获取 id 对应的对象
public T get(String id){
return map.get(id);
}
//替换 map 中key为id的内容,改为 entity 对象
public void update(String id,T entity){
if(map.containsKey(id)){
map.put(id,entity);
}
}
//返回 map 中存放的所有 T 对象
public List list(){
//错误的:
// Collection values = map.values();
// System.out.println(values.getClass());
// return (List) values;
//正确的方式1:
// ArrayList list = new ArrayList<>();
// Collection values = map.values();
// list.addAll(values);
// return list;
//正确的方式2:
Collection values = map.values();
ArrayList list = new ArrayList<>(values);
return list;
}
//删除指定 id 对象
public void delete(String id){
map.remove(id);
}
}
package com.atguigu02.selfdefine.exer1;
import java.util.Objects;
/**
* 定义一个 User 类:
* 该类包含:private成员变量(int类型) id,age;(String 类型)name。
*
* @author 尚硅谷-宋红康
* @create 9:02
*/
public class User {
private int id;
private int age;
private String name;
public User() {
}
public User(int id, int age, String name) {
this.id = id;
this.age = age;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return id == user.id && age == user.age && Objects.equals(name, user.name);
}
@Override
public int hashCode() {
return Objects.hash(id, age, name);
}
}
package com.atguigu02.selfdefine.exer1;
import java.util.List;
/**
* @author 尚硅谷-宋红康
* @create 9:04
*/
public class DAOTest {
public static void main(String[] args) {
DAO dao = new DAO<>();
dao.save("1001",new User(1,34,"曹操"));
dao.save("1002",new User(2,33,"刘备"));
dao.save("1003",new User(3,24,"孙权"));
dao.update("1002",new User(2,23,"刘禅"));
dao.delete("1003");
List list = dao.list();
for(User u : list){
System.out.println(u);
}
}
}
public class DAO {
public E get(int id, E e) {
E result = null;
return result;
}
}
举例2:
public static void fromArrayToCollection(T[] a, Collection c) {
for (T o : a) {
c.add(o);
}
}
public static void main(String[] args) {
Object[] ao = new Object[100];
Collection
举例3:
class MyArrays {
public static void sort(T[] arr){
for (int i = 1; i < arr.length; i++) {
for (int j = 0; j < arr.length-i; j++) {
if(((Comparable)arr[j]).compareTo(arr[j+1])>0){
T temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
}
public class MyArraysTest {
public static void main(String[] args) {
int[] arr = {3,2,5,1,4};
// MyArrays.sort(arr);//错误的,因为int[]不是对象数组
String[] strings = {"hello","java","song"};
MyArrays.sort(strings);
System.out.println(Arrays.toString(strings));
Circle[] circles = {new Circle(2.0),new Circle(1.2),new Circle(3.0)};
MyArrays.sort(circles); //编译通过,运行报错,因为Circle没有实现Comparable接口
}
}
3.3.3 练习
练习1: 泛型方法
编写一个泛型方法,实现任意引用类型数组指定位置元素交换。
public static void method1( E[] e,int a,int b)
/**
* @author 尚硅谷-宋红康
* @create 9:11
*/
public class Exer01 {
//编写一个泛型方法,实现任意引用类型数组指定位置元素交换。
public static void method( E[] arr,int a,int b){
E temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
@Test
public void testMethod(){
Integer[] arr = new Integer[]{10,20,30,40};
method(arr,2,3);
for(Integer i : arr){
System.out.println(i);
}
}
}
练习2: 泛型方法
编写一个泛型方法,接收一个任意引用类型的数组,并反转数组中的所有元素
public static void method2( E[] e)
/**
* @author 尚硅谷-宋红康
* @create 9:11
*/
public class Exer01 {
//编写一个泛型方法,接收一个任意引用类型的数组,并反转数组中的所有元素
public static void method1( E[] arr){
for(int min = 0,max = arr.length - 1;min < max; min++,max--){
E temp = arr[min];
arr[min] = arr[max];
arr[max] = temp;
}
}
@Test
public void testMethod1(){
Integer[] arr = new Integer[]{10,20,30,40};
method1(arr);
for(Integer i : arr){
System.out.println(i);
}
}
}
另一方面,读取List>的对象list中的元素时,永远是安全的,因为不管 list 的真实类型是什么,它包含的都是Object。
举例1:
public class TestWildcard {
public static void m4(Collection> coll){
for (Object o : coll) {
System.out.println(o);
}
}
}
举例2:
public static void main(String[] args) {
List> list = null;
list = new ArrayList();
list = new ArrayList();
// list.add(3);//编译不通过
list.add(null);
List l1 = new ArrayList();
List l2 = new ArrayList();
l1.add("尚硅谷");
l2.add(15);
read(l1);
read(l2);
}
public static void read(List> list) {
for (Object o : list) {
System.out.println(o);
}
}
class Creature{}
class Person extends Creature{}
class Man extends Person{}
class PersonTest {
public static void test(T t){
System.out.println(t);
}
public static void main(String[] args) {
test(new Person());
test(new Man());
//The method test(T) in the type PersonTest is not
//applicable for the arguments (Creature)
test(new Creature());
}
}
举例2:
public static void main(String[] args) {
Collection list1 = new ArrayList();
Collection list2 = new ArrayList();
Collection list3 = new ArrayList();
Collection list4 = new ArrayList();
getElement1(list1);
getElement1(list2);//报错
getElement1(list3);
getElement1(list4);//报错
getElement2(list1);//报错
getElement2(list2);//报错
getElement2(list3);
getElement2(list4);
}
// 泛型的上限:此时的泛型?,必须是Number类型或者Number类型的子类
public static void getElement1(Collection extends Number> coll){}
// 泛型的下限:此时的泛型?,必须是Number类型或者Number类型的父类
public static void getElement2(Collection super Number> coll){}
举例3:
public static void printCollection1(Collection extends Person> coll) {
//Iterator只能用Iterator>或Iterator extends Person>.why?
Iterator> iterator = coll.iterator();
while (iterator.hasNext()) {
Person per = iterator.next();
System.out.println(per);
}
}
public static void printCollection2(Collection super Person> coll) {
//Iterator只能用Iterator>或Iterator super Person>.why?
Iterator> iterator = coll.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println(obj);
}
}
举例4:
@Test
public void test1(){
//List list1 = null;
List list2 = new ArrayList();
//List list3 = null;
List extends Person> list4 = null;
list2.add(new Person());
list4 = list2;
//读取:可以读
Person p1 = list4.get(0);
//写入:除了null之外,不能写入
list4.add(null);
// list4.add(new Person());
// list4.add(new Student());
}
@Test
public void test2(){
//List list1 = null;
List list2 = new ArrayList();
//List list3 = null;
List super Person> list5 = null;
list2.add(new Person());
list5 = list2;
//读取:可以实现
Object obj = list5.get(0);
//写入:可以写入Person及Person子类的对象
list5.add(new Person());
list5.add(new Student());
}
5.5 泛型应用举例
举例1:泛型嵌套
public static void main(String[] args) {
HashMap> map = new HashMap>();
ArrayList list = new ArrayList();
list.add(new Citizen("赵又廷"));
list.add(new Citizen("高圆圆"));
list.add(new Citizen("瑞亚"));
map.put("赵又廷", list);
Set>> entrySet = map.entrySet();
Iterator>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Entry> entry = iterator.next();
String key = entry.getKey();
ArrayList value = entry.getValue();
System.out.println("户主:" + key);
System.out.println("家庭成员:" + value);
}
}
.oracle层次查询(connect by)
oracle的emp表中包含了一列mgr指出谁是雇员的经理,由于经理也是雇员,所以经理的信息也存储在emp表中。这样emp表就是一个自引用表,表中的mgr列是一个自引用列,它指向emp表中的empno列,mgr表示一个员工的管理者,
select empno,mgr,ename,sal from e
SAPHANA平台有各种各样的应用场景,这也意味着客户的实施方法有许多种选择,关键是如何挑选最适合他们需求的实施方案。
在 《Implementing SAP HANA》这本书中,介绍了SAP平台在现实场景中的运作原理,并给出了实施建议和成功案例供参考。本系列文章节选自《Implementing SAP HANA》,介绍了行存储和列存储的各自特点,以及SAP HANA的数据存储方式如何提升空间压
学习Java有没有什么捷径?要想学好Java,首先要知道Java的大致分类。自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE
JSF 2.0 introduced annotation @ViewScoped; A bean annotated with this scope maintained its state as long as the user stays on the same view(reloads or navigation - no intervening views). One problem w
很多文档说Zookeeper是强一致性保证,事实不然。关于一致性模型请参考http://bit1129.iteye.com/blog/2155336
Zookeeper的数据同步协议
Zookeeper采用称为Quorum Based Protocol的数据同步协议。假如Zookeeper集群有N台Zookeeper服务器(N通常取奇数,3台能够满足数据可靠性同时
Spring Security提供了一个实现了可以缓存UserDetails的UserDetailsService实现类,CachingUserDetailsService。该类的构造接收一个用于真正加载UserDetails的UserDetailsService实现类。当需要加载UserDetails时,其首先会从缓存中获取,如果缓存中没