1.List .add: it insert an element in the list on specified index
2.List .set: it overrides/replaces an element in the list on specified index
/***********List.add****************/
List<String> lstString=new List<String>{'A','B','C','D'};
System.debug('List elements='+lstString.add(2,'F'));
O/P= List elements={'A','B','F','C','D'}
/***********************************/
/***********List.set****************/
List<String> lstString=new List<String>{'A','B','C','D'};
System.debug('List elements='+lstString.set(2,'F'));
O/P= List elements={'A','B','F','D'}
/***********************************/
2.List .set: it overrides/replaces an element in the list on specified index
/***********List.add****************/
List<String> lstString=new List<String>{'A','B','C','D'};
System.debug('List elements='+lstString.add(2,'F'));
O/P= List elements={'A','B','F','C','D'}
/***********************************/
/***********List.set****************/
List<String> lstString=new List<String>{'A','B','C','D'};
System.debug('List elements='+lstString.set(2,'F'));
O/P= List elements={'A','B','F','D'}
/***********************************/